This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Always clear h->verinfo.verdef when overriding a dynamic definition


On Thu, Aug 9, 2018 at 8:06 PM, Alan Modra <amodra@gmail.com> wrote:
> On Thu, Aug 09, 2018 at 04:09:14PM -0700, H.J. Lu wrote:
>> When linker defines a symbol to override a definition, which came from
>> a dynamic object before, we should always clear h->verinfo.verdef so
>> that the symbol won't be associated with the version information from
>> the dynamic object.  This happened to the symbol "_edata" when creating
>> an unversioned dynamic object linking against libQt5Core.so.5.11.1,
>> which was created by gold, with 2 entries of "_edata@Qt_5" in its dynamic
>> symbol table:
>>
>>   4822: 00000000004e36ed     0 NOTYPE  GLOBAL DEFAULT   21 _edata@Qt_5
>>   4823: 00000000004e36ed     0 NOTYPE  GLOBAL DEFAULT   21 _edata@Qt_5
>>
>> Ld created the dynamic object with "_edata" in its dynamic symbol table
>> which was linker defined and associated with the version information
>> from libQt5Core.so.5.11.1.
>
> How did _edata come to have version info?  A non-default versioned
> _edata (with one '@') shouldn't make _edata defined.  I think we
> probably have another bug here to fix.

That dynamic object is created against:

/usr/lib64/libKF5ConfigCore.so.5.49.0
/usr/lib64/libKF5CoreAddons.so.5.49.0 /usr/lib64/libKF5I18n.so.5.49.0
/usr/lib64/libKF5DBusAddons.so.5.49.0 /usr/lib64/libQt5Xml.so.5.11.1
   /usr/lib64/libQt5DBus.so.5.11.1 /usr/lib64/libQt5Core.so.5.11.1

Among them

/usr/lib64/libQt5Xml.so.5.11.1
   299: 000000000003e000     0 NOTYPE  GLOBAL DEFAULT   18 _edata@@Qt_5
/usr/lib64/libQt5DBus.so.5.11.1
   597: 0000000000092018     0 NOTYPE  GLOBAL DEFAULT   18 _edata@@Qt_5
/usr/lib64/libQt5Core.so.5.11.1
  2292: 00000000004df640     0 NOTYPE  GLOBAL DEFAULT   21 _edata@Qt_5
  2293: 00000000004df640     0 NOTYPE  GLOBAL DEFAULT   21 _edata@Qt_5

The problem is triggered by the last 2 duplicated entries.   The code
in question was
there when the binutils source was imported to sourceware.org.   I
couldn't think of
a reason why it shouldn't clear h->verinfo.verdef when provide is TRUE.


H.J.
>>  When such a dynamic object was used later,
>> we got
>>
>> /usr/bin/ld: bin/libKF5Service.so.5.49.0: _edata: invalid version 21 (max 0)
>> /usr/bin/ld: bin/libKF5Service.so.5.49.0: error adding symbols: bad value
>>
>> OK for master?
>>
>> H.J.
>> ---
>>       PR ld/23499
>>       * elflink.c (bfd_elf_record_link_assignment): Always clear
>>       h->verinfo.verdef when overriding a dynamic definition.
>> ---
>>  bfd/elflink.c | 12 +++++-------
>>  1 file changed, 5 insertions(+), 7 deletions(-)
>>
>> diff --git a/bfd/elflink.c b/bfd/elflink.c
>> index b24fb95848..02618bed8f 100644
>> --- a/bfd/elflink.c
>> +++ b/bfd/elflink.c
>> @@ -686,13 +686,11 @@ bfd_elf_record_link_assignment (bfd *output_bfd,
>>        && !h->def_regular)
>>      h->root.type = bfd_link_hash_undefined;
>>
>> -  /* If this symbol is not being provided by the linker script, and it is
>> -     currently defined by a dynamic object, but not by a regular object,
>> -     then clear out any version information because the symbol will not be
>> -     associated with the dynamic object any more.  */
>> -  if (!provide
>> -      && h->def_dynamic
>> -      && !h->def_regular)
>> +  /* If this symbol is currently defined by a dynamic object, but not
>> +     by a regular object, then clear out any version information because
>> +     the symbol will not be associated with the dynamic object any
>> +     more.  */
>> +  if (h->def_dynamic && !h->def_regular)
>>      h->verinfo.verdef = NULL;
>>
>>    /* Make sure this symbol is not garbage collected.  */
>> --
>> 2.17.1
>
> --
> Alan Modra
> Australia Development Lab, IBM



-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]