Make symtab a global variable in arlib.c.
authorUlrich Drepper <drepper@redhat.com>
Mon, 5 Feb 2007 21:05:51 +0000 (21:05 +0000)
committerUlrich Drepper <drepper@redhat.com>
Mon, 5 Feb 2007 21:05:51 +0000 (21:05 +0000)
src/ChangeLog
src/ar.c
src/arlib.c
src/arlib.h
src/arlib2.c
src/ranlib.c

index c2ce90f..39f7764 100644 (file)
@@ -1,3 +1,11 @@
+2007-02-05  Ulrich Drepper  <drepper@redhat.com>
+
+       * arlib.c: Make symtab a global variable.  Change all users.
+       * arlib2.c: Likewise.
+       * ranlib.c: Likewise.
+       * ar.c: Likewise.
+       * arlib.h: Declare it.
+
 2007-01-11  Roland McGrath  <roland@redhat.com>
 
        * elflint.c (check_sections): Use ebl_machine_section_flag_check on
index 772c49c..19ad403 100644 (file)
--- a/src/ar.c
+++ b/src/ar.c
@@ -475,7 +475,6 @@ do_oper_extract (int oper, const char *arfname, char **argv, int argc,
               gettext ("cannot insert into hash table"));
     }
 
-  struct arlib_symtab symtab;
   struct stat st;
   if (force_symtab)
     {
@@ -485,7 +484,7 @@ do_oper_extract (int oper, const char *arfname, char **argv, int argc,
          close (fd);
          return 1;
        }
-      arlib_init (&symtab);
+      arlib_init ();
     }
 
   Elf_Cmd cmd = ELF_C_READ_MMAP;
