https://sourceware.org/bugzilla/show_bug.cgi?id=20828
Bug ID: 20828
Summary: [MIPS] produces invalid dynamic symbol table when
--gc-sections is used since PR ld/13177 fix
Product: binutils
Version: 2.27
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: ld
Assignee: unassigned at sourceware dot org
Reporter: james410 at cowgill dot org.uk
Target Milestone: ---
Originally from Debian: https://bugs.debian.org/844357
Related: https://bugs.debian.org/844227
On MIPS, it is possible for ld to generate an invalid symbol table if
--gc-sections is used when linking. This can be seen in all versions of
Debian's libGL.so.1 since jessie.
Steps to reproduce:
$ cat libstubs.c
void alpha(void) {}
$ cat stubs.c
void psi(void) {}
void omega(void) {}
$ gcc -shared libstubs.c -o libstubs.so
$ gcc -c stubs.c
$ ld -shared --gc-sections -o liboutput.so stubs.o libstubs.so
After doing the above, the dynamic symbol table contains:
$ readelf --dyn-sym liboutput.so
Symbol table '.dynsym' contains 10 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000430 0 SECTION LOCAL DEFAULT 6
2: 0000000000010490 0 NOTYPE LOCAL DEFAULT 7 _end
3: 0000000000010490 0 NOTYPE LOCAL DEFAULT 7 __bss_start
4: 0000000000000430 0 NOTYPE LOCAL DEFAULT 6 _ftext
5: 0000000000010490 0 NOTYPE LOCAL DEFAULT 7 _edata
6: 0000000000000454 36 FUNC GLOBAL DEFAULT 6 omega
7: 0000000000010490 0 NOTYPE LOCAL DEFAULT 7 _fbss
8: 0000000000000430 36 FUNC GLOBAL DEFAULT 6 psi
9: 0000000000010480 0 NOTYPE LOCAL DEFAULT 7 _fdata
This is clearly invalid because there are LOCAL symbols which appear after
GLOBAL symbols. The bug only appears if --gc-sections is used - without this
flag the "good" symbol table looks like this:
Symbol table '.dynsym' contains 10 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000450 0 SECTION LOCAL DEFAULT 7
2: 00000000000104b0 0 NOTYPE GLOBAL DEFAULT 8 _end
3: 00000000000104b0 0 NOTYPE GLOBAL DEFAULT 8 __bss_start
4: 0000000000000450 0 NOTYPE GLOBAL DEFAULT 7 _ftext
5: 00000000000104b0 0 NOTYPE GLOBAL DEFAULT 8 _edata
6: 0000000000000474 36 FUNC GLOBAL DEFAULT 7 omega
7: 00000000000104b0 0 NOTYPE GLOBAL DEFAULT 8 _fbss
8: 0000000000000450 36 FUNC GLOBAL DEFAULT 7 psi
9: 00000000000104a0 0 NOTYPE GLOBAL DEFAULT 8 _fdata
I have bisected this bug to the following commit. Binutils 2.22 in Debian
wheezy was also OK because the commit was reverted in the binutils 2.22 branch.
commit 1a766c6843ce0005fee23633b3b30c98e81a7b07
Author: H.J. Lu <[email protected]>
Date: Fri Sep 16 01:17:16 2011 +0000
Also hide symbols without PLT nor GOT references.
bfd/
2011-09-15 H.J. Lu <[email protected]>
PR ld/13177
* elflink.c (elf_gc_sweep_symbol): Also hide symbols without PLT
nor GOT references.
----
While this bug is quite old, it was only found very recently due to a change in
the calculation of the .dynsym sh_info value in:
commit 90ac242072dc68ad454aaaa228868b0f1c8e10f9
Author: Alan Modra <[email protected]>
Date: Sat Aug 13 00:03:43 2016 +0930
Correct .dynsym sh_info
The combination of this commit along with the above bug is causing lots of
undefined references when linking to libGL in Debian (which is compiled using
--gc-sections).
--
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
bug-binutils mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/bug-binutils