From fe3015d1642db94edb8b953fa2b98704930cc477 Mon Sep 17 00:00:00 2001 From: Peter Smith Date: Thu, 13 Dec 2018 11:13:01 +0000 Subject: [PATCH] [ELF][AArch64] Fix adrp to undefined weak reference. In the ABI for the 64-bit Arm architecture the section on weak references states: During linking, the symbol value of an undefined weak reference is: - Zero if the relocation type is absolute - The address of the place if the relocation type is pc-relative. The relocations associated with an ADRP are relative so we should resolve the undefined weak reference to the place instead of 0. This matches GNU ld.bfd behaviour. fixes pr34928 Differential Revision: https://reviews.llvm.org/D55599 llvm-svn: 349024 --- lld/ELF/InputSection.cpp | 4 ++-- lld/test/ELF/aarch64-undefined-weak.s | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 5f3df546b1dc..30a9fc288a48 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -671,11 +671,11 @@ static uint64_t getRelocTargetVA(const InputFile *File, RelType Type, int64_t A, return In.MipsGot->getVA() + In.MipsGot->getTlsIndexOffset(File) - In.MipsGot->getGp(File); case R_AARCH64_PAGE_PC: { - uint64_t Val = Sym.isUndefWeak() ? A : Sym.getVA(A); + uint64_t Val = Sym.isUndefWeak() ? P + A : Sym.getVA(A); return getAArch64Page(Val) - getAArch64Page(P); } case R_AARCH64_PLT_PAGE_PC: { - uint64_t Val = Sym.isUndefWeak() ? A : Sym.getPltVA() + A; + uint64_t Val = Sym.isUndefWeak() ? P + A : Sym.getPltVA() + A; return getAArch64Page(Val) - getAArch64Page(P); } case R_RISCV_PC_INDIRECT: { diff --git a/lld/test/ELF/aarch64-undefined-weak.s b/lld/test/ELF/aarch64-undefined-weak.s index 893f99a5ff83..ef14bfc237ab 100644 --- a/lld/test/ELF/aarch64-undefined-weak.s +++ b/lld/test/ELF/aarch64-undefined-weak.s @@ -40,7 +40,7 @@ _start: // CHECK-NEXT: 210008: {{.*}} b.eq #4 // CHECK-NEXT: 21000c: {{.*}} cbz x1, #4 // CHECK-NEXT: 210010: {{.*}} adr x0, #0 -// CHECK-NEXT: 210014: {{.*}} adrp x0, #-2162688 +// CHECK-NEXT: 210014: {{.*}} adrp x0, #0 // CHECK: 210018: {{.*}} .word 0x00000000 // CHECK-NEXT: 21001c: {{.*}} .word 0x00000000 // CHECK-NEXT: 210020: {{.*}} .word 0x00000000