summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2007-02-05 21:05:51 +0000
committerUlrich Drepper <drepper@redhat.com>2007-02-05 21:05:51 +0000
commit0fe63531c14236e1c0188b7fd1b3ffdc383d95bc (patch)
treef8ef1a8530d98f8ab3a6025f052eb29cff500550
parentaa915fd3d70b4cbe4581f9ec170d986c6ba35063 (diff)
downloadelfutils-0fe63531c14236e1c0188b7fd1b3ffdc383d95bc.tar.gz
Make symtab a global variable in arlib.c.
-rw-r--r--src/ChangeLog8
-rw-r--r--src/ar.c46
-rw-r--r--src/arlib.c97
-rw-r--r--src/arlib.h20
-rw-r--r--src/arlib2.c9
-rw-r--r--src/ranlib.c9
6 files changed, 93 insertions, 96 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index c2ce90fd..39f77648 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -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
diff --git a/src/ar.c b/src/ar.c
index 772c49c2..19ad4035 100644
--- 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
diff --git a/src/arlib.c b/src/arlib.c
index a48afbce..1b8785e4 100644
--- a/src/arlib.c
+++ b/src/arlib.c
@@ -40,15 +40,19 @@
#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. */
diff --git a/src/arlib.h b/src/arlib.h
index ab1be0c6..af8e8e42 100644
--- a/src/arlib.h
+++ b/src/arlib.h
@@ -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 */
diff --git a/src/arlib2.c b/src/arlib2.c
index cb1e1db3..47edb356 100644
--- a/src/arlib2.c
+++ b/src/arlib2.c
@@ -39,13 +39,12 @@
/* 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;
}
diff --git a/src/ranlib.c b/src/ranlib.c
index 0a8667d3..9a884cb1 100644
--- a/src/ranlib.c
+++ b/src/ranlib.c
@@ -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);