Index: ELF/Target.cpp =================================================================== --- ELF/Target.cpp +++ ELF/Target.cpp @@ -1226,11 +1226,14 @@ } bool AArch64TargetInfo::isRelRelative(uint32_t Type) const { - return Type == R_AARCH64_PREL32 || Type == R_AARCH64_ADR_PREL_PG_HI21 || - Type == R_AARCH64_LDST8_ABS_LO12_NC || - Type == R_AARCH64_LDST32_ABS_LO12_NC || - Type == R_AARCH64_LDST64_ABS_LO12_NC || - Type == R_AARCH64_ADD_ABS_LO12_NC || Type == R_AARCH64_CALL26; + switch (Type) { + default: + return true; + case R_AARCH64_ABS64: + case R_AARCH64_ADR_GOT_PAGE: + case R_AARCH64_LD64_GOT_LO12_NC: + return !Config->Shared; + } } bool AArch64TargetInfo::isTlsInitialExecRel(uint32_t Type) const { Index: test/ELF/aarch64-relative.s =================================================================== --- test/ELF/aarch64-relative.s +++ test/ELF/aarch64-relative.s @@ -2,13 +2,20 @@ // RUN: llvm-mc -filetype=obj -triple=aarch64-unknown-freebsd %s -o %t.o // RUN: ld.lld %t.o -o %t.so -shared // RUN: llvm-readobj -r %t.so | FileCheck %s - adrp x8, .Lfoo - strb w9, [x8, :lo12:.Lfoo] - ldr w0, [x8, :lo12:.Lfoo] - ldr x0, [x8, :lo12:.Lfoo] - add x0, x0, :lo12:.Lfoo - bl .Lfoo + adr x8, .Lfoo // R_AARCH64_ADR_PREL_LO21 + adrp x8, .Lfoo // R_AARCH64_ADR_PREL_PG_HI21 + strb w9, [x8, :lo12:.Lfoo] // R_AARCH64_LDST8_ABS_LO12_NC + ldr h17, [x19, :lo12:.Lfoo] // R_AARCH64_LDST16_ABS_LO12_NC + ldr w0, [x8, :lo12:.Lfoo] // R_AARCH64_LDST32_ABS_LO12_NC + ldr x0, [x8, :lo12:.Lfoo] // R_AARCH64_LDST64_ABS_LO12_NC + ldr q20, [x19, #:lo12:.Lfoo] // R_AARCH64_LDST128_ABS_LO12_NC + add x0, x0, :lo12:.Lfoo // R_AARCH64_ADD_ABS_LO12_NC + bl .Lfoo // R_AARCH64_CALL26 + b .Lfoo // R_AARCH64_JUMP26 + beq .Lfoo // R_AARCH64_CONDBR19 + adr x1, .Lfoo // R_AARCH64_ADR_PREL_LO21 + tbz x1, 7, .Lfoo // R_AARCH64_TSTBR14 .data .Lfoo: