Index: lld/trunk/ELF/Writer.cpp =================================================================== --- lld/trunk/ELF/Writer.cpp +++ lld/trunk/ELF/Writer.cpp @@ -573,6 +573,10 @@ DynType = Target->TlsGotRel; else if (Preemptible) DynType = Target->GotRel; + else if (Body.isUndefined()) + // Weak undefined symbols evaluate to zero, so don't create + // relocations for them. + continue; else DynType = Target->RelativeRel; AddDyn({DynType, Out::Got, Body.getGotOffset(), Index: lld/trunk/test/ELF/pie-weak.s =================================================================== --- lld/trunk/test/ELF/pie-weak.s +++ lld/trunk/test/ELF/pie-weak.s @@ -0,0 +1,16 @@ +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +# RUN: ld.lld -pie %t.o -o %t +# RUN: llvm-readobj -r %t | FileCheck --check-prefix=RELOCS %s +# RUN: llvm-objdump -d %t | FileCheck --check-prefix=DISASM %s + +# RELOCS: Relocations [ +# RELOCS-NEXT: ] + +.weak foo + +.globl _start +_start: +# DISASM: _start: +# DISASM-NEXT: 1000: 48 8b 05 69 10 00 00 movq 4201(%rip), %rax +# ^ .got - (.text + 7) +mov foo@gotpcrel(%rip), %rax