[llvm-objdump] --syms: print 'u' for STB_GNU_UNIQUE
authorFangrui Song <maskray@google.com>
Sat, 7 Mar 2020 05:00:15 +0000 (21:00 -0800)
committerFangrui Song <maskray@google.com>
Fri, 13 Mar 2020 15:04:09 +0000 (08:04 -0700)
GCC when configured with --enable-gnu-unique (default on glibc>=2.11)
emits STB_GNU_UNIQUE for certain objects which are otherwise emitted as
STT_OBJECT, such as an inline function's static local variable or its
guard variable, and a static data member of a template.

Clang does not implement -fgnu-unique.

Implementing it as a binding is strange and the feature itself is
considered by some as a misfeature.

Reviewed By: grimar, jhenderson

Differential Revision: https://reviews.llvm.org/D75797

llvm/test/tools/llvm-objdump/ELF/symbol-table.test
llvm/tools/llvm-objdump/llvm-objdump.cpp

index 8e622ba..98196bf 100644 (file)
@@ -25,7 +25,7 @@
 # CHECK-NEXT:0000000000000000         *UND*    0000000000000000 reserve
 # CHECK-NEXT:0000000000000000 g       *ABS*    0000000000000000 abs
 # CHECK-NEXT:0000000000000000         *COM*    0000000000000000 common2
-# CHECK-NEXT:0000000000000000 g     O .data    0000000000000000 gnu_unique
+# CHECK-NEXT:0000000000000000 u     O .data    0000000000000000 gnu_unique
 # CHECK-NEXT:0000000000000000 g       .data    0000000000000000 invalid_binding
 # CHECK-NEXT:0000000000000000 g       .data    0000000000000000 STB_HIOS
 # CHECK-NEXT:0000000000000000 g       .data    0000000000000000 STB_LOPROC
index e249442..4aad0b9 100644 (file)
@@ -1903,6 +1903,8 @@ void printSymbolTable(const ObjectFile *O, StringRef ArchiveName,
     if (auto *ELF = dyn_cast<ELFObjectFileBase>(O)) {
       if (ELFSymbolRef(*I).getELFType() == ELF::STT_GNU_IFUNC)
         IFunc = 'i';
+      if (ELFSymbolRef(*I).getBinding() == ELF::STB_GNU_UNIQUE)
+        GlobLoc = 'u';
     }
     char Debug = (Type == SymbolRef::ST_Debug || Type == SymbolRef::ST_File)
                  ? 'd' : ' ';