diff options
author | Jan Beulich <jbeulich@suse.com> | 2021-03-04 16:56:02 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2021-03-04 16:56:02 +0100 |
commit | 6b5465b917ed37f7ce5e9bc0b91e07e7adaf101a (patch) | |
tree | 423f20bd44c045feca2d7dc4ee156225588e6f16 | |
parent | 6fa7408d72b3805536e3579ba46b48f07f2e780a (diff) | |
download | gdb-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/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/coffcode.h | 15 |
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 */ |