mirror of
https://github.com/intel/llvm.git
synced 2026-01-25 19:44:38 +08:00
[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
This commit is contained in:
@@ -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: {
|
||||
|
||||
Reference in New Issue
Block a user