ld: Lookup section in output with the same name

When there are more than one input sections with the same section name,
SECNAME, linker picks the first one to define __start_SECNAME and
__stop_SECNAME symbols.  When the first input section is removed by
comdat group, we need to check if there is still an output section
with section name SECNAME.

	PR ld/23591
	* ldlang.c (undef_start_stop): Lookup section in output with
	the same name.
	* testsuite/ld-elf/pr23591.d: New file.
	* testsuite/ld-elf/pr23591a.s: Likewise.
	* testsuite/ld-elf/pr23591b.s: Likewise.
	* testsuite/ld-elf/pr23591c.s: Likewise.
This commit is contained in:
H.J. Lu 2018-08-31 09:25:31 -07:00
parent dab999b116
commit 4d1c633545
6 changed files with 88 additions and 0 deletions

View File

@ -1,3 +1,13 @@
018-08-31 H.J. Lu <hongjiu.lu@intel.com>
PR ld/23591
* ldlang.c (undef_start_stop): Lookup section in output with
the same name.
* testsuite/ld-elf/pr23591.d: New file.
* testsuite/ld-elf/pr23591a.s: Likewise.
* testsuite/ld-elf/pr23591b.s: Likewise.
* testsuite/ld-elf/pr23591c.s: Likewise.
2018-08-31 H.J. Lu <hongjiu.lu@intel.com>
* testsuite/ld-i386/i386.exp: Also run for x86_64-*-elf* targets.

View File

@ -6097,6 +6097,24 @@ undef_start_stop (struct bfd_link_hash_entry *h)
|| strcmp (h->u.def.section->name,
h->u.def.section->output_section->name) != 0)
{
asection *sec = bfd_get_section_by_name (link_info.output_bfd,
h->u.def.section->name);
if (sec != NULL)
{
/* When there are more than one input sections with the same
section name, SECNAME, linker picks the first one to define
__start_SECNAME and __stop_SECNAME symbols. When the first
input section is removed by comdat group, we need to check
if there is still an output section with section name
SECNAME. */
asection *i;
for (i = sec->map_head.s; i != NULL; i = i->map_head.s)
if (strcmp (h->u.def.section->name, i->name) == 0)
{
h->u.def.section = i;
return;
}
}
h->type = bfd_link_hash_undefined;
h->u.undef.abfd = NULL;
}

View File

@ -0,0 +1,9 @@
#source: pr23591a.s
#source: pr23591b.s
#source: pr23591c.s
#ld: -e _start
#readelf: -sW
#...
+[0-9]+: +[a-f0-9]+ +0 +NOTYPE +GLOBAL +HIDDEN +[0-9]+ +___?start___sancov_cntrs
#pass

View File

@ -0,0 +1,14 @@
.ifdef UNDERSCORE
.hidden ___start___sancov_cntrs
.else
.hidden __start___sancov_cntrs
.endif
.text
.globl _start
.type _start, %function
_start:
.ifdef UNDERSCORE
.dc.a ___start___sancov_cntrs
.else
.dc.a __start___sancov_cntrs
.endif

View File

@ -0,0 +1,11 @@
.section .text,"axG",%progbits,foo1,comdat
.ifdef UNDERSCORE
.globl _foo1
.type _foo1, %function
_foo1:
.else
.globl foo1
.type foo1, %function
foo1:
.endif
.byte 0

View File

@ -0,0 +1,26 @@
.section __sancov_cntrs,"aG",%progbits,foo1,comdat
.long 0
.section .text,"axG",%progbits,foo1,comdat
.ifdef UNDERSCORE
.globl _foo1
.type _foo1, %function
_foo1:
.else
.globl foo1
.type foo1, %function
foo1:
.endif
.long 0
.section __sancov_cntrs,"aG",%progbits,foo2,comdat
.long 1
.section .text,"axG",%progbits,foo2,comdat
.ifdef UNDERSCORE
.globl _foo2
.type _foo2, %function
_foo2:
.long 1
.else
.globl foo2
.type foo2, %function
foo2:
.endif