diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp --- a/lld/ELF/SyntheticSections.cpp +++ b/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: { + uint64_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; diff --git a/lld/test/ELF/arm-pie-relative.s b/lld/test/ELF/arm-pie-relative.s --- a/lld/test/ELF/arm-pie-relative.s +++ b/lld/test/ELF/arm-pie-relative.s @@ -3,6 +3,10 @@ // 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 %t1 2>&1 | \ +// RUN: FileCheck %s -allow-empty -check-prefix=NOERR +// RUN: llvm-readobj -r %t1 | FileCheck %s --check-prefix=CHECK1 +// RUN: llvm-readelf -x .got %t1 | FileCheck %s --check-prefix=GOT1 // Test that a R_ARM_GOT_BREL relocation with PIE results in a R_ARM_RELATIVE // dynamic relocation @@ -23,3 +27,12 @@ // GOT: section '.got': // GOT-NEXT: 0x000201e4 e8010300 + +// NOERR-NOT: internal linker error + +// CHECK1: Relocations [ +// CHECK1-NEXT: Section (5) .rel.dyn { +// CHECK1-NEXT: 0x800201E4 R_ARM_RELATIVE + +// GOT1: section '.got': +// GOT1-NEXT: 0x800201e4 e8010380