[llvm] r364211 - [llvm-objdump] Match GNU objdump on symbol types shown in disassembly
Yuanfang Chen via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 24 10:47:56 PDT 2019
Author: yuanfang
Date: Mon Jun 24 10:47:56 2019
New Revision: 364211
URL: http://llvm.org/viewvc/llvm-project?rev=364211&view=rev
Log:
[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
Modified:
llvm/trunk/test/tools/llvm-objdump/X86/elf-disassemble-dynamic-symbols.test
llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
Modified: llvm/trunk/test/tools/llvm-objdump/X86/elf-disassemble-dynamic-symbols.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/elf-disassemble-dynamic-symbols.test?rev=364211&r1=364210&r2=364211&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objdump/X86/elf-disassemble-dynamic-symbols.test (original)
+++ llvm/trunk/test/tools/llvm-objdump/X86/elf-disassemble-dynamic-symbols.test Mon Jun 24 10:47:56 2019
@@ -22,9 +22,25 @@
# STATIC-EMPTY:
# STATIC-NEXT: 0000000000001002 only_static:
# CHECK-NEXT: 1002:
+# DYN-EMPTY:
+# DYN-NEXT: 0000000000001003 object:
# CHECK-NEXT: 1003:
+# DYN-EMPTY:
+# DYN-NEXT: 0000000000001004 zero_sized:
# CHECK-NEXT: 1004:
-# CHECK-NEXT: 1005:{{.*}}
+# DYN-EMPTY:
+# DYN-NEXT: 0000000000001005 common:
+# CHECK-NEXT: 1005:
+# DYN-EMPTY:
+# DYN-NEXT: 0000000000001006 loos:
+# CHECK-NEXT: 1006:
+# DYN-EMPTY:
+# DYN-NEXT: 0000000000001007 loproc:
+# CHECK-NEXT: 1007:
+# CHECK-NEXT: 1008:
+# CHECK-NEXT: 1009:
+# CHECK-NEXT: 100a:
+# CHECK-NEXT: 100b:{{.*}}
# CHECK-NOT: {{.}}
--- !ELF
@@ -38,7 +54,7 @@ Sections:
Type: SHT_PROGBITS
Flags: [SHF_ALLOC, SHF_EXECINSTR]
Address: 0x1000
- Content: 909090909090
+ Content: 909090909090909090909090
ProgramHeaders:
- Type: PT_LOAD
VAddr: 0x1000
@@ -64,14 +80,12 @@ DynamicSymbols:
Value: 0x1001
Section: .text
Size: 1
- Type: STT_FUNC
+ Type: STT_NOTYPE
Binding: STB_GLOBAL
- ## The rest of the dynamic symbols won't be used for various reasons.
- ## FIXME: the first two symbols here should be dumped.
- ## See https://bugs.llvm.org/show_bug.cgi?id=41947
- - Name: not_func
+ - Name: object
Value: 0x1003
Section: .text
+ Size: 1
Type: STT_OBJECT
Binding: STB_GLOBAL
- Name: zero_sized
@@ -79,20 +93,45 @@ DynamicSymbols:
Section: .text
Type: STT_FUNC
Binding: STB_GLOBAL
- - Name: '' # No name
+ - Name: common
Value: 0x1005
Section: .text
Size: 1
+ Type: STT_COMMON
+ Binding: STB_GLOBAL
+ - Name: loos
+ Value: 0x1006
+ Section: .text
+ Size: 1
+ Type: 10
+ Binding: STB_GLOBAL
+ - Name: loproc
+ Value: 0x1007
+ Section: .text
+ Size: 1
+ Type: 13
+ Binding: STB_GLOBAL
+ ## The rest of the dynamic symbols won't be used for various reasons.
+ - Name: section
+ Value: 0x1008
+ Section: .text
+ Size: 1
+ Type: STT_SECTION
+ Binding: STB_GLOBAL
+ - Name: '' # No name
+ Value: 0x1009
+ Section: .text
+ Size: 1
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: absolute
- Value: 0x1005
+ Value: 0x100a
Index: SHN_ABS
Size: 1
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: undefined
- Value: 0x1005
+ Value: 0x100b
Index: SHN_UNDEF
Size: 1
Type: STT_FUNC
Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp?rev=364211&r1=364210&r2=364211&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp (original)
+++ llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp Mon Jun 24 10:47:56 2019
@@ -857,10 +857,15 @@ addDynamicElfSymbols(const ELFObjectFile
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 Targ
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) &&
More information about the llvm-commits
mailing list