OSDN Git Service

* elflink.c (_bfd_elf_link_record_dynamic_symbol): Modify versioned
authorAlan Modra <amodra@bigpond.net.au>
Thu, 30 Oct 2003 14:13:50 +0000 (14:13 +0000)
committerAlan Modra <amodra@bigpond.net.au>
Thu, 30 Oct 2003 14:13:50 +0000 (14:13 +0000)
symbol string in place.

bfd/ChangeLog
bfd/elflink.c

index 4728081..76042fb 100644 (file)
@@ -1,3 +1,8 @@
+2003-10-30  Alan Modra  <amodra@bigpond.net.au>
+
+       * elflink.c (_bfd_elf_link_record_dynamic_symbol): Modify versioned
+       symbol string in place.
+
 2003-10-30  Jim Blandy  <jimb@redhat.com>
 
        * cpu-rs6000.c (rs6000_compatible): Check the correct arch_info
index 19f6d4d..651ffd5 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;