[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