diff options
author | Paul Brook <paul@codesourcery.com> | 2004-11-15 23:21:27 +0000 |
---|---|---|
committer | Paul Brook <paul@codesourcery.com> | 2004-11-15 23:21:27 +0000 |
commit | fc0e6df64dd2d64f16469008668ccea697291758 (patch) | |
tree | 49da66fa6655847c298d71374872aaa31a969aa3 /bfd/elflink.c | |
parent | 2e8d14f48283a91dd8874ecaea037e904c047998 (diff) | |
download | gdb-fc0e6df64dd2d64f16469008668ccea697291758.zip gdb-fc0e6df64dd2d64f16469008668ccea697291758.tar.gz gdb-fc0e6df64dd2d64f16469008668ccea697291758.tar.bz2 |
bfd/
* elf-bfd.h (_bfd_elf_slurp_version_tables): Update prototype.
* elf.c (_bfd_elf_print_private_bfd_data): Pass extra argument.
(_bfd_elf_slurp_version_tables): Add extra argument. Create extra
default version definition for unversioned symbols.
* elfcode.h (elf_slurp_symbol_table): Pass extra argument.
* elflink.c (elf_link_add_object_symbols): Pass extra argument to
_bfd_elf_slurp_version_tables. Set default version for unversioned
imported symbols.
include/
* bfdlink.h (bfd_link_info): Add default_imported_symver.
ld/
* ld.texinfo: Document --default-imported-symver.
* ldmain.c (main): Set link_info.default_imported_symver.
* lexsup.c (option_values): Add OPTION_DEFAULT_IMPORTED_SYMVER.
(ld_options): Add --default-imported-symver.
(parse_args): Handle OPTION_DEFAULT_IMPORTED_SYMVER.
Diffstat (limited to 'bfd/elflink.c')
-rw-r--r-- | bfd/elflink.c | 174 |
1 files changed, 91 insertions, 83 deletions
diff --git a/bfd/elflink.c b/bfd/elflink.c index 4f2d096..b095312 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -3347,7 +3347,8 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) if (dynamic) { /* Read in any version definitions. */ - if (! _bfd_elf_slurp_version_tables (abfd)) + if (!_bfd_elf_slurp_version_tables (abfd, + info->default_imported_symver)) goto error_free_sym; /* Read in the symbol versions, but don't bother to convert them @@ -3499,102 +3500,109 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) unsigned int vernum = 0; bfd_boolean skip; - if (ever != NULL) + if (ever == NULL) { - _bfd_elf_swap_versym_in (abfd, ever, &iver); - vernum = iver.vs_vers & VERSYM_VERSION; - - /* If this is a hidden symbol, or if it is not version - 1, we append the version name to the symbol name. - However, we do not modify a non-hidden absolute - symbol, because it might be the version symbol - itself. FIXME: What if it isn't? */ - if ((iver.vs_vers & VERSYM_HIDDEN) != 0 - || (vernum > 1 && ! bfd_is_abs_section (sec))) + if (info->default_imported_symver) + /* Use the default symbol version created earlier. */ + iver.vs_vers = elf_tdata (abfd)->cverdefs; + else + iver.vs_vers = 0; + } + else + _bfd_elf_swap_versym_in (abfd, ever, &iver); + + vernum = iver.vs_vers & VERSYM_VERSION; + + /* If this is a hidden symbol, or if it is not version + 1, we append the version name to the symbol name. + However, we do not modify a non-hidden absolute + symbol, because it might be the version symbol + itself. FIXME: What if it isn't? */ + if ((iver.vs_vers & VERSYM_HIDDEN) != 0 + || (vernum > 1 && ! bfd_is_abs_section (sec))) + { + const char *verstr; + size_t namelen, verlen, newlen; + char *newname, *p; + + if (isym->st_shndx != SHN_UNDEF) { - const char *verstr; - size_t namelen, verlen, newlen; - char *newname, *p; + if (vernum > elf_tdata (abfd)->cverdefs) + verstr = NULL; + else if (vernum > 1) + verstr = + elf_tdata (abfd)->verdef[vernum - 1].vd_nodename; + else + verstr = ""; - if (isym->st_shndx != SHN_UNDEF) + if (verstr == NULL) { - if (vernum > elf_tdata (abfd)->cverdefs) - verstr = NULL; - else if (vernum > 1) - verstr = - elf_tdata (abfd)->verdef[vernum - 1].vd_nodename; - else - verstr = ""; - - if (verstr == NULL) - { - (*_bfd_error_handler) - (_("%B: %s: invalid version %u (max %d)"), - abfd, name, vernum, - elf_tdata (abfd)->cverdefs); - bfd_set_error (bfd_error_bad_value); - goto error_free_vers; - } + (*_bfd_error_handler) + (_("%B: %s: invalid version %u (max %d)"), + abfd, name, vernum, + elf_tdata (abfd)->cverdefs); + bfd_set_error (bfd_error_bad_value); + goto error_free_vers; } - else + } + else + { + /* We cannot simply test for the number of + entries in the VERNEED section since the + numbers for the needed versions do not start + at 0. */ + Elf_Internal_Verneed *t; + + verstr = NULL; + for (t = elf_tdata (abfd)->verref; + t != NULL; + t = t->vn_nextref) { - /* We cannot simply test for the number of - entries in the VERNEED section since the - numbers for the needed versions do not start - at 0. */ - Elf_Internal_Verneed *t; - - verstr = NULL; - for (t = elf_tdata (abfd)->verref; - t != NULL; - t = t->vn_nextref) - { - Elf_Internal_Vernaux *a; + Elf_Internal_Vernaux *a; - for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr) + for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr) + { + if (a->vna_other == vernum) { - if (a->vna_other == vernum) - { - verstr = a->vna_nodename; - break; - } + verstr = a->vna_nodename; + break; } - if (a != NULL) - break; - } - if (verstr == NULL) - { - (*_bfd_error_handler) - (_("%B: %s: invalid needed version %d"), - abfd, name, vernum); - bfd_set_error (bfd_error_bad_value); - goto error_free_vers; } + if (a != NULL) + break; } + if (verstr == NULL) + { + (*_bfd_error_handler) + (_("%B: %s: invalid needed version %d"), + abfd, name, vernum); + bfd_set_error (bfd_error_bad_value); + goto error_free_vers; + } + } - namelen = strlen (name); - verlen = strlen (verstr); - newlen = namelen + verlen + 2; - if ((iver.vs_vers & VERSYM_HIDDEN) == 0 - && isym->st_shndx != SHN_UNDEF) - ++newlen; + namelen = strlen (name); + verlen = strlen (verstr); + newlen = namelen + verlen + 2; + if ((iver.vs_vers & VERSYM_HIDDEN) == 0 + && isym->st_shndx != SHN_UNDEF) + ++newlen; - newname = bfd_alloc (abfd, newlen); - if (newname == NULL) - goto error_free_vers; - memcpy (newname, name, namelen); - p = newname + namelen; - *p++ = ELF_VER_CHR; - /* If this is a defined non-hidden version symbol, - we add another @ to the name. This indicates the - default version of the symbol. */ - if ((iver.vs_vers & VERSYM_HIDDEN) == 0 - && isym->st_shndx != SHN_UNDEF) - *p++ = ELF_VER_CHR; - memcpy (p, verstr, verlen + 1); + newname = bfd_alloc (abfd, newlen); + if (newname == NULL) + goto error_free_vers; + memcpy (newname, name, namelen); + p = newname + namelen; + *p++ = ELF_VER_CHR; + /* If this is a defined non-hidden version symbol, + we add another @ to the name. This indicates the + default version of the symbol. */ + if ((iver.vs_vers & VERSYM_HIDDEN) == 0 + && isym->st_shndx != SHN_UNDEF) + *p++ = ELF_VER_CHR; + memcpy (p, verstr, verlen + 1); - name = newname; - } + name = newname; } if (!_bfd_elf_merge_symbol (abfd, info, name, isym, &sec, &value, |