elf: Clear entsize when clearing SEC_MERGE|SEC_STRINGS

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>
This commit is contained in:
H.J. Lu
2025-08-20 12:27:53 -07:00
parent fbcdc06c23
commit 9c0adb10c7
4 changed files with 25 additions and 0 deletions

View 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);
}
}

View File

@@ -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
#...

View File

@@ -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

View File

@@ -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