[PATCH] ld: Make --dynamic-list* override -Bsymbolic -Bsymbolic-functions

Fangrui Song maskray@google.com
Sat May 23 21:45:01 GMT 2020


On 2020-05-23, H.J. Lu wrote:
>On Fri, May 22, 2020 at 8:56 AM Fangrui Song <maskray@google.com> wrote:
>>
>>
>> On 2020-05-22, H.J. Lu wrote:
>> >On Wed, May 20, 2020 at 6:48 PM Fangrui Song via Binutils
>> ><binutils@sourceware.org> wrote:
>> >>
>> >> They aren't used together in reality, so it is safe to change the
>> >> semantics. --dynamic-list is refined -Bsymbolic. -Bsymbolic-functions
>> >> should be considered as a subset of -Bsymbolic, so --dynamic-list
>> >> overridding -Bsymbolic implies that --dynamic-list overridding
>> >> -Bsymbolic-functions.
>> >
>> >--dynamic-list=DYNAMIC-LIST-FILE'
>> >     Specify the name of a dynamic list file to the linker.  This is
>> >     typically used when creating shared libraries to specify a list of
>> >     global symbols whose references shouldn't be bound to the
>> >     definition within the shared library, or creating dynamically
>> >     linked executables to specify a list of symbols which should be
>> >     added to the symbol table in the executable.  This option is only
>> >     meaningful on ELF platforms which support shared libraries.
>> >
>> >The --dynamic-list* options are intended for shared libraries.
>>
>> --dynamic-list* work for both executables and shared libraries.
>> For an executable, export some symbols.
>> For a shared library, specify preemptible symbols.
>>
>> >The goal
>> >IS NOT put them in dynamic symbol table since all global symbols are in
>> >dynamic symbol table already in a shared library.  The goal is to make
>> >them PREEMPTIBLE.
>>
>> I agree with this sentence and the patch respects it.
>>
>> >So making the --dynamic-list* options override -Bsymbolic
>> >and -Bsymbolic-functions is incorrect since there is NOTHING to override.
>>
>> I don't agree with this statement. --dynamic-list* have function overlay
>> with -Bsymbolic. When two options overlap in functionality, many users
>> expect the more fine-grained option to win, thus my thought that
>> --dynamic-list* override -Bsymbolic and -Bsymbolic-functions.
>>
>> (FWIW LLD's preemptibility logic is
>>    ...
>>    if (config->hasDynamicList)
>>      return sym.inDynamicList;
>>    return !(config->bsymbolic || config->bsymbolicFunctions && sym.isFunc());
>>    This works fine and I won't change it.
>> )
>>
>> >To do it properly:
>> >
>> >1.  Extend  --dynamic-list* to executables.  Symbol binding is unchanged.
>> >Only add symbols to dynamic symbol table.
>>
>> This was already implemented when you implemented --dynamic-list in
>> 2006. This patch does not change the fact.
>>
>> >2. Make --export-dynamic-symbol an alias of  --dynamic-list* for executables.
>> >and ignore --export-dynamic-symbol for -shared.  It has to be done at the
>> >end of command-line parsing.
>
>There is no need to change linker manual.  --dynamic-list* should work both
>before and after -Bsymbolic and -Bsymbolic-functions.  Your patch used
>libdl2d.so without creating it first.
>
>Here is the updated version of your patch.  I took the liberty to make
>the changes above.
>
>-- 
>H.J.

Thanks for the fix (libdl4e.so->libdl2d.so)

The updated patch looks good to me.


More information about the Binutils mailing list