[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