Index: lld/ELF/SyntheticSections.cpp =================================================================== --- lld/ELF/SyntheticSections.cpp +++ lld/ELF/SyntheticSections.cpp @@ -1564,9 +1564,11 @@ assert(sym != nullptr); return addend; case AddendOnlyWithTargetVA: - case AgainstSymbolWithTargetVA: - return InputSection::getRelocTargetVA(inputSec->file, type, addend, - getOffset(), *sym, expr); + case AgainstSymbolWithTargetVA: { + int64_t ca = InputSection::getRelocTargetVA(inputSec->file, type, addend, + getOffset(), *sym, expr); + return config->is64 ? ca : SignExtend64<32>(ca); + } case MipsMultiGotPage: assert(sym == nullptr); return getMipsPageAddr(outputSec->addr) + addend; Index: lld/test/ELF/arm-pie-relative.s =================================================================== --- lld/test/ELF/arm-pie-relative.s +++ lld/test/ELF/arm-pie-relative.s @@ -3,6 +3,7 @@ // RUN: ld.lld %t.o --pie -o %t // RUN: llvm-readobj -r %t | FileCheck %s // RUN: llvm-readelf -x .got %t | FileCheck %s --check-prefix=GOT +// RUN: ld.lld %t.o --pie --image-base=0x80000000 --check-dynamic-relocations -o /dev/null // Test that a R_ARM_GOT_BREL relocation with PIE results in a R_ARM_RELATIVE // dynamic relocation