1999-07-21 Mark Elbrecht <snowball3@bigfoot.com>
authorIan Lance Taylor <ian@airs.com>
Thu, 22 Jul 1999 01:39:23 +0000 (01:39 +0000)
committerIan Lance Taylor <ian@airs.com>
Thu, 22 Jul 1999 01:39:23 +0000 (01:39 +0000)
* coffcode.h (styp_to_sec_flags): If COFF_LONG_SECTION_NAMES and
COFF_SUPPORT_GNU_LINKONCE, mark sections whose names begin with
.gnu.linkonce with SEC_LINKONCE and SEC_LINK_DUPLICATES_DISCARD.
* coff-go32.c: (COFF_LONG_SECTION_NAMES): Define.
(COFF_SUPPORT_GNU_LINKONCE): Define.
* coff-stgo32.c: (COFF_LONG_SECTION_NAMES): Define.
(COFF_SUPPORT_GNU_LINKONCE): Define.

bfd/ChangeLog
bfd/coff-go32.c
bfd/coff-stgo32.c
bfd/coffcode.h

index 9448475b81a1cdaa46c9a3d201830e616bb757cc..2535b9e9da2f471150bdbdc3edce656cd61b8716 100644 (file)
@@ -1,3 +1,13 @@
+1999-07-21  Mark Elbrecht  <snowball3@bigfoot.com>
+
+       * coffcode.h (styp_to_sec_flags): If COFF_LONG_SECTION_NAMES and
+       COFF_SUPPORT_GNU_LINKONCE, mark sections whose names begin with
+       .gnu.linkonce with SEC_LINKONCE and SEC_LINK_DUPLICATES_DISCARD.
+       * coff-go32.c: (COFF_LONG_SECTION_NAMES): Define.
+       (COFF_SUPPORT_GNU_LINKONCE): Define.
+       * coff-stgo32.c: (COFF_LONG_SECTION_NAMES): Define.
+       (COFF_SUPPORT_GNU_LINKONCE): Define.
+
 1999-07-21  Ian Lance Taylor  <ian@zembu.com>
 
        From Mark Elbrecht:
index be4adb24f52972184620bf50b85f04ecc7bd2a16..0b783a07a7d44bb429cc76bf73842beb0b3ff1d8 100644 (file)
@@ -21,5 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #define TARGET_SYM             go32coff_vec
 #define TARGET_NAME            "coff-go32"
 #define TARGET_UNDERSCORE      '_'
+#define COFF_LONG_SECTION_NAMES
+#define COFF_SUPPORT_GNU_LINKONCE
 
 #include "coff-i386.c"
index f1d38ba801a8d6f660be0aaf799b50dd7f2c9a10..1868f673c56e55177137f0a44c2015b3e6bbee39 100644 (file)
@@ -39,6 +39,8 @@
 #define TARGET_NAME            "coff-go32-exe"
 #define TARGET_UNDERSCORE      '_'
 #define COFF_GO32_EXE
+#define COFF_LONG_SECTION_NAMES
+#define COFF_SUPPORT_GNU_LINKONCE
 
 #include "bfd.h"
 
index f905c940a266533b227a17781e63f81051b4b876..185cbcf17de3a7dee2f55fcc0d6f416d4623256b 100644 (file)
@@ -687,6 +687,17 @@ styp_to_sec_flags (abfd, hdr, name)
     }
 #endif
 
+#if defined (COFF_LONG_SECTION_NAMES) && defined (COFF_SUPPORT_GNU_LINKONCE)
+  /* As a GNU extension, if the name begins with .gnu.linkonce, we
+     only link a single copy of the section.  This is used to support
+     g++.  g++ will emit each template expansion in its own section.
+     The symbols will be defined as weak, so that multiple definitions
+     are permitted.  The GNU linker extension is to actually discard
+     all but one of the sections.  */
+  if (strncmp (name, ".gnu.linkonce", sizeof ".gnu.linkonce" - 1) == 0)
+    sec_flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
+#endif
+
   return (sec_flags);
 }