// Returns true if Expr refers a PLT entry.
static bool needsPlt(RelExpr expr) {
- return oneof<R_PLT_PC, R_PPC32_PLTREL, R_PPC64_CALL_PLT, R_PLT>(expr);
+ return oneof<R_PLT, R_PLT_PC, R_PLT_GOTPLT, R_PPC32_PLTREL, R_PPC64_CALL_PLT>(
+ expr);
}
// Returns true if Expr refers a GOT entry. Note that this function
R_MIPS_GOT_LOCAL_PAGE, R_MIPS_GOTREL, R_MIPS_GOT_OFF,
R_MIPS_GOT_OFF32, R_MIPS_GOT_GP_PC, R_MIPS_TLSGD,
R_AARCH64_GOT_PAGE_PC, R_GOT_PC, R_GOTONLY_PC, R_GOTPLTONLY_PC,
- R_PLT_PC, R_TLSGD_GOT, R_TLSGD_GOTPLT, R_TLSGD_PC, R_PPC32_PLTREL,
- R_PPC64_CALL_PLT, R_PPC64_RELAX_TOC, R_RISCV_ADD, R_TLSDESC_CALL,
- R_TLSDESC_PC, R_AARCH64_TLSDESC_PAGE, R_TLSLD_HINT, R_TLSIE_HINT,
- R_AARCH64_GOT_PAGE>(
- e))
+ R_PLT_PC, R_PLT_GOTPLT, R_TLSGD_GOT, R_TLSGD_GOTPLT, R_TLSGD_PC,
+ R_PPC32_PLTREL, R_PPC64_CALL_PLT, R_PPC64_RELAX_TOC, R_RISCV_ADD,
+ R_TLSDESC_CALL, R_TLSDESC_PC, R_AARCH64_TLSDESC_PAGE, R_TLSLD_HINT,
+ R_TLSIE_HINT, R_AARCH64_GOT_PAGE>(e))
return true;
// These never do, except if the entire file is position dependent or if
return R_PPC64_CALL;
case R_PLT:
return R_ABS;
+ case R_PLT_GOTPLT:
+ return R_GOTPLTREL;
default:
return expr;
}
// If the relocation does not emit a GOT or GOTPLT entry but its computation
// uses their addresses, we need GOT or GOTPLT to be created.
//
- // The 4 types that relative GOTPLT are all x86 and x86-64 specific.
- if (oneof<R_GOTPLTONLY_PC, R_GOTPLTREL, R_GOTPLT, R_TLSGD_GOTPLT>(expr)) {
+ // The 5 types that relative GOTPLT are all x86 and x86-64 specific.
+ if (oneof<R_GOTPLTONLY_PC, R_GOTPLTREL, R_GOTPLT, R_PLT_GOTPLT,
+ R_TLSGD_GOTPLT>(expr)) {
in.gotPlt->hasGotPltOffRel = true;
} else if (oneof<R_GOTONLY_PC, R_GOTREL, R_PPC64_TOCBASE, R_PPC64_RELAX_TOC>(
expr)) {
--- /dev/null
+# REQUIRES: x86
+## Test R_X86_64_PLTOFF64 (preemptible: L - GOT + A; non-preemptible: S - GOT + A).
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o
+# RUN: ld.lld %t.o -shared -o %t.so
+# RUN: llvm-readelf -S %t.so | FileCheck %s --check-prefix=SEC-SHARED
+# RUN: llvm-objdump -d --no-show-raw-insn %t.so | FileCheck %s --check-prefix=SHARED
+
+# RUN: ld.lld %t.o -o %t
+# RUN: llvm-readelf -S %t | FileCheck %s --check-prefix=SEC-PDE
+# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s --check-prefix=PDE
+
+# SEC-SHARED: .got.plt PROGBITS 00000000000033c0 0003c0 000028
+
+## foo@plt - .got.plt = 0x12f0 - 0x33c0 = -8400
+## undefweak@plt - .got.plt = 0x1300 - 0x33c0 = -8384
+# SHARED-LABEL: <.text>:
+# SHARED-NEXT: movabsq $-8400, %rdx
+# SHARED-NEXT: movabsq $-8384, %rdx
+# SHARED-LABEL: <foo@plt>:
+# SHARED-NEXT: 12f0: jmpq {{.*}}(%rip)
+
+# SEC-PDE: .got.plt PROGBITS 0000000000202170 000170 000018
+
+## Avoid PLT since the referenced symbol is non-preemptible.
+## foo - .got.plt = 0x20116c - 0x202170 = -4100
+## 0 - .got.plt = 0 - 0x202168 = -2105712
+# PDE-LABEL: <.text>:
+# PDE-NEXT: movabsq $-4100, %rdx
+# PDE-NEXT: movabsq $-2105712, %rdx
+# PDE-LABEL: <foo>:
+# PDE-NEXT: 20116c: retq
+
+ movabsq $foo@PLTOFF, %rdx
+ movabsq $undefweak@PLTOFF, %rdx
+
+.globl foo
+foo:
+ ret
+
+.weak undefweak