aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog4
-rw-r--r--gas/write.c34
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. */