elf: Get the real kept section
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 26 Nov 2020 00:14:13 +0000 (16:14 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 26 Nov 2020 00:14:29 +0000 (16:14 -0800)
When mixing linkonce and comdat sections, we need to keep searching to
get the real kept section.

bfd/

PR ld/26936
* elflink.c (_bfd_elf_check_kept_section): Get the real kept
section.

ld/

PR ld/26936
* testsuite/ld-elf/pr26936.d: New file.
* testsuite/ld-elf/pr26936a.s: Likewise.
* testsuite/ld-elf/pr26936b.s: Likewise.
* testsuite/ld-elf/pr26936c.s: Likewise.

bfd/ChangeLog
bfd/elflink.c
ld/ChangeLog
ld/testsuite/ld-elf/pr26936.d [new file with mode: 0644]
ld/testsuite/ld-elf/pr26936a.s [new file with mode: 0644]
ld/testsuite/ld-elf/pr26936b.s [new file with mode: 0644]
ld/testsuite/ld-elf/pr26936c.s [new file with mode: 0644]

index d47d518a2a9b0574f4a933dad307600cb9edd18a..eeb0b81f2e757a57211e35af42bcba3d31366bbb 100644 (file)
@@ -1,3 +1,9 @@
+2020-11-25  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/26936
+       * elflink.c (_bfd_elf_check_kept_section): Get the real kept
+       section.
+
 2020-11-23  Nick Clifton  <nickc@redhat.com>
 
        PR 26931
index 7ba667a824821cbd6af9c134c1beb57c2c0cdc18..0fbebca372ffe3a9f1ad2d2d6a8ff47d9759cfd2 100644 (file)
@@ -10698,10 +10698,21 @@ _bfd_elf_check_kept_section (asection *sec, struct bfd_link_info *info)
     {
       if ((kept->flags & SEC_GROUP) != 0)
        kept = match_group_member (sec, kept, info);
-      if (kept != NULL
-         && ((sec->rawsize != 0 ? sec->rawsize : sec->size)
-             != (kept->rawsize != 0 ? kept->rawsize : kept->size)))
-       kept = NULL;
+      if (kept != NULL)
+       {
+         if ((sec->rawsize != 0 ? sec->rawsize : sec->size)
+             != (kept->rawsize != 0 ? kept->rawsize : kept->size))
+           kept = NULL;
+         else
+           {
+             /* Get the real kept section.  */
+             asection *next;
+             for (next = kept->kept_section;
+                  next != NULL;
+                  next = next->kept_section)
+               kept = next;
+           }
+       }
       sec->kept_section = kept;
     }
   return kept;
index d7280efb36a45bc896561ae931a4ad08b1ace84c..005d54e80da9a235ae7ad82d0d36ead1506264a8 100644 (file)
@@ -1,3 +1,11 @@
+2020-11-25  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/26936
+       * testsuite/ld-elf/pr26936.d: New file.
+       * testsuite/ld-elf/pr26936a.s: Likewise.
+       * testsuite/ld-elf/pr26936b.s: Likewise.
+       * testsuite/ld-elf/pr26936c.s: Likewise.
+
 2020-11-25  Alan Modra  <amodra@gmail.com>
 
        * ldlang.c (lang_output_section_statement_lookup): Change "create"
diff --git a/ld/testsuite/ld-elf/pr26936.d b/ld/testsuite/ld-elf/pr26936.d
new file mode 100644 (file)
index 0000000..b007e83
--- /dev/null
@@ -0,0 +1,12 @@
+#source: pr26936a.s
+#source: pr26936b.s
+#source: pr26936c.s
+#as: -g
+#ld: -z noseparate-code -Ttext-segment 0x10000 -z max-page-size=0x1000
+#readelf: -wL
+
+#...
+CU: .*/pr26936c.s:
+File name +Line number +Starting address +View +Stmt
+pr26936c.s +6 +0x10[0-9a-f][0-9a-f][0-9a-f] +x
+#pass
diff --git a/ld/testsuite/ld-elf/pr26936a.s b/ld/testsuite/ld-elf/pr26936a.s
new file mode 100644 (file)
index 0000000..24b90da
--- /dev/null
@@ -0,0 +1,6 @@
+       .section .gnu.linkonce.t.__x86.get_pc_thunk.bx,"ax",%progbits
+       .globl  __x86.get_pc_thunk.bx
+       .hidden __x86.get_pc_thunk.bx
+       .type   __x86.get_pc_thunk.bx, %function
+__x86.get_pc_thunk.bx:
+       .nop
diff --git a/ld/testsuite/ld-elf/pr26936b.s b/ld/testsuite/ld-elf/pr26936b.s
new file mode 100644 (file)
index 0000000..433528c
--- /dev/null
@@ -0,0 +1,11 @@
+       .text
+       .globl _start
+_start:
+       .type   _start, %function
+       .nop
+       .section .text.__x86.get_pc_thunk.bx,"axG",%progbits,__x86.get_pc_thunk.bx,comdat
+       .globl  __x86.get_pc_thunk.bx
+       .hidden __x86.get_pc_thunk.bx
+       .type   __x86.get_pc_thunk.bx, %function
+__x86.get_pc_thunk.bx:
+       .nop
diff --git a/ld/testsuite/ld-elf/pr26936c.s b/ld/testsuite/ld-elf/pr26936c.s
new file mode 100644 (file)
index 0000000..379cb71
--- /dev/null
@@ -0,0 +1,6 @@
+       .section .text.__x86.get_pc_thunk.bx,"axG",%progbits,__x86.get_pc_thunk.bx,comdat
+       .globl  __x86.get_pc_thunk.bx
+       .hidden __x86.get_pc_thunk.bx
+       .type   __x86.get_pc_thunk.bx, %function
+__x86.get_pc_thunk.bx:
+       .nop