* write.c (adjust_reloc_syms): Fix linkonce check for ELF.
authorIan Lance Taylor <ian@airs.com>
Sun, 15 Dec 1996 20:27:08 +0000 (20:27 +0000)
committerIan Lance Taylor <ian@airs.com>
Sun, 15 Dec 1996 20:27:08 +0000 (20:27 +0000)
gas/ChangeLog
gas/write.c

index 917bbab6d7fd6d222aa0e4595aae7f1d5f0938f0..d9c2e38dcd5d3f82ac9702a769b48be9f546beaf 100644 (file)
@@ -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.
index daf8738ba913776d101070a5b6e615ee067cb894..ab026f1f5a9f2e8d2a899f0bad98ee82b4802694 100644 (file)
@@ -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.  */