[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