Skip to content

Commit

Permalink
[ELF] Don't set versionId on undefined weak lazy symbols
Browse files Browse the repository at this point in the history
An unfetched lazy symbol (undefined weak) should be considered to have its
original versionId which is VER_NDX_GLOBAL, instead of the lazy symbol's
versionId. (The original versionId cannot be non-VER_NDX_GLOBAL because a
undefined versioned symbol is an error.)

The regression was introduced in D77280 when making version scripts work
with lazy symbols fetched by LTO calls.

Fix PR49915

Differential Revision: https://reviews.llvm.org/D100624
  • Loading branch information
MaskRay committed Apr 20, 2021
1 parent 6e77a67 commit 1c00530
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 1 deletion.
4 changes: 3 additions & 1 deletion lld/ELF/SyntheticSections.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3123,7 +3123,9 @@ size_t VersionTableSection::getSize() const {
void VersionTableSection::writeTo(uint8_t *buf) {
buf += 2;
for (const SymbolTableEntry &s : getPartition().dynSymTab->getSymbols()) {
write16(buf, s.sym->versionId);
// Use the original versionId for an unfetched lazy symbol (undefined weak),
// which must be VER_NDX_GLOBAL (an undefined versioned symbol is an error).
write16(buf, s.sym->isLazy() ? VER_NDX_GLOBAL : s.sym->versionId);
buf += 2;
}
}
Expand Down
13 changes: 13 additions & 0 deletions lld/test/ELF/version-script-weak.s
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,19 @@
# CHECK-NEXT: Section: Undefined
# CHECK-NEXT: }

## The version of an unfetched lazy symbol is VER_NDX_GLOBAL. It is not affected by version scripts.
# RUN: echo "v1 { *; };" > %t2.script
# RUN: ld.lld -shared --version-script %t2.script %t.o --start-lib %t1.o --end-lib -o %t2.so
# RUN: llvm-readelf --dyn-syms %t2.so | FileCheck %s --check-prefix=CHECK2

# CHECK2: NOTYPE WEAK DEFAULT UND foo{{$}}

# RUN: ld.lld -shared --soname=tshared --version-script %t2.script %t1.o -o %tshared.so
# RUN: ld.lld -shared --version-script %t2.script %t.o --start-lib %t1.o --end-lib %tshared.so -o %t3.so
# RUN: llvm-readelf --dyn-syms %t3.so | FileCheck %s --check-prefix=CHECK3

# CHECK3: NOTYPE WEAK DEFAULT UND foo@v1

.text
callq foo@PLT
.weak foo

0 comments on commit 1c00530

Please sign in to comment.