[PATCH] as: Replace the removed symbol with the versioned symbol

Fangrui Song i@maskray.me
Thu Aug 12 01:11:51 GMT 2021


On 2021-08-11, H.J. Lu wrote:
>On Tue, Aug 10, 2021 at 2:56 PM Fangrui Song <i@maskray.me> wrote:
>>
>> On 2021-08-01, H.J. Lu via Binutils wrote:
>> >When a symbol removed by .symver is used in relocation and there is one
>> >and only one versioned symbol, don't remove the symbol.  Instead, mark
>> >it to be removed and replace the removed symbol used in relocation with
>> >the versioned symbol before generating relocation.
>>
>> Thanks for the patch.
>> The behavior looks good.
>>
>> .symver foo, foo@v1, remove
>> .globl foo
>> foo:
>>    call foo   # R_X86_64_PLT32 foo@v1
>>
>>
>>
>> I think this can be extended to non-remove one-@ as well.
>> The unadorned symbol and relocations referencing it just add complexity
>> to linker internals.
>>
>> .symver foo, foo@v1
>
>This usage is perfectly fine and quite normal.

It isn't.

cat > a.s <<eof
.symver foo, foo@v1
.globl foo
foo:
eof
cat > a.ver <<eof
v1 {};
v2 { foo*; };
eof
cc -c a.s

% ld.bfd --version-script=a.ver -shared a.o -o a.so && nm -D a.so
0000000000001000 R foo@v1
0000000000000000 A v1
0000000000000000 A v2


If
.symver foo_v1, foo@v1

% ld.bfd --version-script=a.ver -shared a.o -o a.so && nm -D a.so
0000000000001000 R foo@v1
0000000000001000 R foo_v1@@v2
0000000000000000 A v1
0000000000000000 A v2


Merging (unadorned) foo and (non-default versioned) foo@v1 is a hack, in all of GNU ld, gold, and ld.lld.


More information about the Binutils mailing list