* aoutx.h (aout_link_write_symbols): If keep_memory is false, make
authorIan Lance Taylor <ian@airs.com>
Fri, 1 Apr 1994 23:01:53 +0000 (23:01 +0000)
committerIan Lance Taylor <ian@airs.com>
Fri, 1 Apr 1994 23:01:53 +0000 (23:01 +0000)
sure the symbol name is stored in permanent memory before adding
it to the string table.

bfd/ChangeLog
bfd/aoutx.h

index 8bda4bc12b908ba8a08bcf35a66ccf2886703591..f7b00c27dfbee774b92c9174378a4eba467c2a9b 100644 (file)
@@ -1,5 +1,9 @@
 Fri Apr  1 12:40:58 1994  Ian Lance Taylor  (ian@tweedledumb.cygnus.com)
 
+       * aoutx.h (aout_link_write_symbols): If keep_memory is false, make
+       sure the symbol name is stored in permanent memory before adding
+       it to the string table.
+
        * archive.c (_bfd_write_archive_contents): Once we've found an
        object, don't bother to look for more when deciding whether to
        build a map.
index 6a7fba8cb4d4ff14748b3cc159d151476ff65246..70a722b5d9bbd763524011057364b0187472403d 100644 (file)
@@ -3734,6 +3734,7 @@ aout_link_write_symbols (finfo, input_bfd, symbol_map)
     {
       const char *name;
       int type;
+      struct aout_link_hash_entry *h;
       boolean skip;
       asection *symsec;
       bfd_vma val = 0;
@@ -3743,6 +3744,8 @@ aout_link_write_symbols (finfo, input_bfd, symbol_map)
       type = bfd_h_get_8 (input_bfd, sym->e_type);
       name = strings + GET_WORD (input_bfd, sym->e_strx);
 
+      h = NULL;
+
       if (pass)
        {
          /* Pass this symbol through.  It is the target of an
@@ -3760,7 +3763,6 @@ aout_link_write_symbols (finfo, input_bfd, symbol_map)
        }
       else
        {
-         struct aout_link_hash_entry *h;
          struct aout_link_hash_entry *hresolve;
 
          /* We have saved the hash table entry for this symbol, if
@@ -3949,6 +3951,22 @@ aout_link_write_symbols (finfo, input_bfd, symbol_map)
                   outsym->e_other);
       bfd_h_put_16 (output_bfd, bfd_h_get_16 (input_bfd, sym->e_desc),
                    outsym->e_desc);
+      if (! finfo->info->keep_memory)
+       {
+         /* name points into a string table which we are going to
+            free.  If there is a hash table entry, use that string.
+            Otherwise, copy name into memory.  */
+         if (h != (struct aout_link_hash_entry *) NULL)
+           name = (*sym_hash)->root.root.string;
+         else
+           {
+             char *n;
+
+             n = bfd_alloc (output_bfd, strlen (name) + 1);
+             strcpy (n, name);
+             name = n;
+           }
+       }
       PUT_WORD (output_bfd,
                add_to_stringtab (output_bfd, name, &finfo->strtab),
                outsym->e_strx);