mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202083 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e5f1c6d3da
commit
341d0f4b9e
BIN
test/tools/llvm-objdump/Inputs/out-of-section-sym.elf-i386
Normal file
BIN
test/tools/llvm-objdump/Inputs/out-of-section-sym.elf-i386
Normal file
Binary file not shown.
15
test/tools/llvm-objdump/Inputs/out-of-section-sym.s
Normal file
15
test/tools/llvm-objdump/Inputs/out-of-section-sym.s
Normal 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
|
13
test/tools/llvm-objdump/out-of-section-sym.test
Normal file
13
test/tools/llvm-objdump/out-of-section-sym.test
Normal 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
|
@ -405,6 +405,10 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
|
|||||||
if (error(I->getAddress(SectionAddr)))
|
if (error(I->getAddress(SectionAddr)))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
uint64_t SectSize;
|
||||||
|
if (error(I->getSize(SectSize)))
|
||||||
|
break;
|
||||||
|
|
||||||
// Make a list of all the symbols in this section.
|
// Make a list of all the symbols in this section.
|
||||||
std::vector<std::pair<uint64_t, StringRef> > Symbols;
|
std::vector<std::pair<uint64_t, StringRef> > Symbols;
|
||||||
for (symbol_iterator SI = Obj->symbol_begin(), SE = Obj->symbol_end();
|
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)
|
if (Address == UnknownAddressOrSize)
|
||||||
continue;
|
continue;
|
||||||
Address -= SectionAddr;
|
Address -= SectionAddr;
|
||||||
|
if (Address >= SectSize)
|
||||||
|
continue;
|
||||||
|
|
||||||
StringRef Name;
|
StringRef Name;
|
||||||
if (error(SI->getName(Name)))
|
if (error(SI->getName(Name)))
|
||||||
@ -473,9 +479,6 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
|
|||||||
StringRefMemoryObject memoryObject(Bytes, SectionAddr);
|
StringRefMemoryObject memoryObject(Bytes, SectionAddr);
|
||||||
uint64_t Size;
|
uint64_t Size;
|
||||||
uint64_t Index;
|
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_cur = Rels.begin();
|
||||||
std::vector<RelocationRef>::const_iterator rel_end = Rels.end();
|
std::vector<RelocationRef>::const_iterator rel_end = Rels.end();
|
||||||
|
Loading…
Reference in New Issue
Block a user