[ELF] Fix includeInDynsym() when an undefined weak is merged with a lazy definition

An undefined weak does not fetch the lazy definition. A lazy weak symbol
should be considered undefined, and thus preemptible if .dynsym exists.

D71795 is not quite an NFC. It errors on an R_X86_64_PLT32 referencing
an undefined weak symbol. isPreemptible is false (incorrect) => R_PLT_PC
is optimized to R_PC => in isStaticLinkTimeConstant, an error is emitted
when an R_PC is applied on an undefined weak (considered absolute).
This commit is contained in:
Fangrui Song 2020-01-09 15:53:52 -08:00
parent 02113918ed
commit 375371cc8b
2 changed files with 8 additions and 1 deletions

View File

@ -277,8 +277,10 @@ bool Symbol::includeInDynsym() const {
return false;
if (computeBinding() == STB_LOCAL)
return false;
if (!isDefined() && !isCommon())
return true;
return isUndefined() || isShared() || exportDynamic || inDynamicList;
return exportDynamic || inDynamicList;
}
// Print out a log message for --trace-symbol.

View File

@ -6,6 +6,9 @@
# RUN: ld.lld -shared -o %t.so %t1.o --start-lib %t2.o
# RUN: llvm-readobj --dyn-syms %t.so | FileCheck %s
# RUN: ld.lld -pie -o %t %t1.o --start-lib %t2.o
# RUN: llvm-readobj --dyn-syms %t | FileCheck %s
# CHECK: Name: foo
# CHECK-NEXT: Value: 0x0
# CHECK-NEXT: Size: 0
@ -15,5 +18,7 @@
# CHECK-NEXT: Section: Undefined
.weak foo
call foo@PLT
.data
.quad foo