[binutils-gdb] elf: Get the real kept section

H.J. Lu hjl@sourceware.org
Thu Nov 26 00:23:29 GMT 2020


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=58349d00f461904f20dae88d48c1fda11cbb47bc

commit 58349d00f461904f20dae88d48c1fda11cbb47bc
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Wed Nov 25 16:14:13 2020 -0800

    elf: Get the real kept section
    
    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.

Diff:
---
 bfd/ChangeLog                  |  6 ++++++
 bfd/elflink.c                  | 19 +++++++++++++++----
 ld/ChangeLog                   |  8 ++++++++
 ld/testsuite/ld-elf/pr26936.d  | 12 ++++++++++++
 ld/testsuite/ld-elf/pr26936a.s |  6 ++++++
 ld/testsuite/ld-elf/pr26936b.s | 11 +++++++++++
 ld/testsuite/ld-elf/pr26936c.s |  6 ++++++
 7 files changed, 64 insertions(+), 4 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index d47d518a2a9..eeb0b81f2e7 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 7ba667a8248..0fbebca372f 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -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;
diff --git a/ld/ChangeLog b/ld/ChangeLog
index d7280efb36a..005d54e80da 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -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
index 00000000000..b007e83ff20
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr26936.d
@@ -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
index 00000000000..24b90daa20b
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr26936a.s
@@ -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
index 00000000000..433528c33e9
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr26936b.s
@@ -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
index 00000000000..379cb71d159
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr26936c.s
@@ -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


More information about the Binutils-cvs mailing list