Index: lld/ELF/LTO.cpp =================================================================== --- lld/ELF/LTO.cpp +++ lld/ELF/LTO.cpp @@ -154,7 +154,11 @@ R.VisibleToRegularObj = Config->Relocatable || Sym->IsUsedInRegularObj || (R.Prevailing && Sym->includeInDynsym()) || UsedStartStop.count(ObjSym.getSectionName()); + const auto *DR = dyn_cast(Sym); R.FinalDefinitionInLinkageUnit = + // Skip absolute symbols from ELF objects, otherwise PC-rel relocations will be + // generated by for them, triggering linker errors. + !(Sym->File && Sym->File->isElf() && DR && DR->Section == nullptr) && Sym->isDefined() && (IsExecutable || Sym->Visibility != STV_DEFAULT); if (R.Prevailing) Index: lld/test/ELF/lto/Inputs/absolute.s =================================================================== --- /dev/null +++ lld/test/ELF/lto/Inputs/absolute.s @@ -0,0 +1,3 @@ +.globl blah +.equ blah, 0xdeadbeef +.type blah,@notype Index: lld/test/ELF/lto/abs-resol.ll =================================================================== --- /dev/null +++ lld/test/ELF/lto/abs-resol.ll @@ -0,0 +1,20 @@ +; REQUIRES: x86 + +; RUN: llvm-as %s -o %t.o +; RUN: llvm-mc -triple=x86_64-pc-linux %p/Inputs/absolute.s -o %t2.o -filetype=obj +; RUN: ld.lld %t.o %t2.o -o %t.out -pie + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +@blah = external global i8, align 1 + +; Function Attrs: noinline nounwind optnone uwtable +define i32 @_start() { +entry: + %var = alloca i8*, align 8 + store i8* @blah, i8** %var, align 8 + %0 = load i8*, i8** %var, align 8 + %1 = ptrtoint i8* %0 to i32 + ret i32 %1 +}