* archive.c (compute_and_write_armap): Rewrite somewhat to improve

memory usage.
This commit is contained in:
Ian Lance Taylor 1994-02-11 22:30:18 +00:00
parent 9a793780e5
commit 5ee3886b48
2 changed files with 68 additions and 16 deletions

View File

@ -1,3 +1,8 @@
Fri Feb 11 17:25:58 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com)
* archive.c (compute_and_write_armap): Rewrite somewhat to improve
memory usage.
Fri Feb 11 13:10:42 1994 Stan Shebs (shebs@andros.cygnus.com) Fri Feb 11 13:10:42 1994 Stan Shebs (shebs@andros.cygnus.com)
* archive.c: Change all references to '\n' in archive magic * archive.c: Change all references to '\n' in archive magic

View File

@ -1574,25 +1574,39 @@ compute_and_write_armap (arch, elength)
bfd *arch; bfd *arch;
unsigned int elength; unsigned int elength;
{ {
char *first_name;
bfd *current; bfd *current;
file_ptr elt_no = 0; file_ptr elt_no = 0;
struct orl *map; struct orl *map;
int orl_max = 15000; /* fine initial default */ int orl_max = 1024; /* fine initial default */
int orl_count = 0; int orl_count = 0;
int stridx = 0; /* string index */ int stridx = 0; /* string index */
asymbol **syms = NULL;
unsigned int syms_max = 0;
boolean ret;
/* Dunno if this is the best place for this info... */ /* Dunno if this is the best place for this info... */
if (elength != 0) if (elength != 0)
elength += sizeof (struct ar_hdr); elength += sizeof (struct ar_hdr);
elength += elength % 2; elength += elength % 2;
map = (struct orl *) bfd_zalloc (arch, orl_max * sizeof (struct orl)); map = (struct orl *) malloc (orl_max * sizeof (struct orl));
if (map == NULL) if (map == NULL)
{ {
bfd_error = no_memory; bfd_error = no_memory;
return false; return false;
} }
/* We put the symbol names on the arch obstack, and then discard
them when done. */
first_name = bfd_alloc (arch, 1);
if (first_name == NULL)
{
free (map);
bfd_error = no_memory;
return false;
}
/* Drop all the files called __.SYMDEF, we're going to make our /* Drop all the files called __.SYMDEF, we're going to make our
own */ own */
while (arch->archive_head && while (arch->archive_head &&
@ -1607,7 +1621,6 @@ compute_and_write_armap (arch, elength)
if ((bfd_check_format (current, bfd_object) == true) if ((bfd_check_format (current, bfd_object) == true)
&& ((bfd_get_file_flags (current) & HAS_SYMS))) && ((bfd_get_file_flags (current) & HAS_SYMS)))
{ {
asymbol **syms;
unsigned int storage; unsigned int storage;
unsigned int symcount; unsigned int symcount;
unsigned int src_count; unsigned int src_count;
@ -1615,12 +1628,20 @@ compute_and_write_armap (arch, elength)
storage = get_symtab_upper_bound (current); storage = get_symtab_upper_bound (current);
if (storage != 0) if (storage != 0)
{ {
syms = (asymbol **) bfd_zalloc (arch, storage); if (storage > syms_max)
{
if (syms_max > 0)
free (syms);
syms_max = storage;
syms = (asymbol **) malloc (syms_max);
if (syms == NULL) if (syms == NULL)
{ {
bfd_error = no_memory; /* FIXME -- memory leak */ free (map);
bfd_release (arch, first_name);
bfd_error = no_memory;
return false; return false;
} }
}
symcount = bfd_canonicalize_symtab (current, syms); symcount = bfd_canonicalize_symtab (current, syms);
/* Now map over all the symbols, picking out the ones we want */ /* Now map over all the symbols, picking out the ones we want */
@ -1635,21 +1656,43 @@ compute_and_write_armap (arch, elength)
bfd_is_com_section (sec)) bfd_is_com_section (sec))
&& (sec != &bfd_und_section)) && (sec != &bfd_und_section))
{ {
size_t namelen;
struct orl *new_map;
/* This symbol will go into the archive header */ /* This symbol will go into the archive header */
if (orl_count == orl_max) if (orl_count == orl_max)
{ {
orl_max *= 2; orl_max *= 2;
map = ((struct orl *) new_map = ((struct orl *)
bfd_realloc (arch, (char *) map, realloc ((PTR) map,
orl_max * sizeof (struct orl))); orl_max * sizeof (struct orl)));
if (new_map == (struct orl *) NULL)
{
free_and_quit:
free (syms);
free (map);
bfd_release (arch, first_name);
bfd_error = no_memory;
return false;
} }
(map[orl_count]).name = map = new_map;
(char **) &((syms[src_count])->name); }
namelen = strlen (syms[src_count]->name);
map[orl_count].name = ((char **)
bfd_alloc (arch,
sizeof (char *)));
if (map[orl_count].name == NULL)
goto free_and_quit;
*(map[orl_count].name) = bfd_alloc (arch, namelen + 1);
if (*(map[orl_count].name) == NULL)
goto free_and_quit;
strcpy (*(map[orl_count].name), syms[src_count]->name);
(map[orl_count]).pos = (file_ptr) current; (map[orl_count]).pos = (file_ptr) current;
(map[orl_count]).namidx = stridx; (map[orl_count]).namidx = stridx;
stridx += strlen ((syms[src_count])->name) + 1; stridx += namelen + 1;
++orl_count; ++orl_count;
} }
} }
@ -1658,11 +1701,15 @@ compute_and_write_armap (arch, elength)
} }
/* OK, now we have collected all the data, let's write them out */ /* OK, now we have collected all the data, let's write them out */
if (!BFD_SEND (arch, write_armap, ret = BFD_SEND (arch, write_armap,
(arch, elength, map, orl_count, stridx))) (arch, elength, map, orl_count, stridx));
return false;
return true; if (syms_max > 0)
free (syms);
free (map);
bfd_release (arch, first_name);
return ret;
} }
boolean boolean