ld -r: Don't merge with member of output section group
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 18 Jul 2019 15:01:45 +0000 (08:01 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 18 Jul 2019 15:01:54 +0000 (08:01 -0700)
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.

ld/ChangeLog
ld/emultempl/elf32.em
ld/testsuite/ld-elf/pr24819.d [new file with mode: 0644]
ld/testsuite/ld-elf/pr24819.s [new file with mode: 0644]

index 4f15124fcd031b90d38f50c7ce1927591af84a5c..782d426ad08db8ad6c68c070228fe8bb419bffc6 100644 (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.
index 3e8ee4693e67851e9f497a7393784a8c17bbf8bd..f3c6e3adeee5d78b6c0a8b764eed299be1424fc4 100644 (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);
diff --git a/ld/testsuite/ld-elf/pr24819.d b/ld/testsuite/ld-elf/pr24819.d
new file mode 100644 (file)
index 0000000..0a82b63
--- /dev/null
@@ -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 (file)
index 0000000..08ba2b8
--- /dev/null
@@ -0,0 +1,4 @@
+       .section        .data.foo,"awG",%progbits,.group1,comdat
+       .byte 0
+       .section        .data.foo,"aw",%progbits
+       .byte 0