diff options
-rw-r--r-- | gas/ChangeLog | 4 | ||||
-rw-r--r-- | gas/write.c | 34 |
2 files changed, 29 insertions, 9 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 917bbab..d9c2e38 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,7 @@ +Sun Dec 15 15:26:37 1996 Ian Lance Taylor <ian@cygnus.com> + + * write.c (adjust_reloc_syms): Fix linkonce check for ELF. + Sat Dec 14 22:37:27 1996 Ian Lance Taylor <ian@cygnus.com> * config/tc-mips.c (prev_insn_reloc_type): New static variable. diff --git a/gas/write.c b/gas/write.c index daf8738..ab026f1 100644 --- a/gas/write.c +++ b/gas/write.c @@ -718,23 +718,39 @@ adjust_reloc_syms (abfd, sec, xxx) goto done; } -#ifdef BFD_ASSEMBLER /* Don't try to reduce relocs which refer to .linkonce sections. It can lead to confusion when a debugging section refers to a .linkonce section. I hope this will always be correct. */ - if (symsec != sec - && ((bfd_get_section_flags (stdoutput, symsec) & SEC_LINK_ONCE) - != 0)) + if (symsec != sec) { - fixp->fx_addsy->sy_used_in_reloc = 1; + boolean linkonce; + + linkonce = false; +#ifdef BFD_ASSEMBLER + if ((bfd_get_section_flags (stdoutput, symsec) & SEC_LINK_ONCE) + != 0) + linkonce = true; +#endif +#ifdef OBJ_ELF + /* The GNU toolchain uses an extension for ELF: a section + beginning with the magic string .gnu.linkonce is a + linkonce section. */ + if (strncmp (segment_name (symsec), ".gnu.linkonce", + sizeof ".gnu.linkonce" - 1) == 0) + linkonce = true; +#endif + + if (linkonce) + { + fixp->fx_addsy->sy_used_in_reloc = 1; #ifdef UNDEFINED_DIFFERENCE_OK - if (fixp->fx_subsy != NULL) - fixp->fx_subsy->sy_used_in_reloc = 1; + if (fixp->fx_subsy != NULL) + fixp->fx_subsy->sy_used_in_reloc = 1; #endif - goto done; + goto done; + } } -#endif /* Since we're reducing to section symbols, don't attempt to reduce anything that's already using one. */ |