Fix --gc-sections failure with symbol versioning.

bfd/

2011-09-28  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/13195
	* elflink.c (_bfd_elf_merge_symbol): Don't set dynamic_def when
	clearing def_dynamic.
	(elf_link_add_object_symbols): Likewise.  Set dynamic_def when
	setting def_dynamic.
	(bfd_elf_gc_mark_dynamic_ref_symbol): Check if a symbol is
	versioned.

ld/testsuite/

2011-09-28  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/13195
	* ld-elf/elf.exp: Add a C link testcase for PR ld/13195.

	* ld-elf/pr13195.c: New.
	* ld-elf/pr13195.d: Likewise.
	* ld-elf/pr13195.s: Likewise.
	* ld-elf/pr13195.t: Likewise.
This commit is contained in:
H.J. Lu 2011-09-29 00:13:14 +00:00
parent d8250e5afa
commit 54e8959c60
6 changed files with 39 additions and 5 deletions

View File

@ -1238,7 +1238,6 @@ _bfd_elf_merge_symbol (bfd *abfd,
{
h->def_dynamic = 0;
h->ref_dynamic = 1;
h->dynamic_def = 1;
}
/* FIXME: Should we check type and size for protected symbol? */
h->size = 0;
@ -4353,7 +4352,6 @@ error_free_dyn:
{
h->def_dynamic = 0;
h->ref_dynamic = 1;
h->dynamic_def = 1;
}
}
if (! info->executable
@ -4366,7 +4364,10 @@ error_free_dyn:
if (! definition)
h->ref_dynamic = 1;
else
h->def_dynamic = 1;
{
h->def_dynamic = 1;
h->dynamic_def = 1;
}
if (h->def_regular
|| h->ref_regular
|| (h->u.weakdef != NULL
@ -11914,8 +11915,9 @@ bfd_elf_gc_mark_dynamic_ref_symbol (struct elf_link_hash_entry *h, void *inf)
&& h->def_regular
&& ELF_ST_VISIBILITY (h->other) != STV_INTERNAL
&& ELF_ST_VISIBILITY (h->other) != STV_HIDDEN
&& !bfd_hide_sym_by_version (info->version_info,
h->root.root.string))))
&& (strchr (h->root.root.string, ELF_VER_CHR) != NULL
|| !bfd_hide_sym_by_version (info->version_info,
h->root.root.string)))))
h->root.u.def.section->flags |= SEC_KEEP;
return TRUE;

View File

@ -138,6 +138,11 @@ if ![isnative] {
return
}
run_cc_link_tests {
{"PR ld/13195" "-Wl,--gc-sections" ""
{pr13195.c} {} "pr13195"}
}
set array_tests {
{"preinit array" "" "" {preinit.c} "preinit" "preinit.out"}
{"init array" "" "" {init.c} "init" "init.out"}

View File

@ -0,0 +1,5 @@
int
main ()
{
return 0;
}

View File

@ -0,0 +1,10 @@
#ld: --gc-sections -shared -version-script pr13195.t
#readelf: -s --wide -D
#target: *-*-linux* *-*-gnu*
#notarget: arc-*-* d30v-*-* dlx-*-* i960-*-* or32-*-* pj*-*-*
#notarget: hppa64-*-* i370-*-* i860-*-* ia64-*-* mep-*-* mn10200-*-*
# generic linker targets don't support --gc-sections, nor do a bunch of others
#...
+[0-9]+ +[0-9]+: +[0-9a-f]+ +[0-9]+ +FUNC +GLOBAL +DEFAULT +[1-9]+ foo
#pass

View File

@ -0,0 +1,6 @@
.section .text.new_foo,"ax",%progbits
.globl new_foo
.type new_foo, %function
new_foo:
.byte 0
.symver new_foo,foo@@VERS_2.0

View File

@ -0,0 +1,6 @@
VERS_2.0 {
global:
foo;
local:
*;
};