* archive.c (compute_and_write_armap): Rewrite somewhat to improve
memory usage.
This commit is contained in:
parent
9a793780e5
commit
5ee3886b48
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user