Bug 28196 - gold: if .symtab order is: __free_hook, __free_hook@GLIBC_2.2.5, version script incorrectly makes the symbol default versioned
Summary: gold: if .symtab order is: __free_hook, __free_hook@GLIBC_2.2.5, version scri...
Status: UNCONFIRMED
Alias: None
Product: binutils
Classification: Unclassified
Component: gold (show other bugs)
Version: unspecified
: P2 normal
Target Milestone: ---
Assignee: Cary Coutant
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2021-08-05 18:03 UTC by Fangrui Song
Modified: 2021-08-05 18:03 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Fangrui Song 2021-08-05 18:03:37 UTC
cat > ./a.s <<eof
.symver __free_hook, __free_hook@GLIBC_2.2.5
.weak __free_hook
__free_hook:
  nop
  call __free_hook
eof
echo 'GLIBC_2.2.5 { __free_hook; };' > ./a.ver
as a.s -o a.o
gold -shared --version-script=a.ver a.o -o a.so
gold -r a.o -o b.o
gold -shared --version-script=a.ver b.o -o b.so
exit

In b.o's .symtab, __free_hook@GLIBC_2.2.5 is before __free_hook.
gold can incorrectly make __free_hook default versioned.

% readelf -W --dyn-syms a.so | grep free_hook
     5: 00000000000002c8     0 NOTYPE  WEAK   DEFAULT    7 __free_hook@GLIBC_2.2.5
% readelf -W --dyn-syms b.so | grep free_hook
     5: 00000000000002c8     0 NOTYPE  WEAK   DEFAULT    7 __free_hook@@GLIBC_2.2.5

% readelf -Ws a.o
...
     1: 0000000000000000     0 NOTYPE  WEAK   DEFAULT    1 __free_hook
     2: 0000000000000000     0 NOTYPE  WEAK   DEFAULT    1 __free_hook@GLIBC_2.2.5
% readelf -Ws b.o
...
     1: 0000000000000000     0 NOTYPE  WEAK   DEFAULT    1 __free_hook@GLIBC_2.2.5
     2: 0000000000000000     0 NOTYPE  WEAK   DEFAULT    1 __free_hook

(
Aside:
`.symver foo, foo@v1, remove` is created which can make this problem moot.

I repeated many times in https://sourceware.org/bugzilla/show_bug.cgi?id=25295
and some other threads, `, remove` should just be the default behavior of `.symver foo, foo@v1` when foo is defined.
.symver should just behave like "rename".
I guess probably only glibc may be unhappy with the default `, remove`.
The fix is probably not too difficult.

Of course, gas should be fixed first to make relocation symbols versioned: PR gas/28157
)