diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Object/COFFObjectFile.cpp | 55 | ||||
| -rw-r--r-- | llvm/lib/Object/MachOObjectFile.cpp | 52 | ||||
| -rw-r--r-- | llvm/test/Object/Inputs/macho-invalid-getsection-index | bin | 316 -> 0 bytes | |||
| -rw-r--r-- | llvm/test/Object/Inputs/macho64-invalid-getsection-index | bin | 4536 -> 0 bytes | |||
| -rw-r--r-- | llvm/test/Object/macho-invalid.test | 9 | ||||
| -rw-r--r-- | llvm/test/Object/objdump-symbol-table.test | 2 | ||||
| -rw-r--r-- | llvm/test/tools/llvm-objdump/X86/macho-symbol-table.test | 8 |
7 files changed, 14 insertions, 112 deletions
diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp index d4f3b430614..74709c88ba2 100644 --- a/llvm/lib/Object/COFFObjectFile.cpp +++ b/llvm/lib/Object/COFFObjectFile.cpp @@ -240,59 +240,10 @@ std::error_code COFFObjectFile::getSymbolSize(DataRefImpl Ref, uint64_t &Result) const { COFFSymbolRef Symb = getCOFFSymbol(Ref); - if (Symb.isAnyUndefined()) { - Result = UnknownAddressOrSize; - return object_error::success; - } - if (Symb.isCommon()) { + if (Symb.isCommon()) Result = Symb.getValue(); - return object_error::success; - } - - // Let's attempt to get the size of the symbol by looking at the address of - // the symbol after the symbol in question. - uint64_t SymbAddr; - if (std::error_code EC = getSymbolAddress(Ref, SymbAddr)) - return EC; - int32_t SectionNumber = Symb.getSectionNumber(); - if (COFF::isReservedSectionNumber(SectionNumber)) { - // Absolute and debug symbols aren't sorted in any interesting way. - Result = 0; - return object_error::success; - } - const section_iterator SecEnd = section_end(); - uint64_t AfterAddr = UnknownAddressOrSize; - for (const symbol_iterator SymbI : symbols()) { - section_iterator SecI = SecEnd; - if (std::error_code EC = SymbI->getSection(SecI)) - return EC; - // Check the symbol's section, skip it if it's in the wrong section. - // First, make sure it is in any section. - if (SecI == SecEnd) - continue; - // Second, make sure it is in the same section as the symbol in question. - if (!sectionContainsSymbol(SecI->getRawDataRefImpl(), Ref)) - continue; - uint64_t Addr; - if (std::error_code EC = SymbI->getAddress(Addr)) - return EC; - // We want to compare our symbol in question with the closest possible - // symbol that comes after. - if (AfterAddr > Addr && Addr > SymbAddr) - AfterAddr = Addr; - } - if (AfterAddr == UnknownAddressOrSize) { - // No symbol comes after this one, assume that everything after our symbol - // is part of it. - const coff_section *Section = nullptr; - if (std::error_code EC = getSection(SectionNumber, Section)) - return EC; - Result = Section->SizeOfRawData - Symb.getValue(); - } else { - // Take the difference between our symbol and the symbol that comes after - // our symbol. - Result = AfterAddr - SymbAddr; - } + else + Result = UnknownAddressOrSize; return object_error::success; } diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp index 504b3172c9d..79f81006498 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -415,49 +415,13 @@ std::error_code MachOObjectFile::getSymbolAlignment(DataRefImpl DRI, std::error_code MachOObjectFile::getSymbolSize(DataRefImpl DRI, uint64_t &Result) const { - uint64_t BeginOffset; - uint64_t EndOffset = 0; - uint8_t SectionIndex; - - MachO::nlist_base Entry = getSymbolTableEntryBase(this, DRI); uint64_t Value; getSymbolAddress(DRI, Value); - if (Value == UnknownAddressOrSize) { + uint32_t flags = getSymbolFlags(DRI); + if (flags & SymbolRef::SF_Common) + Result = Value; + else Result = UnknownAddressOrSize; - return object_error::success; - } - - BeginOffset = Value; - - SectionIndex = Entry.n_sect; - if (!SectionIndex) { - uint32_t flags = getSymbolFlags(DRI); - if (flags & SymbolRef::SF_Common) - Result = Value; - else - Result = UnknownAddressOrSize; - return object_error::success; - } - // Unfortunately symbols are unsorted so we need to touch all - // symbols from load command - for (const SymbolRef &Symbol : symbols()) { - DataRefImpl DRI = Symbol.getRawDataRefImpl(); - Entry = getSymbolTableEntryBase(this, DRI); - getSymbolAddress(DRI, Value); - if (Value == UnknownAddressOrSize) - continue; - if (Entry.n_sect == SectionIndex && Value > BeginOffset) - if (!EndOffset || Value < EndOffset) - EndOffset = Value; - } - if (!EndOffset) { - DataRefImpl Sec; - Sec.d.a = SectionIndex-1; - uint64_t Size = getSectionSize(Sec); - EndOffset = getSectionAddress(Sec); - EndOffset += Size; - } - Result = EndOffset - BeginOffset; return object_error::success; } @@ -2263,16 +2227,12 @@ MachOObjectFile::getNextLoadCommandInfo(const LoadCommandInfo &L) const { } MachO::section MachOObjectFile::getSection(DataRefImpl DRI) const { - // TODO: What if Sections.size() == 0? - if (DRI.d.a >= Sections.size()) - report_fatal_error("getSection: Invalid section index."); + assert(DRI.d.a < Sections.size() && "Should have detected this earlier"); return getStruct<MachO::section>(this, Sections[DRI.d.a]); } MachO::section_64 MachOObjectFile::getSection64(DataRefImpl DRI) const { - // TODO: What if Sections.size() == 0? - if (DRI.d.a >= Sections.size()) - report_fatal_error("getSection64: Invalid section index."); + assert(DRI.d.a < Sections.size() && "Should have detected this earlier"); return getStruct<MachO::section_64>(this, Sections[DRI.d.a]); } diff --git a/llvm/test/Object/Inputs/macho-invalid-getsection-index b/llvm/test/Object/Inputs/macho-invalid-getsection-index Binary files differdeleted file mode 100644 index b7e4b95bc9b..00000000000 --- a/llvm/test/Object/Inputs/macho-invalid-getsection-index +++ /dev/null diff --git a/llvm/test/Object/Inputs/macho64-invalid-getsection-index b/llvm/test/Object/Inputs/macho64-invalid-getsection-index Binary files differdeleted file mode 100644 index a2a7bc10c4f..00000000000 --- a/llvm/test/Object/Inputs/macho64-invalid-getsection-index +++ /dev/null diff --git a/llvm/test/Object/macho-invalid.test b/llvm/test/Object/macho-invalid.test index dae5c4eda7e..e2c9b6b7360 100644 --- a/llvm/test/Object/macho-invalid.test +++ b/llvm/test/Object/macho-invalid.test @@ -28,13 +28,6 @@ RUN: | FileCheck -check-prefix NAME-PAST-EOF %s RUN: not llvm-nm %p/Inputs/macho-invalid-section-index-getSectionRawName 2>&1 \ RUN: | FileCheck -check-prefix INVALID-SECTION-IDX-SYMBOL-SEC %s -RUN: not llvm-objdump -t %p/Inputs/macho-invalid-getsection-index 2>&1 \ -RUN: | FileCheck -check-prefix INVALID-SECTION-IDX-GETSECT %s - -RUN: not llvm-objdump -t %p/Inputs/macho64-invalid-getsection-index 2>&1 \ -RUN: | FileCheck -check-prefix INVALID-SECTION-IDX-GETSECT64 %s - - SMALL-LOADC-SIZE: Load command with size < 8 bytes SMALL-SEGLOADC-SIZE: Segment load command size is too small INCOMPLETE-LOADC: Malformed MachO file @@ -43,5 +36,3 @@ BAD-SYMBOL: Requested symbol index is out of range NAME-PAST-EOF: Symbol name entry points before beginning or past end of file INVALID-SECTION-IDX-SYMBOL-SEC: getSymbolSection: Invalid section index -INVALID-SECTION-IDX-GETSECT: getSection: Invalid section index -INVALID-SECTION-IDX-GETSECT64: getSection64: Invalid section index diff --git a/llvm/test/Object/objdump-symbol-table.test b/llvm/test/Object/objdump-symbol-table.test index 07109176638..3d09e1a45f3 100644 --- a/llvm/test/Object/objdump-symbol-table.test +++ b/llvm/test/Object/objdump-symbol-table.test @@ -30,7 +30,7 @@ ELF-i386: 00000000 *UND* 00000000 puts macho-i386: trivial-object-test.macho-i386: file format Mach-O 32-bit i386 macho-i386: SYMBOL TABLE: -macho-i386: 00000000 g F __TEXT,__text 00000024 _main +macho-i386: 00000000 g F __TEXT,__text 00000000 _main macho-i386: 00000000 *UND* 00000000 _SomeOtherFunction macho-i386: 00000000 *UND* 00000000 _puts diff --git a/llvm/test/tools/llvm-objdump/X86/macho-symbol-table.test b/llvm/test/tools/llvm-objdump/X86/macho-symbol-table.test index 5b9a4f84976..3fe5aea6c37 100644 --- a/llvm/test/tools/llvm-objdump/X86/macho-symbol-table.test +++ b/llvm/test/tools/llvm-objdump/X86/macho-symbol-table.test @@ -1,8 +1,8 @@ RUN: llvm-objdump -macho -t %p/Inputs/hello.obj.macho-x86_64 | FileCheck %s CHECK: SYMBOL TABLE: -CHECK: 000000000000003b l F __TEXT,__cstring 0000000d L_.str -CHECK: 0000000000000068 l F __TEXT,__eh_frame 00000018 EH_frame0 -CHECK: 0000000000000000 g F __TEXT,__text 0000003b _main -CHECK: 0000000000000080 g F __TEXT,__eh_frame 00000028 _main.eh +CHECK: 000000000000003b l F __TEXT,__cstring 00000000 L_.str +CHECK: 0000000000000068 l F __TEXT,__eh_frame 00000000 EH_frame0 +CHECK: 0000000000000000 g F __TEXT,__text 00000000 _main +CHECK: 0000000000000080 g F __TEXT,__eh_frame 00000000 _main.eh CHECK: 0000000000000000 *UND* 00000000 _printf |

