Don't merge 2 sections with different SHF_EXCLUDE
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 29 Sep 2016 19:58:29 +0000 (12:58 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 29 Sep 2016 19:58:40 +0000 (12:58 -0700)
SEC_EXCLUDE is ignored when doing a relocatable link.  But we can't
merge 2 input sections with the same name when only one of them has
SHF_EXCLUDE.

PR ld/20528
* emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Don't
merge 2 sections with different SHF_EXCLUDE.
* testsuite/ld-elf/pr20528a.d: New file.
* testsuite/ld-elf/pr20528a.s: Likewise.
* testsuite/ld-elf/pr20528b.d: Likewise.
* testsuite/ld-elf/pr20528b.s: Likewise.

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

index 988cb6579474bb00292d5ada96b523b09d66d0af..c5367a31f7211f58c96c8c647710eabf07e8ef2c 100644 (file)
@@ -1,3 +1,13 @@
+2016-09-29  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/20528
+       * emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Don't
+       merge 2 sections with different SHF_EXCLUDE.
+       * testsuite/ld-elf/pr20528a.d: New file.
+       * testsuite/ld-elf/pr20528a.s: Likewise.
+       * testsuite/ld-elf/pr20528b.d: Likewise.
+       * testsuite/ld-elf/pr20528b.s: Likewise.
+
 2016-09-28  Christophe Lyon  <christophe.lyon@linaro.org>
 
        PR ld/20608
index 8461b1d1302629174c4e5c844fc5d21f7cef3570..2815a3e461a92f5eab666d84ad6a851a57d54272 100644 (file)
@@ -1907,9 +1907,16 @@ gld${EMULATION_NAME}_place_orphan (asection *s,
           lang_insert_orphan to create a new output section.  */
        constraint = SPECIAL;
 
+       /* SEC_EXCLUDE is cleared when doing a relocatable link.  But
+          we can't merge 2 input sections with the same name when only
+          one of them has SHF_EXCLUDE.  */
        if (os->bfd_section != NULL
            && (os->bfd_section->flags == 0
-               || (((s->flags ^ os->bfd_section->flags)
+               || ((!bfd_link_relocatable (&link_info)
+                    || (((elf_section_flags (s)
+                         ^ elf_section_flags (os->bfd_section))
+                        & SHF_EXCLUDE) == 0))
+                   && ((s->flags ^ os->bfd_section->flags)
                     & (SEC_LOAD | SEC_ALLOC)) == 0
                    && _bfd_elf_match_sections_by_type (link_info.output_bfd,
                                                        os->bfd_section,
diff --git a/ld/testsuite/ld-elf/pr20528a.d b/ld/testsuite/ld-elf/pr20528a.d
new file mode 100644 (file)
index 0000000..00d0a7a
--- /dev/null
@@ -0,0 +1,9 @@
+#source: pr20528a.s
+#source: pr20528b.s
+#ld: -r
+#readelf: -S --wide
+
+#...
+[      ]*\[.*\][       ]+\.text.startup[       ]+PROGBITS.*[   ]+AX[   ]+.*
+[      ]*\[.*\][       ]+\.text.startup[       ]+PROGBITS.*[   ]+AXE[   ]+.*
+#pass
diff --git a/ld/testsuite/ld-elf/pr20528a.s b/ld/testsuite/ld-elf/pr20528a.s
new file mode 100644 (file)
index 0000000..523bc6f
--- /dev/null
@@ -0,0 +1,6 @@
+        .text
+        .section        .text.startup,"ax",%progbits
+        .globl  main
+        .type   main, %function
+main:
+       .byte 0
diff --git a/ld/testsuite/ld-elf/pr20528b.d b/ld/testsuite/ld-elf/pr20528b.d
new file mode 100644 (file)
index 0000000..3ae6153
--- /dev/null
@@ -0,0 +1,9 @@
+#source: pr20528b.s
+#source: pr20528a.s
+#ld: -r
+#readelf: -S --wide
+
+#...
+[      ]*\[.*\][       ]+\.text.startup[       ]+PROGBITS.*[   ]+AXE[   ]+.*
+[      ]*\[.*\][       ]+\.text.startup[       ]+PROGBITS.*[   ]+AX[   ]+.*
+#pass
diff --git a/ld/testsuite/ld-elf/pr20528b.s b/ld/testsuite/ld-elf/pr20528b.s
new file mode 100644 (file)
index 0000000..9c41e8b
--- /dev/null
@@ -0,0 +1,6 @@
+        .text
+        .section        .text.startup,"axe",%progbits
+        .globl  main1
+        .type   main1, %function
+main1:
+       .byte 0