summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/test/tools/llvm-objdump/Inputs/out-of-section-sym.elf-i386bin0 -> 4450 bytes
-rw-r--r--llvm/test/tools/llvm-objdump/Inputs/out-of-section-sym.s15
-rw-r--r--llvm/test/tools/llvm-objdump/out-of-section-sym.test13
-rw-r--r--llvm/tools/llvm-objdump/llvm-objdump.cpp9
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
new file mode 100644
index 00000000000..4c7158498ba
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/Inputs/out-of-section-sym.elf-i386
Binary files differ
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();
OpenPOWER on IntegriCloud