]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
bfd: prune COFF/PE section flags setting
authorJan Beulich <jbeulich@suse.com>
Thu, 4 Mar 2021 15:56:02 +0000 (16:56 +0100)
committerJan Beulich <jbeulich@suse.com>
Thu, 4 Mar 2021 15:56:02 +0000 (16:56 +0100)
It is my understanding that IMAGE_SCN_LNK_* are supposed to communicate
information to the (static) linker, and become at best meaningless in PE
images. I wouldn't call loaders wrong which would refuse to process
sections with any of these bits set. While there's no replacement for
IMAGE_SCN_LNK_COMDAT, use IMAGE_SCN_MEM_DISCARDABLE in place of
IMAGE_SCN_LNK_REMOVE in this case.

bfd/ChangeLog
bfd/coffcode.h

index af09b0008a8318ac53cee256c7c5ff38ca42420c..7379e7b80b7e377d13c6e1ba9e8bfa65c3e4a6c9 100644 (file)
@@ -1,3 +1,8 @@
+2021-03-04  Jan Beulich  <jbeulich@suse.com>
+
+       * coffcode.h (sec_to_styp_flags): Don't set IMAGE_SCN_LNK_* in
+       final PE images.
+
 2021-03-04  Alan Modra  <amodra@gmail.com>
 
        * rs6000-core.c (rs6000coff_core_p): Correct prototype.
index 2fd699ff1b82818950d858a3dce2697b42f6d4a0..814922ee11d00dfdcf05cbf0de8d828beafb77cf 100644 (file)
@@ -672,22 +672,31 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags)
   /* skip ROM */
   /* skip constRUCTOR */
   /* skip CONTENTS */
+#ifndef COFF_IMAGE_WITH_PE
+  /* I don't think any of the IMAGE_SCN_LNK_* flags set below should be set
+     when the output is PE. Only object files should have them, for the linker
+     to consume.  */
   if ((sec_flags & SEC_IS_COMMON) != 0)
     styp_flags |= IMAGE_SCN_LNK_COMDAT;
+#endif
   if ((sec_flags & SEC_DEBUGGING) != 0)
     styp_flags |= IMAGE_SCN_MEM_DISCARDABLE;
-  if ((sec_flags & SEC_EXCLUDE) != 0 && !is_dbg)
-    styp_flags |= IMAGE_SCN_LNK_REMOVE;
-  if ((sec_flags & SEC_NEVER_LOAD) != 0 && !is_dbg)
+  if ((sec_flags & (SEC_EXCLUDE | SEC_NEVER_LOAD)) != 0 && !is_dbg)
+#ifdef COFF_IMAGE_WITH_PE
+    styp_flags |= IMAGE_SCN_MEM_DISCARDABLE;
+#else
     styp_flags |= IMAGE_SCN_LNK_REMOVE;
+#endif
   /* skip IN_MEMORY */
   /* skip SORT */
+#ifndef COFF_IMAGE_WITH_PE
   if (sec_flags & SEC_LINK_ONCE)
     styp_flags |= IMAGE_SCN_LNK_COMDAT;
   if ((sec_flags
        & (SEC_LINK_DUPLICATES_DISCARD | SEC_LINK_DUPLICATES_SAME_CONTENTS
          | SEC_LINK_DUPLICATES_SAME_SIZE)) != 0)
     styp_flags |= IMAGE_SCN_LNK_COMDAT;
+#endif
 
   /* skip LINKER_CREATED */