In fact, we can treate these two relocation as the same one in the
riscv_elf_check_relocs. I have heard that RISC-V lld had made this
improvement, and so had GNU AARCH64, they only need R_AARCH64_CALL26
for calls rather than two seperate relocations.
Beside, the following PLT issue for RISC-V 32-bit glibc seems to be
fixed by applying at least this patch.
<https://sourceware.org/pipermail/libc-alpha/2020-August/117214.html>
I have ran the toolchain regression, and everything seems fine for now.
bfd/
* elfnn-riscv.c (riscv_elf_check_relocs): Treat R_RISCV_CALL
and R_RISCV_CALL_PLT as the same in the riscv_elf_check_relocs.
(riscv_elf_relocate_section): Remove the R_RISCV_CALL for the
unresolved reloc checks.
ld/
testsuite/ld-riscv-elf/lib-nopic-01a.s: Use R_RISCV_JAL rather
than R_RISCV_CALL.
testsuite/ld-riscv-elf/lib-nopic-01b.d: Likewise.
testsuite/ld-riscv-elf/lib-nopic-01b.s: Likewise.
+2020-08-28 Nelson Chu <nelson.chu@sifive.com>
+
+ * elfnn-riscv.c (riscv_elf_check_relocs): Treat R_RISCV_CALL
+ and R_RISCV_CALL_PLT as the same in the riscv_elf_check_relocs.
+ (riscv_elf_relocate_section): Remove the R_RISCV_CALL for the
+ unresolved reloc checks.
+
2020-08-27 John David Anglin <danglin@gcc.gnu.org>
PR 26356
return FALSE;
break;
+ case R_RISCV_CALL:
case R_RISCV_CALL_PLT:
- /* This symbol requires a procedure linkage table entry. We
+ /* These symbol requires a procedure linkage table entry. We
actually build the entry in adjust_dynamic_symbol,
- because this might be a case of linking PIC code without
+ because these might be a case of linking PIC code without
linking in any dynamic objects, in which case we don't
need to generate a procedure linkage table after all. */
- if (h != NULL)
- {
- h->needs_plt = 1;
- h->plt.refcount += 1;
- }
+ /* If it is a local symbol, then we resolve it directly
+ without creating a PLT entry. */
+ if (h == NULL)
+ continue;
+
+ h->needs_plt = 1;
+ h->plt.refcount += 1;
break;
- case R_RISCV_CALL:
case R_RISCV_JAL:
case R_RISCV_BRANCH:
case R_RISCV_RVC_BRANCH:
{
switch (r_type)
{
- case R_RISCV_CALL:
case R_RISCV_JAL:
case R_RISCV_RVC_JUMP:
if (asprintf (&msg_buf,
+2020-08-28 Nelson Chu <nelson.chu@sifive.com>
+
+ testsuite/ld-riscv-elf/lib-nopic-01a.s: Use R_RISCV_JAL rather
+ than R_RISCV_CALL.
+ testsuite/ld-riscv-elf/lib-nopic-01b.d: Likewise.
+ testsuite/ld-riscv-elf/lib-nopic-01b.s: Likewise.
+
2020-08-27 Jozef Lawrynowicz <jozef.l@mittosystems.com>
* emultempl/msp430.em: Remove unused variable "buf".
.globl func1
.type func1, @function
func1:
- call func2
+ jal func2
jr ra
.size func1, .-func1
#source: lib-nopic-01b.s
#as:
#ld: -shared tmpdir/lib-nopic-01a.so
-#error: .*relocation R_RISCV_CALL against `func1' can not be used when making a shared object; recompile with -fPIC
+#error: .*relocation R_RISCV_JAL against `func1' can not be used when making a shared object; recompile with -fPIC
.globl func2
.type func2, @function
func2:
- call func1
+ jal func1
jr ra
.size func2, .-func2