[binutils-gdb/binutils-2_36-branch] ld/elf: Ignore section symbols when matching linkonce with comdat

H.J. Lu hjl@sourceware.org
Mon Jan 18 12:53:35 GMT 2021


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

commit 31768fcb32e1d72fa99fdcedfc967f5437ef81a5
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Sun Jan 17 20:01:16 2021 -0800

    ld/elf: Ignore section symbols when matching linkonce with comdat
    
    When deciding if a single member comdat group section in file FOO should
    be discarded by a linkonce section in file BAR, we check if 2 sections
    define the same set of local and global symbols.  When only one of the
    files doesn't contain the unused section symbols in the symbol table,
    such as object files generated by clang or GNU assembler with
    
    commit d1bcae833b32f1408485ce69f844dcd7ded093a8
    Author: H.J. Lu <hjl.tools@gmail.com>
    Date:   Thu Jan 7 06:42:00 2021 -0800
    
        ELF: Don't generate unused section symbols
    
    the check will fail since one file has the extra unused section symbols.
    We should ignore both undefined and section symbols in the symbol table
    when making such a decision.
    
    bfd/
    
            PR ld/27193
            * elflink.c (elf_create_symbuf): Also ignore section symbols.
    
    ld/
    
            PR ld/27193
            * testsuite/ld-i386/i386.exp: Run PR ld/27193 test.
            * testsuite/ld-i386/pr27193.dd: New file.
            * testsuite/ld-i386/pr27193a.o.bz2: Likewise.
            * testsuite/ld-i386/pr27193b.s: Likewise.
    
    (cherry picked from commit 994b25132814f4c2be93ce53a616a74139c4cf3c)

Diff:
---
 bfd/ChangeLog                       |   5 +++++
 bfd/elflink.c                       |   6 +++++-
 ld/ChangeLog                        |   8 ++++++++
 ld/testsuite/ld-i386/i386.exp       |   5 +++++
 ld/testsuite/ld-i386/pr27193.dd     |   5 +++++
 ld/testsuite/ld-i386/pr27193a.o.bz2 | Bin 0 -> 468 bytes
 ld/testsuite/ld-i386/pr27193b.s     |   8 ++++++++
 7 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 4af18e9bc90..eeb5fb4632f 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2021-01-18  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR ld/27193
+	* elflink.c (elf_create_symbuf): Also ignore section symbols.
+
 2021-01-18  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR ld/23169
diff --git a/bfd/elflink.c b/bfd/elflink.c
index acc959d526a..27564adb8c3 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -8126,8 +8126,12 @@ elf_create_symbuf (size_t symcount, Elf_Internal_Sym *isymbuf)
   if (indbuf == NULL)
     return NULL;
 
+  /* NB: When checking if 2 sections define the same set of local and
+     global symbols, ignore both undefined and section symbols in the
+     symbol table.  */
   for (ind = indbuf, i = 0; i < symcount; i++)
-    if (isymbuf[i].st_shndx != SHN_UNDEF)
+    if (isymbuf[i].st_shndx != SHN_UNDEF
+	&& ELF_ST_TYPE (isymbuf[i].st_info) != STT_SECTION)
       *ind++ = &isymbuf[i];
   indbufend = ind;
 
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 6bd5477229d..6b437fed243 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,11 @@
+2021-01-18  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR ld/27193
+	* testsuite/ld-i386/i386.exp: Run PR ld/27193 test.
+	* testsuite/ld-i386/pr27193.dd: New file.
+	* testsuite/ld-i386/pr27193a.o.bz2: Likewise.
+	* testsuite/ld-i386/pr27193b.s: Likewise.
+
 2021-01-18  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR ld/23169
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
index 655f83df53a..9bfc70c9fb9 100644
--- a/ld/testsuite/ld-i386/i386.exp
+++ b/ld/testsuite/ld-i386/i386.exp
@@ -245,6 +245,11 @@ set i386tests {
      "-melf_i386 -shared -Bsymbolic -z notext" ""
      "--32 -mx86-used-note=yes"
      { pr19827a.S }  {{readelf {-rW} pr19827.rd}} "pr19827.so"}
+    {"Build pr27193.so"
+     "-melf_i386 -shared" ""
+     "--32"
+     { pr27193a.o.bz2 pr27193b.s }
+     {{objdump {-dw} pr27193.dd}} "pr27193.so"}
 }
 
 proc iamcu_tests {} {
diff --git a/ld/testsuite/ld-i386/pr27193.dd b/ld/testsuite/ld-i386/pr27193.dd
new file mode 100644
index 00000000000..7d1e7993de0
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr27193.dd
@@ -0,0 +1,5 @@
+#...
+0+[a-f0-9]+ <__x86.get_pc_thunk.bx>:
+ +[a-f0-9]+:	8b 1c 24             	mov    \(%esp\),%ebx
+ +[a-f0-9]+:	c3                   	ret    
+#pass
diff --git a/ld/testsuite/ld-i386/pr27193a.o.bz2 b/ld/testsuite/ld-i386/pr27193a.o.bz2
new file mode 100644
index 00000000000..365899db9d5
Binary files /dev/null and b/ld/testsuite/ld-i386/pr27193a.o.bz2 differ
diff --git a/ld/testsuite/ld-i386/pr27193b.s b/ld/testsuite/ld-i386/pr27193b.s
new file mode 100644
index 00000000000..9b27a6f7631
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr27193b.s
@@ -0,0 +1,8 @@
+	 .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
+	.p2align 4
+__x86.get_pc_thunk.bx:
+	mov	(%esp),%ebx
+	ret


More information about the Binutils-cvs mailing list