summaryrefslogtreecommitdiff
path: root/bfd/elflink.h
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2002-06-23 12:44:31 +0000
committerAlan Modra <amodra@bigpond.net.au>2002-06-23 12:44:31 +0000
commit078a98bd0bc5227fa74964b2a9df7889b7c9ae31 (patch)
treedf7610451637cfffb6efca201411a2285c0dc513 /bfd/elflink.h
parent5321b196d5f49a3ab9fb2ccd78f8885237013f01 (diff)
downloadgdb-078a98bd0bc5227fa74964b2a9df7889b7c9ae31.tar.gz
* elflink.h (elf_link_add_archive_symbols): For the default
version, check references with only one `@' first.
Diffstat (limited to 'bfd/elflink.h')
-rw-r--r--bfd/elflink.h28
1 files changed, 21 insertions, 7 deletions
diff --git a/bfd/elflink.h b/bfd/elflink.h
index 3cd9e0c49aa..d4a26528a9e 100644
--- a/bfd/elflink.h
+++ b/bfd/elflink.h
@@ -353,26 +353,40 @@ elf_link_add_archive_symbols (abfd, info)
if (h == NULL)
{
char *p, *copy;
+ size_t len, first;
/* If this is a default version (the name contains @@),
- look up the symbol again without the version. The
- effect is that references to the symbol without the
- version will be matched by the default symbol in the
- archive. */
+ look up the symbol again with only one `@' as well
+ as without the version. The effect is that references
+ to the symbol with and without the version will be
+ matched by the default symbol in the archive. */
p = strchr (symdef->name, ELF_VER_CHR);
if (p == NULL || p[1] != ELF_VER_CHR)
continue;
- copy = bfd_alloc (abfd, (bfd_size_type) (p - symdef->name + 1));
+ /* First check with only one `@'. */
+ len = strlen (symdef->name);
+ copy = bfd_alloc (abfd, (bfd_size_type) len);
if (copy == NULL)
goto error_return;
- memcpy (copy, symdef->name, (size_t) (p - symdef->name));
- copy[p - symdef->name] = '\0';
+ first = p - symdef->name + 1;
+ memcpy (copy, symdef->name, first);
+ memcpy (copy + first, symdef->name + first + 1, len - first);
h = elf_link_hash_lookup (elf_hash_table (info), copy,
false, false, false);
+ if (h == NULL)
+ {
+ /* We also need to check references to the symbol
+ without the version. */
+
+ copy[first - 1] = '\0';
+ h = elf_link_hash_lookup (elf_hash_table (info),
+ copy, false, false, false);
+ }
+
bfd_release (abfd, copy);
}