aboutsummaryrefslogtreecommitdiff
path: root/bfd/elflink.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2003-10-30 14:13:50 +0000
committerAlan Modra <amodra@gmail.com>2003-10-30 14:13:50 +0000
commit68b6ddd08f8b349f4da7d3a2da151a482db36115 (patch)
tree39260621927a1c074e699bd26c3e715c56159096 /bfd/elflink.c
parent3f8b3ef37bb717cf25bfe766ba87e0c4dc19d633 (diff)
downloadgdb-68b6ddd08f8b349f4da7d3a2da151a482db36115.zip
gdb-68b6ddd08f8b349f4da7d3a2da151a482db36115.tar.gz
gdb-68b6ddd08f8b349f4da7d3a2da151a482db36115.tar.bz2
* elflink.c (_bfd_elf_link_record_dynamic_symbol): Modify versioned
symbol string in place.
Diffstat (limited to 'bfd/elflink.c')
-rw-r--r--bfd/elflink.c37
1 files changed, 13 insertions, 24 deletions
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 19f6d4d..651ffd5 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -353,9 +353,8 @@ _bfd_elf_link_record_dynamic_symbol (struct bfd_link_info *info,
if (h->dynindx == -1)
{
struct elf_strtab_hash *dynstr;
- char *p, *alc;
+ char *p;
const char *name;
- bfd_boolean copy;
bfd_size_type indx;
/* XXX: The ABI draft says the linker must turn hidden and
@@ -393,28 +392,18 @@ _bfd_elf_link_record_dynamic_symbol (struct bfd_link_info *info,
table. */
name = h->root.root.string;
p = strchr (name, ELF_VER_CHR);
- if (p == NULL)
- {
- alc = NULL;
- copy = FALSE;
- }
- else
- {
- size_t len = p - name + 1;
-
- alc = bfd_malloc (len);
- if (alc == NULL)
- return FALSE;
- memcpy (alc, name, len - 1);
- alc[len - 1] = '\0';
- name = alc;
- copy = TRUE;
- }
-
- indx = _bfd_elf_strtab_add (dynstr, name, copy);
-
- if (alc != NULL)
- free (alc);
+ if (p != NULL)
+ /* We know that the p points into writable memory. In fact,
+ there are only a few symbols that have read-only names, being
+ those like _GLOBAL_OFFSET_TABLE_ that are created specially
+ by the backends. Most symbols will have names pointing into
+ an ELF string table read from a file, or to objalloc memory. */
+ *p = 0;
+
+ indx = _bfd_elf_strtab_add (dynstr, name, p != NULL);
+
+ if (p != NULL)
+ *p = ELF_VER_CHR;
if (indx == (bfd_size_type) -1)
return FALSE;