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 d1bcae833b
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.
This commit is contained in:
H.J. Lu 2021-01-17 20:01:16 -08:00
parent 25294ff049
commit 994b251328
7 changed files with 36 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2021-01-17 H.J. Lu <hongjiu.lu@intel.com>
PR ld/27193
* elflink.c (elf_create_symbuf): Also ignore section symbols.
2021-01-16 H.J. Lu <hongjiu.lu@intel.com>
PR ld/23169

View File

@ -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;

View File

@ -1,3 +1,11 @@
2021-01-17 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-16 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/23460

View File

@ -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 {} {

View File

@ -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

Binary file not shown.

View File

@ -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