ld -r: Don't merge with member of output section group

When doing a relocatable link, members of input section group are
placed in their own output sections.  We need to make sure that no
input sections are merged with member of output section group.

	PR ld/24819
	* emultempl/elf32.em (elf_orphan_compatible): Return FALSE for
	member of output section group when doing a relocatable link.
	* testsuite/ld-elf/pr24819.d: New file.
	* testsuite/ld-elf/pr24819.s: Likewise.
This commit is contained in:
H.J. Lu 2019-07-18 08:01:45 -07:00
parent 71c4e95abe
commit 54d7dae59a
4 changed files with 26 additions and 3 deletions

View File

@ -1,3 +1,11 @@
2019-07-18 H.J. Lu <hongjiu.lu@intel.com>
PR ld/24819
* emultempl/elf32.em (elf_orphan_compatible): Return FALSE for
member of output section group when doing a relocatable link.
* testsuite/ld-elf/pr24819.d: New file.
* testsuite/ld-elf/pr24819.s: Likewise.
2019-07-13 Alan Modra <amodra@gmail.com>
* testsuite/ld-powerpc/tlsso.r: Update.

View File

@ -2028,10 +2028,13 @@ elf_orphan_compatible (asection *in, asection *out)
if (elf_section_data (out)->this_hdr.sh_info
!= elf_section_data (in)->this_hdr.sh_info)
return FALSE;
/* We can't merge two sections with differing SHF_EXCLUDE when doing
a relocatable link. */
/* We can't merge with member of output section group nor merge two
sections with differing SHF_EXCLUDE when doing a relocatable link.
*/
if (bfd_link_relocatable (&link_info)
&& ((elf_section_flags (out) ^ elf_section_flags (in)) & SHF_EXCLUDE) != 0)
&& (elf_next_in_group (out) != NULL
|| ((elf_section_flags (out) ^ elf_section_flags (in))
& SHF_EXCLUDE) != 0))
return FALSE;
return _bfd_elf_match_sections_by_type (link_info.output_bfd, out,
in->owner, in);

View File

@ -0,0 +1,8 @@
#ld: -r
#readelf: -S --wide
#...
\[[ 0-9]+\] \.data\.foo[ \t]+PROGBITS[ \t0-9a-f]+WAG .*
#...
\[[ 0-9]+\] \.data\.foo[ \t]+PROGBITS[ \t0-9a-f]+WA .*
#pass

View File

@ -0,0 +1,4 @@
.section .data.foo,"awG",%progbits,.group1,comdat
.byte 0
.section .data.foo,"aw",%progbits
.byte 0