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

Yufeng Zhang Yufeng.Zhang@arm.com
Tue Nov 26 14:56:00 GMT 2013


On 11/26/13 11:16, Will Newton wrote:
> On 26 November 2013 11:06, Yufeng Zhang<Yufeng.Zhang@arm.com>  wrote:
>> 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.
>
> It would involve altering the else if condition somewhat so I am
> inclined to leave as is.
>
> I am aware that the bfd copy and paste model of code reuse is rather
> unsatisfactory, but sometimes I think it is better to have the same
> bugs as everyone else rather than different ones!

Now I realized where the code is from.  Not ideal but I see your point.

> And I also I have
> dreams that one day some kindly bfd hacker will come along and pull
> some of this stuff out into common code and at that point the
> similarity between ports will make that job easier.

I have a similar dream ;)


Yufeng



>
>>   +      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
>
> Thanks, fixed.
>
>>> +                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?
>
> I don't know. But I share your concern about this code, I'll move the
> label up above the assert as I don't see a case where the assert could
> fail but the code below remain valid.
>




More information about the Binutils mailing list