* elflink.c (_bfd_elf_link_record_dynamic_symbol): Modify versioned
[deliverable/binutils-gdb.git] / bfd / elflink.c
index 19f6d4d7b8b44fcedc5e41870bc8b42223be61a1..651ffd5de521653078f74dd5ac6e403d069dfcfe 100644 (file)
@@ -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;
This page took 0.024072 seconds and 4 git commands to generate.