aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-objdump/llvm-objdump.cpp
diff options
context:
space:
mode:
authorYuanfang Chen <yuanfang.chen@sony.com>2019-06-24 17:47:56 +0000
committerYuanfang Chen <yuanfang.chen@sony.com>2019-06-24 17:47:56 +0000
commit6e04b92c896ca37f0fa822de130400f46e9fc908 (patch)
treec94b09214786d463a29fa4b803af592f38cda305 /llvm/tools/llvm-objdump/llvm-objdump.cpp
parent9c01eaff6aa3f59d91530f47b85bb470377a7780 (diff)
downloadllvm-6e04b92c896ca37f0fa822de130400f46e9fc908.zip
llvm-6e04b92c896ca37f0fa822de130400f46e9fc908.tar.gz
llvm-6e04b92c896ca37f0fa822de130400f46e9fc908.tar.bz2
[llvm-objdump] Match GNU objdump on symbol types shown in disassembly
output. STT_OBJECT and STT_COMMON are dumped as data, not disassembled. https://bugs.llvm.org/show_bug.cgi?id=41947 Differential Revision: https://reviews.llvm.org/D62964 llvm-svn: 364211
Diffstat (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp')
-rw-r--r--llvm/tools/llvm-objdump/llvm-objdump.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 907e6ed..e4fbb50 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -857,10 +857,15 @@ addDynamicElfSymbols(const ELFObjectFile<ELFT> *Obj,
std::map<SectionRef, SectionSymbolsTy> &AllSymbols) {
for (auto Symbol : Obj->getDynamicSymbolIterators()) {
uint8_t SymbolType = Symbol.getELFType();
- if (SymbolType != ELF::STT_FUNC || Symbol.getSize() == 0)
+ if (SymbolType == ELF::STT_SECTION)
continue;
uint64_t Address = unwrapOrError(Symbol.getAddress(), Obj->getFileName());
+ // ELFSymbolRef::getAddress() returns size instead of value for common
+ // symbols which is not desirable for disassembly output. Overriding.
+ if (SymbolType == ELF::STT_COMMON)
+ Address = Obj->getSymbol(Symbol.getRawDataRefImpl())->st_value;
+
StringRef Name = unwrapOrError(Symbol.getName(), Obj->getFileName());
if (Name.empty())
continue;
@@ -1289,13 +1294,15 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj,
if (SectionAddr < StartAddress)
Index = std::max<uint64_t>(Index, StartAddress - SectionAddr);
- // If there is a data symbol inside an ELF text section and we are
+ // If there is a data/common symbol inside an ELF text section and we are
// only disassembling text (applicable all architectures), we are in a
// situation where we must print the data and not disassemble it.
- if (Obj->isELF() && std::get<2>(Symbols[SI]) == ELF::STT_OBJECT &&
- !DisassembleAll && Section.isText()) {
- dumpELFData(SectionAddr, Index, End, Bytes);
- Index = End;
+ if (Obj->isELF() && !DisassembleAll && Section.isText()) {
+ uint8_t SymTy = std::get<2>(Symbols[SI]);
+ if (SymTy == ELF::STT_OBJECT || SymTy == ELF::STT_COMMON) {
+ dumpELFData(SectionAddr, Index, End, Bytes);
+ Index = End;
+ }
}
bool CheckARMELFData = hasMappingSymbols(Obj) &&