diff options
author | Ulrich Drepper <drepper@redhat.com> | 2007-02-05 21:05:51 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2007-02-05 21:05:51 +0000 |
commit | 0fe63531c14236e1c0188b7fd1b3ffdc383d95bc (patch) | |
tree | f8ef1a8530d98f8ab3a6025f052eb29cff500550 | |
parent | aa915fd3d70b4cbe4581f9ec170d986c6ba35063 (diff) | |
download | elfutils-0fe63531c14236e1c0188b7fd1b3ffdc383d95bc.tar.gz |
Make symtab a global variable in arlib.c.
-rw-r--r-- | src/ChangeLog | 8 | ||||
-rw-r--r-- | src/ar.c | 46 | ||||
-rw-r--r-- | src/arlib.c | 97 | ||||
-rw-r--r-- | src/arlib.h | 20 | ||||
-rw-r--r-- | src/arlib2.c | 9 | ||||
-rw-r--r-- | src/ranlib.c | 9 |
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 @@ -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); |