summaryrefslogtreecommitdiff
path: root/tools/llvm-objdump
diff options
context:
space:
mode:
authorSimon Atanasyan <simon@atanasyan.com>2014-02-24 22:12:11 +0000
committerSimon Atanasyan <simon@atanasyan.com>2014-02-24 22:12:11 +0000
commit341d0f4b9e8219024093a9cc35dd7b321eaaa0f1 (patch)
treee552d8cb0d9ef9f1485e8e308d849bf5f5d4138c /tools/llvm-objdump
parente5f1c6d3dae658cbdd19bf3ab5eea0573c95a531 (diff)
downloadllvm-341d0f4b9e8219024093a9cc35dd7b321eaaa0f1.tar.gz
llvm-341d0f4b9e8219024093a9cc35dd7b321eaaa0f1.tar.bz2
llvm-341d0f4b9e8219024093a9cc35dd7b321eaaa0f1.tar.xz
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
Diffstat (limited to 'tools/llvm-objdump')
-rw-r--r--tools/llvm-objdump/llvm-objdump.cpp9
1 files changed, 6 insertions, 3 deletions
diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp
index 8d934cf948..d8460fdb24 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<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();