[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 llvm-svn: 292910
This commit is contained in:
parent
dbcc04a5fa
commit
ccb34efa92
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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: }
|
||||
|
|
|
|||
|
|
@ -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 (
|
||||
|
|
|
|||
Loading…
Reference in New Issue