From 375371cc8bff7ba02d0a2203f80de5e640fcadf1 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Thu, 9 Jan 2020 15:53:52 -0800 Subject: [PATCH] [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). --- lld/ELF/Symbols.cpp | 4 +++- lld/test/ELF/weak-undef-lib.s | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index a9e3645..f0f6121 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -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. diff --git a/lld/test/ELF/weak-undef-lib.s b/lld/test/ELF/weak-undef-lib.s index 0b4183e..54e05dc 100644 --- a/lld/test/ELF/weak-undef-lib.s +++ b/lld/test/ELF/weak-undef-lib.s @@ -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 -- 2.7.4