diff options
| -rw-r--r-- | llvm/test/tools/llvm-objdump/Inputs/out-of-section-sym.elf-i386 | bin | 0 -> 4450 bytes | |||
| -rw-r--r-- | llvm/test/tools/llvm-objdump/Inputs/out-of-section-sym.s | 15 | ||||
| -rw-r--r-- | llvm/test/tools/llvm-objdump/out-of-section-sym.test | 13 | ||||
| -rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 9 |
4 files changed, 34 insertions, 3 deletions
diff --git a/llvm/test/tools/llvm-objdump/Inputs/out-of-section-sym.elf-i386 b/llvm/test/tools/llvm-objdump/Inputs/out-of-section-sym.elf-i386 Binary files differnew file mode 100644 index 00000000000..4c7158498ba --- /dev/null +++ b/llvm/test/tools/llvm-objdump/Inputs/out-of-section-sym.elf-i386 diff --git a/llvm/test/tools/llvm-objdump/Inputs/out-of-section-sym.s b/llvm/test/tools/llvm-objdump/Inputs/out-of-section-sym.s new file mode 100644 index 00000000000..9a1349c426f --- /dev/null +++ b/llvm/test/tools/llvm-objdump/Inputs/out-of-section-sym.s @@ -0,0 +1,15 @@ +// $ cat out-of-section-sym.ld +// SECTIONS +// { +// . = 0x10; +// .text : { _ftext = . ; *(.text) } +// . = 0x20; +// .data : { _fdata = . ; *(.data) } +// } +// as --32 out-of-section-sym.s -o out-of-section-sym.o +// ld -m elf_i386 -Tout-of-section-sym.ld -o out-of-section-sym.elf-i386 \ +// out-of-section-sym.o + +.text +_start: + ret diff --git a/llvm/test/tools/llvm-objdump/out-of-section-sym.test b/llvm/test/tools/llvm-objdump/out-of-section-sym.test new file mode 100644 index 00000000000..f70dce6a8ed --- /dev/null +++ b/llvm/test/tools/llvm-objdump/out-of-section-sym.test @@ -0,0 +1,13 @@ +// Check that llvm-objdump does not attempt to disassemble symbols outside +// of section boundaries. +// RUN: llvm-objdump -d -t %p/Inputs/out-of-section-sym.elf-i386 | FileCheck %s + +CHECK: Disassembly of section .text: +CHECK-NEXT: _start: +CHECK-NEXT: 10: c3 retl +CHECK-NEXT: SYMBOL TABLE: +CHECK-NEXT: 00000000 *UND* 00000000 +CHECK-NEXT: 00000010 l d .text 00000000 .text +CHECK-NEXT: 00000010 .text 00000000 _start +CHECK-NEXT: 00000020 .text 00000000 _fdata +CHECK-NEXT: 00000010 .text 00000000 _ftext diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 8d934cf9485..d8460fdb247 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -405,6 +405,10 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { if (error(I->getAddress(SectionAddr))) break; + uint64_t SectSize; + if (error(I->getSize(SectSize))) + break; + // Make a list of all the symbols in this section. std::vector<std::pair<uint64_t, StringRef> > Symbols; for (symbol_iterator SI = Obj->symbol_begin(), SE = Obj->symbol_end(); @@ -417,6 +421,8 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { if (Address == UnknownAddressOrSize) continue; Address -= SectionAddr; + if (Address >= SectSize) + continue; StringRef Name; if (error(SI->getName(Name))) @@ -473,9 +479,6 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { StringRefMemoryObject memoryObject(Bytes, SectionAddr); uint64_t Size; uint64_t Index; - uint64_t SectSize; - if (error(I->getSize(SectSize))) - break; std::vector<RelocationRef>::const_iterator rel_cur = Rels.begin(); std::vector<RelocationRef>::const_iterator rel_end = Rels.end(); |

