llvm-objdump: Do not attempt to disassemble symbols outside of section
authorSimon Atanasyan <simon@atanasyan.com>
Mon, 24 Feb 2014 22:12:11 +0000 (22:12 +0000)
committerSimon Atanasyan <simon@atanasyan.com>
Mon, 24 Feb 2014 22:12:11 +0000 (22:12 +0000)
boundaries.

It is possible to create an ELF executable where symbol from say .text
section 'points' to the address outside the section boundaries. It does
not have a sense to disassemble something outside the section.

Without this fix llvm-objdump prints finite or infinite (depends on
the executable file architecture) number of 'invalid instruction
encoding' warnings.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202083 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/llvm-objdump/Inputs/out-of-section-sym.elf-i386 [new file with mode: 0644]
test/tools/llvm-objdump/Inputs/out-of-section-sym.s [new file with mode: 0644]
test/tools/llvm-objdump/out-of-section-sym.test [new file with mode: 0644]
tools/llvm-objdump/llvm-objdump.cpp

diff --git a/test/tools/llvm-objdump/Inputs/out-of-section-sym.elf-i386 b/test/tools/llvm-objdump/Inputs/out-of-section-sym.elf-i386
new file mode 100644 (file)
index 0000000..4c71584
Binary files /dev/null and b/test/tools/llvm-objdump/Inputs/out-of-section-sym.elf-i386 differ
diff --git a/test/tools/llvm-objdump/Inputs/out-of-section-sym.s b/test/tools/llvm-objdump/Inputs/out-of-section-sym.s
new file mode 100644 (file)
index 0000000..9a1349c
--- /dev/null
@@ -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/test/tools/llvm-objdump/out-of-section-sym.test b/test/tools/llvm-objdump/out-of-section-sym.test
new file mode 100644 (file)
index 0000000..f70dce6
--- /dev/null
@@ -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
index 8d934cf94854a28e6d2ecc318828a6bfab6d35a7..d8460fdb247db86f9cd0f1e5cf71cccffae18acf 100644 (file)
@@ -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();