@@ -505,7 +504,7 @@ do_oper_extract (int oper, const char *arfname, char **argv, int argc,
 
       if (force_symtab)
        {
-         arlib_add_symbols (elf, arfname, arhdr->ar_name, &symtab, cur_off);
+         arlib_add_symbols (elf, arfname, arhdr->ar_name, cur_off);
          cur_off += (((arhdr->ar_size + 1) & ~((off_t) 1))
                      + sizeof (struct ar_hdr));
        }
@@ -741,7 +740,7 @@ cannot rename temporary file to %.*s"),
 
   if (force_symtab)
     {
-      arlib_finalize (&symtab);
+      arlib_finalize ();
 
       if (symtab.symsnamelen != 0
          /* We have to rewrite the file also if it initially had an index
@@ -910,8 +909,7 @@ do_oper_delete (const char *arfname, char **argv, int argc,
               gettext ("cannot insert into hash table"));
     }
 
-  struct arlib_symtab symtab;
-  arlib_init (&symtab);
+  arlib_init ();
 
   off_t cur_off = SARMAG;
   Elf_Cmd cmd = ELF_C_READ_MMAP;
@@ -960,14 +958,12 @@ do_oper_delete (const char *arfname, char **argv, int argc,
 
          /* If we recreate the symbol table read the file's symbol
             table now.  */
-         arlib_add_symbols (subelf, arfname, arhdr->ar_name, &symtab,
-                            newp->off);
+         arlib_add_symbols (subelf, arfname, arhdr->ar_name, newp->off);
 
          /* Remember long file names.  */
          size_t ar_namelen = strlen (arhdr->ar_name);
          if (ar_namelen > MAX_AR_NAME_LEN)
-           newp->long_name_off = arlib_add_long_name (&symtab,
-                                                      arhdr->ar_name,
+           newp->long_name_off = arlib_add_long_name (arhdr->ar_name,
                                                       ar_namelen);
          else
            newp->long_name_off = -1l;
@@ -979,7 +975,7 @@ do_oper_delete (const char *arfname, char **argv, int argc,
        error (1, 0, "%s: %s", arfname, elf_errmsg (-1));
     }
 
-  arlib_finalize (&symtab);
+  arlib_finalize ();
 
   hdestroy ();
 
@@ -1052,7 +1048,7 @@ do_oper_delete (const char *arfname, char **argv, int argc,
 #ifdef DEBUG
   elf_end (elf);
 
-  arlib_fini (&symtab);
+  arlib_fini ();
 
   close (fd);
 #endif
@@ -1087,8 +1083,7 @@ do_oper_insert (int oper, const char *arfname, char **argv, int argc,
   struct armem **found = alloca (sizeof (*found) * argc);
   memset (found, '\0', sizeof (*found) * argc);
 
-  struct arlib_symtab symtab;
-  arlib_init (&symtab);
+  arlib_init ();
 
   if (fd == -1)
     {
@@ -1142,8 +1137,7 @@ do_oper_insert (int oper, const char *arfname, char **argv, int argc,
       /* Remember long file names.  */
       size_t ar_namelen = strlen (arhdr->ar_name);
       if (ar_namelen > MAX_AR_NAME_LEN)
-       newp->long_name_off = arlib_add_long_name (&symtab, arhdr->ar_name,
-                                                  ar_namelen);
+       newp->long_name_off = arlib_add_long_name (arhdr->ar_name, ar_namelen);
       else
        newp->long_name_off = -1l;
 
@@ -1234,8 +1228,7 @@ do_oper_insert (int oper, const char *arfname, char **argv, int argc,
 
              size_t ar_namelen = strlen (argv[cnt]);
              if (ar_namelen > MAX_AR_NAME_LEN)
-               found[cnt]->long_name_off = arlib_add_long_name (&symtab,
-                                                                bname,
+               found[cnt]->long_name_off = arlib_add_long_name (bname,
                                                                 ar_namelen);
              else
                found[cnt]->long_name_off = -1l;
@@ -1299,8 +1292,7 @@ do_oper_insert (int oper, const char *arfname, char **argv, int argc,
              /* Remember long file names.  */
              size_t bnamelen = strlen (bname);
              if (bnamelen > MAX_AR_NAME_LEN)
-               found[cnt]->long_name_off = arlib_add_long_name (&symtab,
-                                                                bname,
+               found[cnt]->long_name_off = arlib_add_long_name (bname,
                                                                 bnamelen);
              else
                found[cnt]->long_name_off = -1l;
@@ -1313,7 +1305,7 @@ do_oper_insert (int oper, const char *arfname, char **argv, int argc,
 #ifdef DEBUG
       elf_end (elf);
 
-      arlib_fini (&symtab);
+      arlib_fini ();
 
       close (fd);
 #endif
@@ -1369,16 +1361,12 @@ do_oper_insert (int oper, const char *arfname, char **argv, int argc,
                 archive content.  But who knows...  */
              error (EXIT_FAILURE, 0, "%s: %s", arfname, elf_errmsg (-1));
 
-           arlib_add_symbols (subelf, arfname, arhdr->ar_name, &symtab,
-                              cur_off);
+           arlib_add_symbols (subelf, arfname, arhdr->ar_name, cur_off);
 
            elf_end (subelf);
          }
        else
-         {
-           arlib_add_symbols (memp->elf, arfname, memp->name, &symtab,
-                              cur_off);
-         }
+         arlib_add_symbols (memp->elf, arfname, memp->name, cur_off);
 
        cur_off += (((memp->size + 1) & ~((off_t) 1))
                    + sizeof (struct ar_hdr));
@@ -1386,7 +1374,7 @@ do_oper_insert (int oper, const char *arfname, char **argv, int argc,
 
   /* Now we have all the information for the symbol table and long
      file name table.  Construct the final layout.  */
-  arlib_finalize (&symtab);
+  arlib_finalize ();
 
   /* Create a new, temporary file in the same directory as the
      original file.  */
@@ -1522,7 +1510,7 @@ do_oper_insert (int oper, const char *arfname, char **argv, int argc,
 #ifdef DEBUG
   elf_end (elf);
 
-  arlib_fini (&symtab);
+  arlib_fini ();
 
   close (fd);
 #endif
index a48afbc..1b8785e 100644 (file)
 #include "arlib.h"
 
 
+/* The one symbol table we hanble.  */
+struct arlib_symtab symtab;
+
+
 /* Initialize ARLIB_SYMTAB structure.  */
 void
-arlib_init (struct arlib_symtab *symtab)
+arlib_init (void)
 {
 #define obstack_chunk_alloc xmalloc
 #define obstack_chunk_free free
-  obstack_init (&symtab->symsoffob);
-  obstack_init (&symtab->symsnameob);
-  obstack_init (&symtab->longnamesob);
+  obstack_init (&symtab.symsoffob);
+  obstack_init (&symtab.symsnameob);
+  obstack_init (&symtab.longnamesob);
 
   /* We add the archive header here as well, that avoids allocating
      another memory block.  */
@@ -78,13 +82,13 @@ arlib_init (struct arlib_symtab *symtab)
   memcpy (ar_hdr.ar_fmag, ARFMAG, sizeof (ar_hdr.ar_fmag));
 
   /* Add the archive header to the file content.  */
-  obstack_grow (&symtab->symsoffob, &ar_hdr, sizeof (ar_hdr));
+  obstack_grow (&symtab.symsoffob, &ar_hdr, sizeof (ar_hdr));
 
   /* The first word in the offset table specifies the size.  Create
      such an entry now.  The real value will be filled-in later.  For
      all supported platforms the following is true.  */
   assert (sizeof (uint32_t) == sizeof (int));
-  obstack_int_grow (&symtab->symsoffob, 0);
+  obstack_int_grow (&symtab.symsoffob, 0);
 
   /* The long name obstack also gets its archive header.  As above,
      some of the input strings are longer than required but we only
@@ -95,110 +99,109 @@ arlib_init (struct arlib_symtab *symtab)
   memcpy (ar_hdr.ar_gid, "            ", sizeof (ar_hdr.ar_gid));
   memcpy (ar_hdr.ar_mode, "            ", sizeof (ar_hdr.ar_mode));
   /* The ar_size field will be filled in later and ar_fmag is already OK.  */
-  obstack_grow (&symtab->longnamesob, &ar_hdr, sizeof (ar_hdr));
+  obstack_grow (&symtab.longnamesob, &ar_hdr, sizeof (ar_hdr));
 
   /* All other members are zero.  */
-  symtab->symsofflen = 0;
-  symtab->symsoff = NULL;
-  symtab->symsnamelen = 0;
-  symtab->symsname = NULL;
+  symtab.symsofflen = 0;
+  symtab.symsoff = NULL;
+  symtab.symsnamelen = 0;
+  symtab.symsname = NULL;
 }
 
 
 /* Finalize ARLIB_SYMTAB content.  */
 void
-arlib_finalize (struct arlib_symtab *symtab)
+arlib_finalize (void)
 {
   char tmpbuf[sizeof (((struct ar_hdr *) NULL)->ar_size) + 1];
 
-  symtab->longnameslen = obstack_object_size (&symtab->longnamesob);
-  if (symtab->longnameslen != sizeof (struct ar_hdr))
+  symtab.longnameslen = obstack_object_size (&symtab.longnamesob);
+  if (symtab.longnameslen != sizeof (struct ar_hdr))
     {
-      symtab->longnames = obstack_finish (&symtab->longnamesob);
+      symtab.longnames = obstack_finish (&symtab.longnamesob);
 
-      memcpy (&((struct ar_hdr *) symtab->longnames)->ar_size, tmpbuf,
+      memcpy (&((struct ar_hdr *) symtab.longnames)->ar_size, tmpbuf,
              snprintf (tmpbuf, sizeof (tmpbuf), "%-*zu",
                        (int) sizeof (((struct ar_hdr *) NULL)->ar_size),
-                       symtab->longnameslen - sizeof (struct ar_hdr)));
+                       symtab.longnameslen - sizeof (struct ar_hdr)));
     }
 
-  symtab->symsofflen = obstack_object_size (&symtab->symsoffob);
-  assert (symtab->symsofflen % sizeof (uint32_t) == 0);
-  if (symtab->symsofflen != 0)
+  symtab.symsofflen = obstack_object_size (&symtab.symsoffob);
+  assert (symtab.symsofflen % sizeof (uint32_t) == 0);
+  if (symtab.symsofflen != 0)
     {
-      symtab->symsoff = (uint32_t *) obstack_finish (&symtab->symsoffob);
+      symtab.symsoff = (uint32_t *) obstack_finish (&symtab.symsoffob);
 
       /* Fill in the number of offsets now.  */
-      symtab->symsoff[AR_HDR_WORDS] = le_bswap_32 ((symtab->symsofflen
+      symtab.symsoff[AR_HDR_WORDS] = le_bswap_32 ((symtab.symsofflen
                                                    - sizeof (struct ar_hdr))
                                                   / sizeof (uint32_t) - 1);
     }
 
-  symtab->symsnamelen = obstack_object_size (&symtab->symsnameob);
-  if ((symtab->symsnamelen & 1) != 0)
+  symtab.symsnamelen = obstack_object_size (&symtab.symsnameob);
+  if ((symtab.symsnamelen & 1) != 0)
     {
       /* Add one more NUL byte to make length even.  */
-      obstack_grow (&symtab->symsnameob, "", 1);
-      ++symtab->symsnamelen;
+      obstack_grow (&symtab.symsnameob, "", 1);
+      ++symtab.symsnamelen;
     }
-  symtab->symsname = obstack_finish (&symtab->symsnameob);
+  symtab.symsname = obstack_finish (&symtab.symsnameob);
 
   /* Determine correction for the offsets in the symbol table.   */
   off_t disp = 0;
-  if (symtab->symsnamelen > 0)
-    disp = symtab->symsofflen + symtab->symsnamelen;
-  if (symtab->longnameslen > sizeof (struct ar_hdr))
-    disp += symtab->longnameslen;
+  if (symtab.symsnamelen > 0)
+    disp = symtab.symsofflen + symtab.symsnamelen;
+  if (symtab.longnameslen > sizeof (struct ar_hdr))
+    disp += symtab.longnameslen;
 
-  if (disp != 0 && symtab->symsoff != NULL)
+  if (disp != 0 && symtab.symsoff != NULL)
     {
-      uint32_t nsyms = le_bswap_32 (symtab->symsoff[AR_HDR_WORDS]);
+      uint32_t nsyms = le_bswap_32 (symtab.symsoff[AR_HDR_WORDS]);
 
       for (uint32_t cnt = 1; cnt <= nsyms; ++cnt)
        {
-         uint32_t val = le_bswap_32 (symtab->symsoff[AR_HDR_WORDS + cnt]);
+         uint32_t val = le_bswap_32 (symtab.symsoff[AR_HDR_WORDS + cnt]);
          val += disp;
-         symtab->symsoff[AR_HDR_WORDS + cnt] = le_bswap_32 (val);
+         symtab.symsoff[AR_HDR_WORDS + cnt] = le_bswap_32 (val);
        }
     }
 
   /* See comment for ar_date above.  */
-  memcpy (&((struct ar_hdr *) symtab->symsoff)->ar_size, tmpbuf,
+  memcpy (&((struct ar_hdr *) symtab.symsoff)->ar_size, tmpbuf,
          snprintf (tmpbuf, sizeof (tmpbuf), "%-*zu",
                    (int) sizeof (((struct ar_hdr *) NULL)->ar_size),
-                   symtab->symsofflen + symtab->symsnamelen
+                   symtab.symsofflen + symtab.symsnamelen
                    - sizeof (struct ar_hdr)));
 }
 
 
 /* Free resources for ARLIB_SYMTAB.  */
 void
-arlib_fini (struct arlib_symtab *symtab)
+arlib_fini (void)
 {
-  obstack_free (&symtab->symsoffob, NULL);
-  obstack_free (&symtab->symsnameob, NULL);
-  obstack_free (&symtab->longnamesob, NULL);
+  obstack_free (&symtab.symsoffob, NULL);
+  obstack_free (&symtab.symsnameob, NULL);
+  obstack_free (&symtab.longnamesob, NULL);
 }
 
 
 /* Add name a file offset of a symbol.  */
 void
-arlib_add_symref (struct arlib_symtab *symtab, const char *symname,
-                 off_t symoff)
+arlib_add_symref (const char *symname, off_t symoff)
 {
   /* For all supported platforms the following is true.  */
   assert (sizeof (uint32_t) == sizeof (int));
-  obstack_int_grow (&symtab->symsoffob, (int) le_bswap_32 (symoff));
+  obstack_int_grow (&symtab.symsoffob, (int) le_bswap_32 (symoff));
 
   size_t symname_len = strlen (symname) + 1;
-  obstack_grow (&symtab->symsnameob, symname, symname_len);
+  obstack_grow (&symtab.symsnameob, symname, symname_len);
 }
 
 
 /* Add symbols from ELF with value OFFSET to the symbol table SYMTAB.  */
 void
 arlib_add_symbols (Elf *elf, const char *arfname, const char *membername,
-                  struct arlib_symtab *symtab, off_t off)
+                  off_t off)
 {
   if (sizeof (off) > sizeof (uint32_t) && off > ~((uint32_t) 0))
     /* The archive is too big.  */
@@ -259,7 +262,7 @@ arlib_add_symbols (Elf *elf, const char *arfname, const char *membername,
          /* Use this symbol.  */
          const char *symname = elf_strptr (elf, shdr->sh_link, sym->st_name);
          if (symname != NULL)
-           arlib_add_symref (symtab, symname, off);
+           arlib_add_symref (symname, off);
        }
 
       /* Only relocatable files can have more than one symbol table.  */
index ab1be0c..af8e8e4 100644 (file)
@@ -68,28 +68,28 @@ struct arlib_symtab
 };
 
 
-/* Initialize ARLIB_SYMTAB structure.  */
-extern void arlib_init (struct arlib_symtab *symtab);
+/* Global variable with symbol table.  */
+extern struct arlib_symtab symtab;
+
 
+/* Initialize ARLIB_SYMTAB structure.  */
+extern void arlib_init (void);
 
 /* Finalize ARLIB_SYMTAB content.  */
-extern void arlib_finalize (struct arlib_symtab *symtab);
+extern void arlib_finalize (void);
 
 /* Free resources for ARLIB_SYMTAB.  */
-extern void arlib_fini (struct arlib_symtab *symtab);
+extern void arlib_fini (void);
 
 /* Add symbols from ELF with value OFFSET to the symbol table SYMTAB.  */
 extern void arlib_add_symbols (Elf *elf, const char *arfname,
-                              const char *membername,
-                              struct arlib_symtab *symtab, off_t off);
+                              const char *membername, off_t off);
 
 /* Add name a file offset of a symbol.  */
-extern void arlib_add_symref (struct arlib_symtab *symtab, const char *symname,
-                             off_t symoff);
+extern void arlib_add_symref (const char *symname, off_t symoff);
 
 /* Add long file name FILENAME of length FILENAMELEN to the symbol table
    SYMTAB.  Return the offset into the long file name table.  */
-extern long int arlib_add_long_name (struct arlib_symtab *symtab,
-                                    const char *filename, size_t filenamelen);
+extern long int arlib_add_long_name (const char *filename, size_t filenamelen);
 
 #endif /* arlib.h */
index cb1e1db..47edb35 100644 (file)
 /* Add long file name FILENAME of length FILENAMELEN to the symbol table
    SYMTAB.  Return the offset into the long file name table.  */
 long int
-arlib_add_long_name (struct arlib_symtab *symtab, const char *filename,
-                    size_t filenamelen)
+arlib_add_long_name (const char *filename, size_t filenamelen)
 {
-  int retval = obstack_object_size (&symtab->longnamesob);
+  int retval = obstack_object_size (&symtab.longnamesob);
 
-  obstack_grow (&symtab->longnamesob, filename, filenamelen);
-  obstack_grow (&symtab->longnamesob, "/\n", 2);
+  obstack_grow (&symtab.longnamesob, filename, filenamelen);
+  obstack_grow (&symtab.longnamesob, "/\n", 2);
 
   return retval;
 }
index 0a8667d..9a884cb 100644 (file)
@@ -197,8 +197,7 @@ handle_file (const char *fname)
       return 1;
     }
 
-  struct arlib_symtab symtab;
-  arlib_init (&symtab);
+  arlib_init ();
 
   /* Iterate over the content of the archive.  */
   off_t index_off = -1;
@@ -219,7 +218,7 @@ handle_file (const char *fname)
        }
       else
        {
-         arlib_add_symbols (elf, fname, arhdr->ar_name, &symtab, cur_off);
+         arlib_add_symbols (elf, fname, arhdr->ar_name, cur_off);
          cur_off += (((arhdr->ar_size + 1) & ~((off_t) 1))
                      + sizeof (struct ar_hdr));
        }
@@ -231,7 +230,7 @@ handle_file (const char *fname)
               elf_errmsg (-1));
     }
 
-  arlib_finalize (&symtab);
+  arlib_finalize ();
 
   /* If the file contains no symbols we need not do anything.  */
   int status = 0;
@@ -299,7 +298,7 @@ handle_file (const char *fname)
 
   elf_end (arelf);
 
-  arlib_fini (&symtab);
+  arlib_fini ();
 
   close (fd);