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.

llvm-svn: 202083
This commit is contained in:
Simon Atanasyan 2014-02-24 22:12:11 +00:00
parent 6a162d850b
commit 2b614e1163
4 changed files with 34 additions and 3 deletions

View File

@ -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

View File

@ -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

View 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();