ELF: Properly handle section symbols

When defining the section symbol, __start_FOO, for the section FOO:

1. Treat the common symbol, __start_FOO, in input object file as
definition.
2. Clear verinfo.verdef.

bfd/

	PR ld/26094
	* elflink.c (bfd_elf_define_start_stop): Handle common symbols.
	Clear verinfo.verdef.

ld/

	PR ld/26094
	* testsuite/ld-elf/pr26094-1.ver: New fike.
	* testsuite/ld-elf/pr26094-1a.c: Likewise.
	* testsuite/ld-elf/pr26094-1a.rd: Likewise.
	* testsuite/ld-elf/pr26094-1b.c: Likewise.
	* testsuite/ld-elf/pr26094-1b.rd: Likewise.
	* testsuite/ld-elf/pr26094-1c.c: Likewise.
	* testsuite/ld-elf/shared.exp: Run ld/26094 tests.
This commit is contained in:
H.J. Lu 2020-06-10 05:31:19 -07:00
parent 25065fcd19
commit e1b5d517d1
10 changed files with 80 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2020-06-10 H.J. Lu <hongjiu.lu@intel.com>
PR ld/26094
* elflink.c (bfd_elf_define_start_stop): Handle common symbols.
Clear verinfo.verdef.
2020-06-09 H.J. Lu <hongjiu.lu@intel.com>
PR ld/18801

View File

@ -14802,12 +14802,16 @@ bfd_elf_define_start_stop (struct bfd_link_info *info,
h = elf_link_hash_lookup (elf_hash_table (info), symbol,
FALSE, FALSE, TRUE);
/* NB: Common symbols will be turned into definition later. */
if (h != NULL
&& (h->root.type == bfd_link_hash_undefined
|| h->root.type == bfd_link_hash_undefweak
|| ((h->ref_regular || h->def_dynamic) && !h->def_regular)))
|| ((h->ref_regular || h->def_dynamic)
&& !h->def_regular
&& h->root.type != bfd_link_hash_common)))
{
bfd_boolean was_dynamic = h->ref_dynamic || h->def_dynamic;
h->verinfo.verdef = NULL;
h->root.type = bfd_link_hash_defined;
h->root.u.def.section = sec;
h->root.u.def.value = 0;

View File

@ -1,3 +1,14 @@
2020-06-10 H.J. Lu <hongjiu.lu@intel.com>
PR ld/26094
* testsuite/ld-elf/pr26094-1.ver: New fike.
* testsuite/ld-elf/pr26094-1a.c: Likewise.
* testsuite/ld-elf/pr26094-1a.rd: Likewise.
* testsuite/ld-elf/pr26094-1b.c: Likewise.
* testsuite/ld-elf/pr26094-1b.rd: Likewise.
* testsuite/ld-elf/pr26094-1c.c: Likewise.
* testsuite/ld-elf/shared.exp: Run ld/26094 tests.
2020-06-09 H.J. Lu <hongjiu.lu@intel.com>
PR ld/18801

View File

@ -0,0 +1,3 @@
SOME_VERSION_NAME {
global: *;
};

View File

@ -0,0 +1,7 @@
char foo_data __attribute__(( section("FOO") )) = { 0 };
extern void * __start_FOO;
void * foo() {
return __start_FOO;
}

View File

@ -0,0 +1,8 @@
#ld: -shared
#readelf: --dyn-syms --wide
#target: *-*-linux* *-*-gnu* arm*-*-uclinuxfdpiceabi
#xfail: ![check_shared_lib_support]
#...
+[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +NOTYPE +GLOBAL +PROTECTED +[0-9]+ +___?start_FOO@@SOME_VERSION_NAME
#pass

View File

@ -0,0 +1,6 @@
extern void *foo();
void main()
{
foo();
}

View File

@ -0,0 +1,8 @@
#ld:
#readelf: --dyn-syms --wide
#target: *-*-linux* *-*-gnu* arm*-*-uclinuxfdpiceabi
#xfail: ![check_shared_lib_support]
#...
+[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +OBJECT +GLOBAL +PROTECTED +[0-9]+ +___?start_FOO@@SOME_VERSION_NAME
#pass

View File

@ -0,0 +1,7 @@
char foo_data __attribute__(( section("FOO") )) = { 0 };
void * __start_FOO;
void * foo() {
return __start_FOO;
}

View File

@ -832,6 +832,25 @@ append build_tests {
run_cc_link_tests $build_tests
run_cc_link_tests [list \
[list \
"Build pr26094-1.so" \
"-shared -Wl,--version-script=pr26094-1.ver" \
"-fPIC" \
{pr26094-1a.c} \
{{readelf {--dyn-syms --wide} pr26094-1a.rd}} \
"pr26094-1.so" \
] \
[list \
"Build pr26094-1" \
"-Wl,--no-as-needed tmpdir/pr26094-1.so" \
"-fcommon" \
{pr26094-1b.c pr26094-1c.c} \
{{readelf {--dyn-syms --wide} pr26094-1b.rd}} \
"pr26094-1" \
] \
]
run_ld_link_tests [list \
[list \
"pr22269-1 (static pie undefined weak)" \