]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
elf: Clear the SEC_ALLOC bit for NOLOAD note sections
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 13 Mar 2025 18:52:00 +0000 (11:52 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 14 Mar 2025 22:59:02 +0000 (15:59 -0700)
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 <hjl.tools@gmail.com>
ld/ld.texi
ld/ldlang.c
ld/testsuite/ld-elf/pr32787.d [new file with mode: 0644]
ld/testsuite/ld-elf/pr32787.t [new file with mode: 0644]

index 6d51ccbe57223a8d4d22f5deaabc80fa1189e7a0..b85d8103b9f47c49985474c2400dd989e2d56744 100644 (file)
@@ -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.
index 011c5262f870565283b059cd7a7d7dd31f8039b2..0048dfa4911ceab218d377208b2c4ca172925980 100644 (file)
@@ -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 (file)
index 0000000..8d07b8d
--- /dev/null
@@ -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 (file)
index 0000000..cf5aeb1
--- /dev/null
@@ -0,0 +1,12 @@
+SECTIONS {
+       . = SIZEOF_HEADERS;
+       .text : {
+               *(.text)
+       }
+       .data : {
+               _data_start = .;
+               *(.data)
+       }
+       .note.gnu.build-id (NOLOAD) : { *(.note.gnu.build-id) }
+       /DISCARD/ : { *(*) }
+}