From: H.J. Lu Date: Thu, 13 Mar 2025 18:52:00 +0000 (-0700) Subject: elf: Clear the SEC_ALLOC bit for NOLOAD note sections X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d87be451ebbf831d44ac168ca9ea2b79ab5a79b3;p=thirdparty%2Fbinutils-gdb.git elf: Clear the SEC_ALLOC bit for NOLOAD note sections When generating an ELF output file, if a note section is marked as NOLOAD, clear the SEC_ALLOC bit so that it won't be treated as an SHF_ALLOC section, like a .bss style section. PR ld/32787 * ld.texi: Update NOLOAD for ELF output files. * ldlang.c (lang_add_section): Clear the SEC_ALLOC bit for NOLOAD note sections for ELF output files. * testsuite/ld-elf/pr32787.d: New file. * testsuite/ld-elf/pr32787.t: Likewise. Signed-off-by: H.J. Lu --- diff --git a/ld/ld.texi b/ld/ld.texi index 6d51ccbe572..b85d8103b9f 100644 --- a/ld/ld.texi +++ b/ld/ld.texi @@ -5965,7 +5965,13 @@ parentheses. The following types are defined: @item NOLOAD The section should be marked as not loadable, so that it will not be -loaded into memory when the program is run. +loaded into memory when the program is run. When generating an ELF +output file, the memory space is allocated for the section at run-time, +except for SHT_NOTE sections. For other output files, no memory space +is allocated at run-time. + +Note - the ELF behaviour is a bug that may change to be consistent +with non-ELF targets. @item READONLY The section should be marked as read-only. diff --git a/ld/ldlang.c b/ld/ldlang.c index 011c5262f87..0048dfa4911 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -2827,8 +2827,10 @@ lang_add_section (lang_statement_list_type *ptr, /* Unfortunately GNU ld has managed to evolve two different meanings to NOLOAD in scripts. ELF gets a .bss style noload, alloc, no contents section. All others get a noload, noalloc - section. */ - if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour) + section. Unlike a .bss style section, if a note section is + marked as NOLOAD, also clear SEC_ALLOC. */ + if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour + && elf_section_type (section) != SHT_NOTE) flags &= ~SEC_HAS_CONTENTS; else flags &= ~SEC_ALLOC; diff --git a/ld/testsuite/ld-elf/pr32787.d b/ld/testsuite/ld-elf/pr32787.d new file mode 100644 index 00000000000..8d07b8d7914 --- /dev/null +++ b/ld/testsuite/ld-elf/pr32787.d @@ -0,0 +1,9 @@ +#source: start.s +#ld: --build-id -T pr32787.t +#nm: -n +# The following targets don't support --build-id. +#xfail: [uses_genelf] + +#... +.* start +#pass diff --git a/ld/testsuite/ld-elf/pr32787.t b/ld/testsuite/ld-elf/pr32787.t new file mode 100644 index 00000000000..cf5aeb18ad1 --- /dev/null +++ b/ld/testsuite/ld-elf/pr32787.t @@ -0,0 +1,12 @@ +SECTIONS { + . = SIZEOF_HEADERS; + .text : { + *(.text) + } + .data : { + _data_start = .; + *(.data) + } + .note.gnu.build-id (NOLOAD) : { *(.note.gnu.build-id) } + /DISCARD/ : { *(*) } +}