[binutils-gdb] bfd: prune COFF/PE section flags setting

Jan Beulich jbeulich@sourceware.org
Thu Mar 4 15:56:54 GMT 2021


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=6b5465b917ed37f7ce5e9bc0b91e07e7adaf101a

commit 6b5465b917ed37f7ce5e9bc0b91e07e7adaf101a
Author: Jan Beulich <jbeulich@suse.com>
Date:   Thu Mar 4 16:56:02 2021 +0100

    bfd: prune COFF/PE section flags setting
    
    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.

Diff:
---
 bfd/ChangeLog  |  5 +++++
 bfd/coffcode.h | 15 ++++++++++++---
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index af09b0008a8..7379e7b80b7 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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.
diff --git a/bfd/coffcode.h b/bfd/coffcode.h
index 2fd699ff1b8..814922ee11d 100644
--- a/bfd/coffcode.h
+++ b/bfd/coffcode.h
@@ -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 */


More information about the Binutils-cvs mailing list