]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
elf: Clear entsize when clearing SEC_MERGE|SEC_STRINGS
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 20 Aug 2025 19:27:53 +0000 (12:27 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 20 Aug 2025 23:27:22 +0000 (16:27 -0700)
When generating an output from input SEC_MERGE|SEC_STRINGS sections with
different entsizes, we clear the SEC_MERGE|SEC_STRINGS bits.  We also need
to clear entsize.

PR ld/33291
* ldlang.c (lang_add_section): Clearing entsize when clearing
SEC_MERGE|SEC_STRINGS.
* testsuite/ld-elf/pr33291.d: New file.
* testsuite/ld-elf/pr33291a.s: Likewise.
* testsuite/ld-elf/pr33291b.s: Likewise.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
ld/ldlang.c
ld/testsuite/ld-elf/pr33291.d [new file with mode: 0644]
ld/testsuite/ld-elf/pr33291a.s [new file with mode: 0644]
ld/testsuite/ld-elf/pr33291b.s [new file with mode: 0644]

index 8ba95b04e2306b79b3105df25f588ff8812d6aff..0bb4a17df199a1dc8a1bbf12a603796f1abcc428 100644 (file)
@@ -2861,6 +2861,7 @@ lang_add_section (lang_statement_list_type *ptr,
              && output->bfd_section->entsize != section->entsize))
        {
          output->bfd_section->flags &= ~ (SEC_MERGE | SEC_STRINGS);
+         output->bfd_section->entsize = 0;
          flags &= ~ (SEC_MERGE | SEC_STRINGS);
        }
     }
diff --git a/ld/testsuite/ld-elf/pr33291.d b/ld/testsuite/ld-elf/pr33291.d
new file mode 100644 (file)
index 0000000..22a8336
--- /dev/null
@@ -0,0 +1,9 @@
+#source: pr33291a.s
+#source: pr33291b.s
+#ld: -shared
+#readelf: -S --wide
+#xfail: ![check_shared_lib_support]
+
+#...
+  \[[ 0-9]+\] \.rodata[        ]+PROGBITS[     ]+[0-9a-f]+ [0-9a-f]+ 0+9 00 +A +0 +0 +8
+#...
diff --git a/ld/testsuite/ld-elf/pr33291a.s b/ld/testsuite/ld-elf/pr33291a.s
new file mode 100644 (file)
index 0000000..587c0fb
--- /dev/null
@@ -0,0 +1,8 @@
+       .globl  foo
+       .section        .rodata.cst8,"aM",%progbits,8
+       .p2align 3
+       .type   foo, %object
+       .size   foo, 8
+foo:
+       .quad   131073
+       .section        .note.GNU-stack,"",%progbits
diff --git a/ld/testsuite/ld-elf/pr33291b.s b/ld/testsuite/ld-elf/pr33291b.s
new file mode 100644 (file)
index 0000000..69f6b3d
--- /dev/null
@@ -0,0 +1,7 @@
+       .globl  bar
+       .section        .rodata.cst1,"aM",%progbits,1
+       .type   bar, %object
+       .size   bar, 1
+bar:
+       .byte   1
+       .section        .note.GNU-stack,"",%progbits