diff --git a/ld/ChangeLog b/ld/ChangeLog index 4f15124fcd..782d426ad0 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,11 @@ +2019-07-18 H.J. Lu + + 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 * testsuite/ld-powerpc/tlsso.r: Update. diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index 3e8ee4693e..f3c6e3adee 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -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); diff --git a/ld/testsuite/ld-elf/pr24819.d b/ld/testsuite/ld-elf/pr24819.d new file mode 100644 index 0000000000..0a82b63c39 --- /dev/null +++ b/ld/testsuite/ld-elf/pr24819.d @@ -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 diff --git a/ld/testsuite/ld-elf/pr24819.s b/ld/testsuite/ld-elf/pr24819.s new file mode 100644 index 0000000000..08ba2b8437 --- /dev/null +++ b/ld/testsuite/ld-elf/pr24819.s @@ -0,0 +1,4 @@ + .section .data.foo,"awG",%progbits,.group1,comdat + .byte 0 + .section .data.foo,"aw",%progbits + .byte 0