From 341d0f4b9e8219024093a9cc35dd7b321eaaa0f1 Mon Sep 17 00:00:00 2001 From: Simon Atanasyan Date: Mon, 24 Feb 2014 22:12:11 +0000 Subject: [PATCH] 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 --- .../Inputs/out-of-section-sym.elf-i386 | Bin 0 -> 4450 bytes .../llvm-objdump/Inputs/out-of-section-sym.s | 15 +++++++++++++++ test/tools/llvm-objdump/out-of-section-sym.test | 13 +++++++++++++ tools/llvm-objdump/llvm-objdump.cpp | 9 ++++++--- 4 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 test/tools/llvm-objdump/Inputs/out-of-section-sym.elf-i386 create mode 100644 test/tools/llvm-objdump/Inputs/out-of-section-sym.s create mode 100644 test/tools/llvm-objdump/out-of-section-sym.test 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 index 0000000000000000000000000000000000000000..4c7158498bafc61a979c0bcb6f5f94e970c2c73c GIT binary patch literal 4450 zcmeI0Arits3`NtHGN5P;1_KU-;tHTDxIt$bU@(|=1t<>3wGjNDHcTxJk<6q&Kby3j zC-=Fl_DPb6MJk!l704}<1yz>luO*kXJ4c^KOwKcNq&BD?PQVE`0Vm)DoPZN>0#3jQ zH~}Z%1f0O%5_rj`ecWO=LSxhE)v9>D#~=QDfmz-QjFEa*fCs(Bs4q%rW=&{`xz)hi z4mBP0-u}|ZcX5qNJaraQ&p>8>NbWZ MN_{zn7$C~)1MCMGJOBUy literal 0 HcmV?d00001 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 index 00000000000..9a1349c426f --- /dev/null +++ b/test/tools/llvm-objdump/Inputs/out-of-section-sym.s @@ -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 index 00000000000..f70dce6a8ed --- /dev/null +++ b/test/tools/llvm-objdump/out-of-section-sym.test @@ -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 diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index 8d934cf9485..d8460fdb247 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -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 > 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::const_iterator rel_cur = Rels.begin(); std::vector::const_iterator rel_end = Rels.end();