[llvm] r202083 - llvm-objdump: Do not attempt to disassemble symbols outside of section

Simon Atanasyan simon at atanasyan.com
Mon Feb 24 14:12:11 PST 2014


Author: atanasyan
Date: Mon Feb 24 16:12:11 2014
New Revision: 202083

URL: http://llvm.org/viewvc/llvm-project?rev=202083&view=rev
Log:
llvm-objdump: Do not attempt to disassemble symbols outside of section
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.

Added:
    llvm/trunk/test/tools/llvm-objdump/Inputs/out-of-section-sym.elf-i386
    llvm/trunk/test/tools/llvm-objdump/Inputs/out-of-section-sym.s
    llvm/trunk/test/tools/llvm-objdump/out-of-section-sym.test
Modified:
    llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp

Added: llvm/trunk/test/tools/llvm-objdump/Inputs/out-of-section-sym.elf-i386
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/Inputs/out-of-section-sym.elf-i386?rev=202083&view=auto
==============================================================================
Binary files llvm/trunk/test/tools/llvm-objdump/Inputs/out-of-section-sym.elf-i386 (added) and llvm/trunk/test/tools/llvm-objdump/Inputs/out-of-section-sym.elf-i386 Mon Feb 24 16:12:11 2014 differ

Added: llvm/trunk/test/tools/llvm-objdump/Inputs/out-of-section-sym.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/Inputs/out-of-section-sym.s?rev=202083&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objdump/Inputs/out-of-section-sym.s (added)
+++ llvm/trunk/test/tools/llvm-objdump/Inputs/out-of-section-sym.s Mon Feb 24 16:12:11 2014
@@ -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

Added: llvm/trunk/test/tools/llvm-objdump/out-of-section-sym.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/out-of-section-sym.test?rev=202083&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objdump/out-of-section-sym.test (added)
+++ llvm/trunk/test/tools/llvm-objdump/out-of-section-sym.test Mon Feb 24 16:12:11 2014
@@ -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

Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp?rev=202083&r1=202082&r2=202083&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp (original)
+++ llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp Mon Feb 24 16:12:11 2014
@@ -405,6 +405,10 @@ static void DisassembleObject(const Obje
     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 Obje
         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 Obje
     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();





More information about the llvm-commits mailing list