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 <hjl.to...@gmail.com> Date: Fri Sep 16 01:17:16 2011 +0000 Also hide symbols without PLT nor GOT references. bfd/ 2011-09-15 H.J. Lu <hongjiu...@intel.com> 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 <amo...@gmail.com> 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 bug-binutils@gnu.org https://lists.gnu.org/mailman/listinfo/bug-binutils