aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2021-03-04 16:56:02 +0100
committerJan Beulich <jbeulich@suse.com>2021-03-04 16:56:02 +0100
commit6b5465b917ed37f7ce5e9bc0b91e07e7adaf101a (patch)
tree423f20bd44c045feca2d7dc4ee156225588e6f16
parent6fa7408d72b3805536e3579ba46b48f07f2e780a (diff)
downloadgdb-6b5465b917ed37f7ce5e9bc0b91e07e7adaf101a.zip
gdb-6b5465b917ed37f7ce5e9bc0b91e07e7adaf101a.tar.gz
gdb-6b5465b917ed37f7ce5e9bc0b91e07e7adaf101a.tar.bz2
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.
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/coffcode.h15
2 files changed, 17 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index af09b00..7379e7b 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 2fd699f..814922e 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 */