Skip to content

Commit

Permalink
[ELF] Correct sh_info for static symbol table
Browse files Browse the repository at this point in the history
    
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

llvm-svn: 292910
  • Loading branch information
smithp35 committed Jan 24, 2017
1 parent dbcc04a commit ccb34ef
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 7 deletions.
12 changes: 7 additions & 5 deletions lld/ELF/SyntheticSections.cpp
Expand Up @@ -1073,11 +1073,13 @@ template <class ELFT> void SymbolTableSection<ELFT>::finalize() {

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;
}

Expand Down
2 changes: 1 addition & 1 deletion lld/test/ELF/basic-mips.s
Expand Up @@ -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: }
Expand Down
2 changes: 1 addition & 1 deletion lld/test/ELF/basic-ppc.s
Expand Up @@ -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 (
Expand Down

0 comments on commit ccb34ef

Please sign in to comment.