[lld] r292910 - [ELF] Correct sh_info for static symbol table

Peter Smith via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 24 02:43:40 PST 2017


Author: psmith
Date: Tue Jan 24 04:43:40 2017
New Revision: 292910

URL: http://llvm.org/viewvc/llvm-project?rev=292910&view=rev
Log:
[ELF] Correct sh_info for static symbol table
    
The sh_info field of the SHT_SYMTAB section holds the index for the
first non-local symbol. When there are global symbols that are output
with STB_LOCAL binding due to having hidden visibility or matching
the local version from a version script, the calculated value of
NumLocals + 1 does not account for them. This change accounts for
global symbols being output with local binding.

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

Modified:
    lld/trunk/ELF/SyntheticSections.cpp
    lld/trunk/test/ELF/basic-mips.s
    lld/trunk/test/ELF/basic-ppc.s

Modified: lld/trunk/ELF/SyntheticSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.cpp?rev=292910&r1=292909&r2=292910&view=diff
==============================================================================
--- lld/trunk/ELF/SyntheticSections.cpp (original)
+++ lld/trunk/ELF/SyntheticSections.cpp Tue Jan 24 04:43:40 2017
@@ -1073,11 +1073,13 @@ template <class ELFT> void SymbolTableSe
 
   if (!StrTabSec.isDynamic()) {
     auto GlobBegin = Symbols.begin() + NumLocals;
-    std::stable_sort(GlobBegin, Symbols.end(), [](const SymbolTableEntry &L,
-                                                  const SymbolTableEntry &R) {
-      return L.Symbol->symbol()->computeBinding() == STB_LOCAL &&
-             R.Symbol->symbol()->computeBinding() != STB_LOCAL;
-    });
+    auto It = std::stable_partition(
+        GlobBegin, Symbols.end(), [](const SymbolTableEntry &S) {
+          return S.Symbol->symbol()->computeBinding() == STB_LOCAL;
+        });
+    // update sh_info with number of Global symbols output with computed
+    // binding of STB_LOCAL
+    this->OutSec->Info = this->Info = 1 + It - Symbols.begin();
     return;
   }
 

Modified: lld/trunk/test/ELF/basic-mips.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/basic-mips.s?rev=292910&r1=292909&r2=292910&view=diff
==============================================================================
--- lld/trunk/test/ELF/basic-mips.s (original)
+++ lld/trunk/test/ELF/basic-mips.s Tue Jan 24 04:43:40 2017
@@ -176,7 +176,7 @@ __start:
 # CHECK-NEXT:     Offset: 0x20010
 # CHECK-NEXT:     Size: 48
 # CHECK-NEXT:     Link: 10
-# CHECK-NEXT:     Info: 1
+# CHECK-NEXT:     Info: 2
 # CHECK-NEXT:     AddressAlignment: 4
 # CHECK-NEXT:     EntrySize: 16
 # CHECK-NEXT:   }

Modified: lld/trunk/test/ELF/basic-ppc.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/basic-ppc.s?rev=292910&r1=292909&r2=292910&view=diff
==============================================================================
--- lld/trunk/test/ELF/basic-ppc.s (original)
+++ lld/trunk/test/ELF/basic-ppc.s Tue Jan 24 04:43:40 2017
@@ -178,7 +178,7 @@
 // CHECK-NEXT:     Offset: 0x2038
 // CHECK-NEXT:     Size: 32
 // CHECK-NEXT:     Link: 9
-// CHECK-NEXT:     Info: 1
+// CHECK-NEXT:     Info: 2
 // CHECK-NEXT:     AddressAlignment: 4
 // CHECK-NEXT:     EntrySize: 16
 // CHECK-NEXT:     SectionData (




More information about the llvm-commits mailing list