https://sourceware.org/bugzilla/show_bug.cgi?id=21334
Maciej W. Rozycki <ma...@linux-mips.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |WAITING Last reconfirmed| |2017-04-06 Assignee|unassigned at sourceware dot org |ma...@linux-mips.org Ever confirmed|0 |1 --- Comment #4 from Maciej W. Rozycki <ma...@linux-mips.org> --- Created attachment 9975 --> https://sourceware.org/bugzilla/attachment.cgi?id=9975&action=edit WIP bug fix The problem here is the MIPS backend sorts the dynamic symbol table even if no dynamic sections have been created. The latter means `local_dynsymcount' remains unchanged from its initial 0 value even though `a' is local and has been speculatively assigned a `dynindx' upon LD encountering a GOT relocation (NB you need to compile test.c with `-fPIE' or suchlike for the issue to trigger). Normally `_bfd_elf_link_renumber_dynsyms', first called from `bfd_elf_size_dynsym_hash_dynstr', would have set `local_dynsymcount'. This situation then results in the assertion failure, as `a' despite being local has been assigned a `dynindx' beyond `local_dynsymcount'. James and Alastair, can you please try the patch attached then and see if it fixes the issue for you? I'll proceed with the usual integration dance if so. NB we have what looks like a bug to me in that another call to `_bfd_elf_link_renumber_dynsyms', arranged in `bfd_elf_size_dynamic_sections' after section GC has completed, is made even if no dynamic sections have been created. Consequently you can work this PR around by using `--gc-sections' with LD (and with James's test case also say `-e x' so that the reference to `a' itself is not GCed). I'll be sending a fix proposal for this bug separately. Finally I think we have another issue in the MIPS backend, with handling hidden and internal weak undefined symbols. References to such symbols are supposed to resolve to 0, however if a GOT relocation is used, then a local GOT entry is created and used to satisfy the reference. Such an entry is then subject to the usual constant load-time relocation, which means a non-zero value will be returned if the base address is non-zero. This will defeat the usual run-time sequence like: void a (void) __attribute__ ((visibility ("hidden"), weak)); void x (void) { if (a) a (); } What instead we should do I believe is create an *external* GOT entry for the weak undefined symbol entered in the dynamic symbol table as local absolute and having the value of 0. I'll handle this separately as well. -- 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