Two small bug-fixes (affecting ar and nm).

This commit is contained in:
Per Bothner 1991-11-29 20:31:57 +00:00
parent 6089addcdc
commit 3721706073
3 changed files with 80 additions and 73 deletions

View File

@ -1,3 +1,10 @@
Fri Nov 29 12:16:51 1991 Per Bothner (bothner at cygnus.com)
* syms.c (bfd_decode_symclass): Return 'A'
for symbols that are both absolute and global.
* archive.c (bfd_special_undocumented_glue): Return NULL
if bfd_ar_hdr_from_filesystem returns NULL.
Tue Nov 26 09:10:55 1991 Steve Chamberlain (sac at cygnus.com)
* Makefile.in: added coff-h8300
@ -13,9 +20,6 @@ Tue Nov 26 09:10:55 1991 Steve Chamberlain (sac at cygnus.com)
handled, from the nest of #ifdefs to macros defined in the
including coff-<foo>.c
Fri Nov 22 08:11:42 1991 John Gilmore (gnu at cygnus.com)
* aoutx.h (some_aout_object_p): Set the `executable' bit

View File

@ -827,8 +827,10 @@ DEFUN(bfd_special_undocumented_glue, (abfd, filename),
bfd *abfd AND
char *filename)
{
return (struct ar_hdr *) bfd_ar_hdr_from_filesystem (abfd, filename) -> arch_header;
struct areltdata *ar_elt = bfd_ar_hdr_from_filesystem (abfd, filename);
if (ar_elt == NULL)
return NULL;
return (struct ar_hdr *) ar_elt->arch_header;
}
@ -1076,80 +1078,87 @@ compute_and_write_armap (arch, elength)
bfd *arch;
unsigned int elength;
{
bfd *current;
file_ptr elt_no = 0;
struct orl *map;
int orl_max = 15000; /* fine initial default */
int orl_count = 0;
int stridx = 0; /* string index */
bfd *current;
file_ptr elt_no = 0;
struct orl *map;
int orl_max = 15000; /* fine initial default */
int orl_count = 0;
int stridx = 0; /* string index */
/* Dunno if this is the best place for this info... */
if (elength != 0) elength += sizeof (struct ar_hdr);
elength += elength %2 ;
/* Dunno if this is the best place for this info... */
if (elength != 0) elength += sizeof (struct ar_hdr);
elength += elength %2 ;
map = (struct orl *) bfd_zalloc (arch,orl_max * sizeof (struct orl));
if (map == NULL) {
bfd_error = no_memory;
return false;
}
map = (struct orl *) bfd_zalloc (arch,orl_max * sizeof (struct orl));
if (map == NULL) {
bfd_error = no_memory;
return false;
}
/* Map over each element */
for (current = arch->archive_head;
current != (bfd *)NULL;
current = current->next, elt_no++)
{
/* Drop all the files called __.SYMDEF, we're going to make our
own */
while (arch->archive_head &&
strcmp(arch->archive_head->filename,"__.SYMDEF") == 0)
{
arch->archive_head = arch->archive_head->next;
}
/* Map over each element */
for (current = arch->archive_head;
current != (bfd *)NULL;
current = current->next, elt_no++)
{
if ((bfd_check_format (current, bfd_object) == true)
&& ((bfd_get_file_flags (current) & HAS_SYMS))) {
asymbol **syms;
unsigned int storage;
unsigned int symcount;
unsigned int src_count;
asymbol **syms;
unsigned int storage;
unsigned int symcount;
unsigned int src_count;
storage = get_symtab_upper_bound (current);
if (storage != 0) {
storage = get_symtab_upper_bound (current);
if (storage != 0) {
syms = (asymbol **) bfd_zalloc (arch,storage);
if (syms == NULL) {
bfd_error = no_memory; /* FIXME -- memory leak */
return false;
}
symcount = bfd_canonicalize_symtab (current, syms);
syms = (asymbol **) bfd_zalloc (arch,storage);
if (syms == NULL) {
bfd_error = no_memory; /* FIXME -- memory leak */
return false;
}
symcount = bfd_canonicalize_symtab (current, syms);
/* Now map over all the symbols, picking out the ones we want */
for (src_count = 0; src_count <symcount; src_count++) {
flagword flags = (syms[src_count])->flags;
if ((flags & BSF_GLOBAL) ||
(flags & BSF_FORT_COMM)) {
/* Now map over all the symbols, picking out the ones we want */
for (src_count = 0; src_count <symcount; src_count++) {
flagword flags = (syms[src_count])->flags;
if ((flags & BSF_GLOBAL) ||
(flags & BSF_FORT_COMM)) {
/* This symbol will go into the archive header */
if (orl_count == orl_max)
{
orl_max *= 2;
map = (struct orl *) bfd_realloc (arch, (char *) map,
orl_max * sizeof (struct orl));
/* This symbol will go into the archive header */
if (orl_count == orl_max)
{
orl_max *= 2;
map = (struct orl *) bfd_realloc (arch, (char *) map,
orl_max * sizeof (struct orl));
}
(map[orl_count]).name = (char **) &((syms[src_count])->name);
(map[orl_count]).pos = (file_ptr) current;
(map[orl_count]).namidx = stridx;
stridx += strlen ((syms[src_count])->name) + 1;
++orl_count;
}
}
}
(map[orl_count]).name = (char **) &((syms[src_count])->name);
(map[orl_count]).pos = (file_ptr) current;
(map[orl_count]).namidx = stridx;
stridx += strlen ((syms[src_count])->name) + 1;
++orl_count;
}
}
}
}
/* OK, now we have collected all the data, let's write them out */
if (!BFD_SEND (arch, write_armap,
(arch, elength, map, orl_count, stridx))) {
return false;
}
}
/* OK, now we have collected all the data, let's write them out */
if (!BFD_SEND (arch, write_armap,
(arch, elength, map, orl_count, stridx))) {
return false;
}
return true;
return true;
}
boolean
@ -1157,7 +1166,7 @@ bsd_write_armap (arch, elength, map, orl_count, stridx)
bfd *arch;
unsigned int elength;
struct orl *map;
int orl_count;
unsigned int orl_count;
int stridx;
{
unsigned int ranlibsize = orl_count * sizeof (struct ranlib);

View File

@ -383,16 +383,10 @@ asymbol *symbol)
{
flagword flags = symbol->flags;
#if 0
if ((symbol->value == 0) && (symbol->section != NULL))
/* Huh? All section names don't begin with "." */
return (symbol->section->name)[1];
#endif
if (flags & BSF_FORT_COMM) return 'C';
if (flags & BSF_UNDEFINED) return 'U';
if (flags & BSF_ABSOLUTE) return 'a';
if (flags & BSF_ABSOLUTE)
return (flags & BSF_GLOBAL) ? 'A' : 'a';
if ( flags & (BSF_GLOBAL|BSF_LOCAL) ) {
if (symbol->section == (asection *)NULL)