https://sourceware.org/bugzilla/show_bug.cgi?id=21054
Bug ID: 21054 Summary: [MIPS] Forced local symbol rearranging messes up GOT Product: binutils Version: 2.29 (HEAD) Status: UNCONFIRMED Severity: normal Priority: P2 Component: gold Assignee: ccoutant at gmail dot com Reporter: james410 at cowgill dot org.uk CC: ian at airs dot com Target Milestone: --- Created attachment 9754 --> https://sourceware.org/bugzilla/attachment.cgi?id=9754&action=edit gold-mips-forced-local.c Originally this systemd bug in Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=851412 The attached testcase immediately segfaults when run after being compiled by gold on mips. It works fine when the bfd linker is used. Compile with: gcc -Wl,-version-script=blank.ver -fuse-ld=gold gold-mips-forced-local.c With blank.ver hiding all symbols: { local: *; }; The segfault occurs in __start when it tries to call __libc_start_main. It instead calls a NULL pointer. Looking in GDB the GOT has definitely been initialized but the pointer to __libc_start_main occurs 8 bytes (2 words) before the GOT entry actually accessed in __start. In Debian, the bug manifested in any executable which loaded libsystemd.so by segfaulting on exit. The segfault occured in __do_global_dtors_aux when it tried to call __cxa_finalize but instead called some other random function from libsystemd. Aurélien Jarno bisected this bug to commit c4d5a76223f74930add9014f2a77339eb80b737c: Author: Cary Coutant <ccout...@gmail.com> Date: Thu Dec 22 14:06:24 2016 -0800 Fix placement of forced local symbols in the dynamic symbol table. Gold was not placing forced-local symbols (e.g., hidden visibility) at the front of the dynamic symbol table, or including them in the count of local symbols recorded in the .dynsym section's sh_info field. In my testcase I expect the __start_ASECTION and __stop_ASECTION symbols are forced local and were affected by this (also fits the GOT being offset by 2 words). On MIPS they will require GOT entries as they are used by num_ptrs, but presumably moving them around the dynamic symbol table screwed the GOT up on MIPS. I know that on MIPS, the dynamic symbol table is used as an index into the GOT but I don't have a lot of in depth knowledge on it. -- 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