[PATCH 2/2] bfd/elfnn-aarch64.c: Handle static links with ifunc correctly.

Yufeng Zhang Yufeng.Zhang@arm.com
Tue Nov 26 11:16:00 GMT 2013


On 11/26/13 08:54, Will Newton wrote:
> The code for handling GOT references to ifunc symbols in static links
> was missing.
>
> bfd/ChangeLog:
>
> 2013-11-25  Will Newton<will.newton@linaro.org>
>
> 	* elfnn-aarch64.c (elfNN_aarch64_finish_dynamic_symbol):
> 	Handle STT_GNU_IFUNC symbols correctly in static links.
>
> 2013-11-25  Will Newton<will.newton@linaro.org>
>
> 	* ld-aarch64/aarch64-elf.exp: Add ifunc-22.
> 	* ld-aarch64/ifunc-22.d: New file.
> 	* ld-aarch64/ifunc-22.s: Likewise.
> ---
>   bfd/elfnn-aarch64.c                     | 30 +++++++++++++++++++++++++++++-
>   ld/testsuite/ld-aarch64/aarch64-elf.exp |  1 +
>   ld/testsuite/ld-aarch64/ifunc-22.d      | 11 +++++++++++
>   ld/testsuite/ld-aarch64/ifunc-22.s      | 14 ++++++++++++++
>   4 files changed, 55 insertions(+), 1 deletion(-)
>   create mode 100644 ld/testsuite/ld-aarch64/ifunc-22.d
>   create mode 100644 ld/testsuite/ld-aarch64/ifunc-22.s
>
> OK for trunk and binutils_2_24-branch?
>
> diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
> index 7cce6f4..1467f5d 100644
> --- a/bfd/elfnn-aarch64.c
> +++ b/bfd/elfnn-aarch64.c
> @@ -6824,7 +6824,34 @@ elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd,
>   		       + htab->root.sgot->output_offset
>   		       + (h->got.offset&  ~(bfd_vma) 1));
>
> -      if (info->shared&&  SYMBOL_REFERENCES_LOCAL (info, h))
> +      if (h->def_regular
> +	&&  h->type == STT_GNU_IFUNC)
> +	{
> +	  if (info->shared)
> +	    {
> +	      /* Generate R_AARCH64_GLOB_DAT.  */
> +	      goto do_glob_dat;
> +	    }

Can the control flow be optimized so that the outer if condition also 
checks !info->shared?  I wonder whether the goto statement be avoided.

  +      if (h->def_regular
  +	&&  h->type == STT_GNU_IFUNC
  +	&&  !info->shared )


> +	  else
> +	    {
> +	      asection *plt;
> +
> +	      if (!h->pointer_equality_needed)
> +		abort ();
> +
> +	      /* For non-shared object, we can't use .got.plt, which
> +		 contains the real function addres if we need pointer

addres/address

> +		 equality.  We load the GOT entry with the PLT entry.  */
> +	      plt = htab->root.splt ? htab->root.splt : htab->root.iplt;
> +	      bfd_put_NN (output_bfd, (plt->output_section->vma
> +				       + plt->output_offset
> +				       + h->plt.offset),
> +			  htab->root.sgot->contents
> +			  + (h->got.offset&  ~(bfd_vma) 1));
> +	      return TRUE;
> +	    }
> +	}
> +      else if (info->shared&&  SYMBOL_REFERENCES_LOCAL (info, h))
>   	{
>   	  if (!h->def_regular)
>   	    return FALSE;
> @@ -6838,6 +6865,7 @@ elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd,
>         else
>   	{
>   	  BFD_ASSERT ((h->got.offset&  1) == 0);
> +do_glob_dat:
>   	  bfd_put_NN (output_bfd, (bfd_vma) 0,
>   		      htab->root.sgot->contents + h->got.offset);
>   	  rela.r_info = ELFNN_R_INFO (h->dynindx, AARCH64_R (GLOB_DAT));

Is do_glob_dat placed deliberately after the assertion?


Thanks,
Yufeng


> diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp
> index a6b3ea2..692bf34 100644
> --- a/ld/testsuite/ld-aarch64/aarch64-elf.exp
> +++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp
> @@ -156,3 +156,4 @@ run_dump_test "ifunc-19a"
>   run_dump_test "ifunc-19b"
>   run_dump_test "ifunc-20"
>   run_dump_test "ifunc-21"
> +run_dump_test "ifunc-22"
> diff --git a/ld/testsuite/ld-aarch64/ifunc-22.d b/ld/testsuite/ld-aarch64/ifunc-22.d
> new file mode 100644
> index 0000000..f28b039
> --- /dev/null
> +++ b/ld/testsuite/ld-aarch64/ifunc-22.d
> @@ -0,0 +1,11 @@
> +#source: ifunc-22.s
> +#objdump: -s -j .got
> +#ld: -static
> +#target: aarch64*-*-*
> +
> +# Ensure GOT is populated correctly in static link
> +
> +.*:     file format elf64-(little|big)aarch64
> +
> +Contents of section \.got:
> + 4100f0 00000000 00000000 d0004000 00000000  ..........@.....
> diff --git a/ld/testsuite/ld-aarch64/ifunc-22.s b/ld/testsuite/ld-aarch64/ifunc-22.s
> new file mode 100644
> index 0000000..69a87bb
> --- /dev/null
> +++ b/ld/testsuite/ld-aarch64/ifunc-22.s
> @@ -0,0 +1,14 @@
> +	.text
> +	.type ifunc, @gnu_indirect_function
> +	.global ifunc
> +ifunc:
> +	ret
> +	.size	ifunc, .-ifunc
> +	.type _start, @function
> +	.globl _start
> +_start:
> +        adrp    x0, :got:ifunc
> +        ldr     x0, [x0, #:got_lo12:ifunc]
> +	.size	_start, .-_start
> +	.data
> +	.xword	ifunc
> -- 1.8.1.4
>




More information about the Binutils mailing list