diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2011-09-29 00:13:14 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2011-09-29 00:13:14 +0000 |
commit | 54e8959c602eddaf8e7c895445610b6f40c92f56 (patch) | |
tree | 93561eb42adb872d28a797f52e2a68dc25db3239 /bfd/elflink.c | |
parent | d8250e5afa23fe5c4e22f156a4a7cd8e1b490306 (diff) | |
download | gdb-54e8959c602eddaf8e7c895445610b6f40c92f56.zip gdb-54e8959c602eddaf8e7c895445610b6f40c92f56.tar.gz gdb-54e8959c602eddaf8e7c895445610b6f40c92f56.tar.bz2 |
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.
Diffstat (limited to 'bfd/elflink.c')
-rw-r--r-- | bfd/elflink.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/bfd/elflink.c b/bfd/elflink.c index 9ccf37d..a15ad27 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -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; |