[PATCH 2/6] bfd: prune COFF/PE section flags setting
Jan Beulich
jbeulich@suse.com
Tue Mar 2 09:47:44 GMT 2021
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/
2021-02-XX Jan Beulich <jbeulich@suse.com>
* coffcode.h (sec_to_styp_flags): Don't set IMAGE_SCN_LNK_* in
final PE images.
--- a/bfd/coffcode.h
+++ b/bfd/coffcode.h
@@ -672,22 +672,31 @@ sec_to_styp_flags (const char *sec_name,
/* 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
mailing list