[PATCH] RISC-V: Treat R_RISCV_CALL and R_RISCV_CALL_PLT as the same in check_relocs.
Alistair Francis
Alistair.Francis@wdc.com
Wed Aug 26 18:28:37 GMT 2020
On Wed, 2020-08-26 at 01:19 -0700, Nelson Chu wrote:
> 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.
Thanks for this.
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> bfd/elfnn-riscv.c | 19 ++++++++++---------
> ld/testsuite/ld-riscv-elf/lib-nopic-01a.s | 2 +-
> ld/testsuite/ld-riscv-elf/lib-nopic-01b.d | 2 +-
> ld/testsuite/ld-riscv-elf/lib-nopic-01b.s | 2 +-
> 4 files changed, 13 insertions(+), 12 deletions(-)
>
> diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
> index 5af1b1c..e6c5d1f 100644
> --- a/bfd/elfnn-riscv.c
> +++ b/bfd/elfnn-riscv.c
> @@ -557,21 +557,23 @@ riscv_elf_check_relocs (bfd *abfd, struct
> bfd_link_info *info,
> 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:
> @@ -2189,7 +2191,6 @@ riscv_elf_relocate_section (bfd *output_bfd,
> {
> switch (r_type)
> {
> - case R_RISCV_CALL:
> case R_RISCV_JAL:
> case R_RISCV_RVC_JUMP:
> if (asprintf (&msg_buf,
> diff --git a/ld/testsuite/ld-riscv-elf/lib-nopic-01a.s
> b/ld/testsuite/ld-riscv-elf/lib-nopic-01a.s
> index c95cda0..632875d 100644
> --- a/ld/testsuite/ld-riscv-elf/lib-nopic-01a.s
> +++ b/ld/testsuite/ld-riscv-elf/lib-nopic-01a.s
> @@ -4,6 +4,6 @@
> .globl func1
> .type func1, @function
> func1:
> - call func2
> + jal func2
> jr ra
> .size func1, .-func1
> diff --git a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.d
> b/ld/testsuite/ld-riscv-elf/lib-nopic-01b.d
> index 0d758a4..1c2c907 100644
> --- a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.d
> +++ b/ld/testsuite/ld-riscv-elf/lib-nopic-01b.d
> @@ -2,4 +2,4 @@
> #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
> diff --git a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.s
> b/ld/testsuite/ld-riscv-elf/lib-nopic-01b.s
> index 97fe137..ea7b029 100644
> --- a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.s
> +++ b/ld/testsuite/ld-riscv-elf/lib-nopic-01b.s
> @@ -4,6 +4,6 @@
> .globl func2
> .type func2, @function
> func2:
> - call func1
> + jal func1
> jr ra
> .size func2, .-func2
More information about the Binutils
mailing list