Update for recent BFD changes to symbol and reloc reading. Rename

all uses of get_symtab_upper_bound to bfd_get_symtab_upper_bound.
	Also:
	* coffgrok.c (symcount): Change to long.
	(do_sections_p1): Check for error return from
	bfd_get_reloc_upper_bound.  Change relcount to long, and check for
	error from bfd_canonicalize_reloc.
	(coff_grok): Change storage to long.  Check for error from
	bfd_get_symtab_upper_bound and bfd_canonicalize_symtab.
	* nlmconv.c (main): Change symcount, newsymalloc, newsymcount, and
	i to long.  Check for error from bfd_get_symtab_upper_bound and
	bfd_canonicalize_symtab.
	(copy_sections): Change reloc_size and reloc_count to long.  Check
	for error from bfd_get_reloc_upper_bound and
	bfd_canonicalize_reloc.
	(mangle_relocs, i386_mangle_relocs, alpha_mangle_relocs): Change
	reloc_count_ptr argument to long *.  Make corresponding changes to
	variables loaded from *reloc_count_ptr.
	* nm.c (display_rel_file): Change storage and symcount to long.
	Check for errors from bfd_get_symtab_upper_bound and
	bfd_canonicalize_symtab.
	* objcopy.c (filter_symbols): Change symcount, src_count and
	dst_count to long.
	(copy_object): Change symcount to long.  Pass another argument to
	fprintf.  Check for errors from bfd_get_symtab_upper_bound and
	bfd_canonicalize_symtab.
	(copy_section): Change relcount to long.  Check for errors from
	bfd_get_reloc_upper_bound and bfd_canonicalize_reloc.
	(mark_symbols_used_in_relocations): Change relcount and i to long.
	Check for errors form bfd_get_reloc_upper_bound and
	bfd_canonicalize_reloc.
	* objdump.c (storage): Remove global variable.
	(symcount): Changed to long.
	(slurp_symtab): New local variable storage.  Check for errors from
	bfd_get_symtab_upper_bound and bfd_canonicalize_symtab.
	(remove_useless_symbols): Change return value and count to long.
	(objdump_print_address): Change min, max, thisplace and i to long.
	(disassemble_data): Change i to long.
	(dump_symbols): Change count to long.
	(dump_relocs): Change relcount to long.  Check for errors from
	bfd_ret_reloc_upper_bound and bfd_canonicalize_reloc.
	(display_info_table): Add casts when passing LONGEST_ARCH for
	printf %* argument.
This commit is contained in:
Ian Lance Taylor 1994-03-30 22:06:17 +00:00
parent 6c00b04ff8
commit ae5d2ff573
5 changed files with 178 additions and 71 deletions

View File

@ -1,3 +1,49 @@
Wed Mar 30 15:52:40 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com)
Update for recent BFD changes to symbol and reloc reading. Rename
all uses of get_symtab_upper_bound to bfd_get_symtab_upper_bound.
Also:
* coffgrok.c (symcount): Change to long.
(do_sections_p1): Check for error return from
bfd_get_reloc_upper_bound. Change relcount to long, and check for
error from bfd_canonicalize_reloc.
(coff_grok): Change storage to long. Check for error from
bfd_get_symtab_upper_bound and bfd_canonicalize_symtab.
* nlmconv.c (main): Change symcount, newsymalloc, newsymcount, and
i to long. Check for error from bfd_get_symtab_upper_bound and
bfd_canonicalize_symtab.
(copy_sections): Change reloc_size and reloc_count to long. Check
for error from bfd_get_reloc_upper_bound and
bfd_canonicalize_reloc.
(mangle_relocs, i386_mangle_relocs, alpha_mangle_relocs): Change
reloc_count_ptr argument to long *. Make corresponding changes to
variables loaded from *reloc_count_ptr.
* nm.c (display_rel_file): Change storage and symcount to long.
Check for errors from bfd_get_symtab_upper_bound and
bfd_canonicalize_symtab.
* objcopy.c (filter_symbols): Change symcount, src_count and
dst_count to long.
(copy_object): Change symcount to long. Pass another argument to
fprintf. Check for errors from bfd_get_symtab_upper_bound and
bfd_canonicalize_symtab.
(copy_section): Change relcount to long. Check for errors from
bfd_get_reloc_upper_bound and bfd_canonicalize_reloc.
(mark_symbols_used_in_relocations): Change relcount and i to long.
Check for errors form bfd_get_reloc_upper_bound and
bfd_canonicalize_reloc.
* objdump.c (storage): Remove global variable.
(symcount): Changed to long.
(slurp_symtab): New local variable storage. Check for errors from
bfd_get_symtab_upper_bound and bfd_canonicalize_symtab.
(remove_useless_symbols): Change return value and count to long.
(objdump_print_address): Change min, max, thisplace and i to long.
(disassemble_data): Change i to long.
(dump_symbols): Change count to long.
(dump_relocs): Change relcount to long. Check for errors from
bfd_ret_reloc_upper_bound and bfd_canonicalize_reloc.
(display_info_table): Add casts when passing LONGEST_ARCH for
printf %* argument.
Tue Mar 29 14:59:04 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com)
* nm.c (display_archive): Close each archive element after it has

View File

@ -116,23 +116,23 @@ static const char *select_output_format PARAMS ((enum bfd_architecture,
static void setup_sections PARAMS ((bfd *, asection *, PTR));
static void copy_sections PARAMS ((bfd *, asection *, PTR));
static void mangle_relocs PARAMS ((bfd *, asection *, arelent ***,
bfd_size_type *, char *,
long *, char *,
bfd_size_type));
static void i386_mangle_relocs PARAMS ((bfd *, asection *, arelent ***,
bfd_size_type *, char *,
long *, char *,
bfd_size_type));
static void alpha_mangle_relocs PARAMS ((bfd *, asection *, arelent ***,
bfd_size_type *, char *,
long *, char *,
bfd_size_type));
/* start-sanitize-powerpc-netware */
static void powerpc_build_stubs PARAMS ((bfd *, asymbol ***, unsigned int *));
static void powerpc_build_stubs PARAMS ((bfd *, asymbol ***, long *));
static void powerpc_resolve_stubs PARAMS ((bfd *, bfd *));
static void powerpc_mangle_relocs PARAMS ((bfd *, asection *, arelent ***,
bfd_size_type *, char *,
long *, char *,
bfd_size_type));
/* end-sanitize-powerpc-netware */
static void default_mangle_relocs PARAMS ((bfd *, asection *, arelent ***,
bfd_size_type *, char *,
long *, char *,
bfd_size_type));
static char *link_inputs PARAMS ((struct string_list *, char *));
static const char *choose_temp_base_try PARAMS ((const char *,
@ -161,12 +161,13 @@ main (argc, argv)
bfd *inbfd;
bfd *outbfd;
asymbol **newsyms, **outsyms;
unsigned int symcount, newsymalloc, newsymcount;
long symcount, newsymalloc, newsymcount;
long symsize;
asection *text_sec, *bss_sec, *data_sec;
bfd_vma vma;
bfd_size_type align;
asymbol *endsym;
unsigned int i;
long i;
char inlead, outlead;
boolean gotstart, gotexit, gotcheck;
struct stat st;
@ -357,8 +358,13 @@ main (argc, argv)
if (! bfd_set_file_flags (outbfd, bfd_get_file_flags (inbfd)))
bfd_fatal (bfd_get_filename (outbfd));
symbols = (asymbol **) xmalloc (get_symtab_upper_bound (inbfd));
symsize = bfd_get_symtab_upper_bound (inbfd);
if (symsize < 0)
bfd_fatal (input_file);
symbols = (asymbol **) xmalloc (symsize);
symcount = bfd_canonicalize_symtab (inbfd, symbols);
if (symcount < 0)
bfd_fatal (input_file);
/* Make sure we have a .bss section. */
bss_sec = bfd_get_section_by_name (outbfd, NLM_UNINITIALIZED_DATA_NAME);
@ -1193,7 +1199,7 @@ copy_sections (inbfd, insec, data_ptr)
asection *outsec;
bfd_size_type size;
PTR contents;
bfd_size_type reloc_size;
long reloc_size;
/* FIXME: We don't want to copy the .reginfo section of an ECOFF
file. However, I don't have a good way to describe this section.
@ -1224,13 +1230,17 @@ copy_sections (inbfd, insec, data_ptr)
}
reloc_size = bfd_get_reloc_upper_bound (inbfd, insec);
if (reloc_size < 0)
bfd_fatal (bfd_get_filename (inbfd));
if (reloc_size != 0)
{
arelent **relocs;
bfd_size_type reloc_count;
long reloc_count;
relocs = (arelent **) xmalloc (reloc_size);
reloc_count = bfd_canonicalize_reloc (inbfd, insec, relocs, symbols);
if (reloc_count < 0)
bfd_fatal (bfd_get_filename (inbfd));
mangle_relocs (outbfd, insec, &relocs, &reloc_count, (char *) contents,
size);
@ -1272,7 +1282,7 @@ mangle_relocs (outbfd, insec, relocs_ptr, reloc_count_ptr, contents,
bfd *outbfd;
asection *insec;
arelent ***relocs_ptr;
bfd_size_type *reloc_count_ptr;
long *reloc_count_ptr;
char *contents;
bfd_size_type contents_size;
{
@ -1309,15 +1319,15 @@ default_mangle_relocs (outbfd, insec, relocs_ptr, reloc_count_ptr, contents,
bfd *outbfd;
asection *insec;
arelent ***relocs_ptr;
bfd_size_type *reloc_count_ptr;
long *reloc_count_ptr;
char *contents;
bfd_size_type contents_size;
{
if (insec->output_offset != 0)
{
bfd_size_type reloc_count;
long reloc_count;
register arelent **relocs;
register bfd_size_type i;
register long i;
reloc_count = *reloc_count_ptr;
relocs = *relocs_ptr;
@ -1353,11 +1363,11 @@ i386_mangle_relocs (outbfd, insec, relocs_ptr, reloc_count_ptr, contents,
bfd *outbfd;
asection *insec;
arelent ***relocs_ptr;
bfd_size_type *reloc_count_ptr;
long *reloc_count_ptr;
char *contents;
bfd_size_type contents_size;
{
bfd_size_type reloc_count, i;
long reloc_count, i;
arelent **relocs;
reloc_count = *reloc_count_ptr;
@ -1508,11 +1518,11 @@ alpha_mangle_relocs (outbfd, insec, relocs_ptr, reloc_count_ptr, contents,
bfd *outbfd;
asection *insec;
register arelent ***relocs_ptr;
bfd_size_type *reloc_count_ptr;
long *reloc_count_ptr;
char *contents;
bfd_size_type contents_size;
{
bfd_size_type old_reloc_count;
long old_reloc_count;
arelent **old_relocs;
register arelent **relocs;
@ -1652,14 +1662,14 @@ static void
powerpc_build_stubs (inbfd, symbols_ptr, symcount_ptr)
bfd *inbfd;
asymbol ***symbols_ptr;
unsigned int *symcount_ptr;
long *symcount_ptr;
{
asection *stub_sec;
asection *got_sec;
unsigned int got_base;
unsigned int i;
unsigned int symcount;
unsigned int stubcount;
long i;
long symcount;
long stubcount;
/* Make a section to hold stubs. We don't set SEC_HAS_CONTENTS for
the section to prevent copy_sections from reading from it. */
@ -1722,7 +1732,9 @@ powerpc_build_stubs (inbfd, symbols_ptr, symcount_ptr)
/* Define the `.' symbol to be in the stub section. */
sym->section = stub_sec;
sym->value = stubcount * POWERPC_STUB_SIZE;
sym->flags = BSF_LOCAL;
/* We set the BSF_DYNAMIC flag here so that we can check it when
we are mangling relocs. FIXME: This is a hack. */
sym->flags = BSF_LOCAL | BSF_DYNAMIC;
/* Add this stub to the linked list. */
item = (struct powerpc_stub *) xmalloc (sizeof (struct powerpc_stub));
@ -1835,14 +1847,14 @@ powerpc_mangle_relocs (outbfd, insec, relocs_ptr, reloc_count_ptr, contents,
bfd *outbfd;
asection *insec;
register arelent ***relocs_ptr;
bfd_size_type *reloc_count_ptr;
long *reloc_count_ptr;
char *contents;
bfd_size_type contents_size;
{
const reloc_howto_type *toc_howto;
bfd_size_type reloc_count;
long reloc_count;
register arelent **relocs;
register bfd_size_type i;
register long i;
toc_howto = bfd_reloc_type_lookup (insec->owner, BFD_RELOC_PPC_TOC16);
if (toc_howto == (reloc_howto_type *) NULL)
@ -1893,13 +1905,14 @@ powerpc_mangle_relocs (outbfd, insec, relocs_ptr, reloc_count_ptr, contents,
& rel->howto->dst_mask));
bfd_put_32 (outbfd, val, (bfd_byte *) contents + rel->address);
/* If this reloc is against a symbol whose name begins
with a `.', and the next instruction is
/* If this reloc is against an stubbed symbol and the
next instruction is
cror 31,31,31
then we replace the next instruction with
lwz r2,20(r1)
This reloads the TOC pointer after a call. */
This reloads the TOC pointer after a stub call. */
if (bfd_asymbol_name (sym)[0] == '.'
&& (sym->flags & BSF_DYNAMIC) != 0
&& (bfd_get_32 (outbfd,
(bfd_byte *) contents + rel->address + 4)
== 0x4ffffb82)) /* cror 31,31,31 */

View File

@ -505,9 +505,9 @@ display_rel_file (abfd, archive_bfd)
bfd *abfd;
bfd *archive_bfd;
{
unsigned int storage;
long storage;
asymbol **syms;
unsigned int symcount = 0;
long symcount = 0;
if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
{
@ -515,7 +515,9 @@ display_rel_file (abfd, archive_bfd)
return;
}
storage = get_symtab_upper_bound (abfd);
storage = bfd_get_symtab_upper_bound (abfd);
if (storage < 0)
bfd_fatal (bfd_get_filename (abfd));
if (storage == 0)
{
nosymz:
@ -527,6 +529,8 @@ display_rel_file (abfd, archive_bfd)
syms = (asymbol **) xmalloc (storage);
symcount = bfd_canonicalize_symtab (abfd, syms);
if (symcount < 0)
bfd_fatal (bfd_get_filename (abfd));
if (symcount == 0)
{
free (syms);

View File

@ -178,10 +178,10 @@ static unsigned int
filter_symbols (abfd, osyms, isyms, symcount)
bfd *abfd;
asymbol **osyms, **isyms;
unsigned long symcount;
long symcount;
{
register asymbol **from = isyms, **to = osyms;
unsigned int src_count = 0, dst_count = 0;
long src_count = 0, dst_count = 0;
for (; src_count < symcount; src_count++)
{
@ -229,7 +229,7 @@ copy_object (ibfd, obfd)
bfd *ibfd;
bfd *obfd;
{
unsigned int symcount;
long symcount;
if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
{
@ -272,7 +272,8 @@ copy_object (ibfd, obfd)
if (!bfd_copy_private_bfd_data (ibfd, obfd))
{
fprintf (stderr, "%s: %s: error copying private BFD data: %s\n",
program_name, bfd_errmsg (bfd_get_error ()));
program_name, bfd_get_filename (obfd),
bfd_errmsg (bfd_get_error ()));
status = 1;
return;
}
@ -290,8 +291,20 @@ copy_object (ibfd, obfd)
}
else
{
osympp = isympp = (asymbol **) xmalloc (get_symtab_upper_bound (ibfd));
long symsize;
symsize = bfd_get_symtab_upper_bound (ibfd);
if (symsize < 0)
{
nonfatal (bfd_get_filename (ibfd));
}
osympp = isympp = (asymbol **) xmalloc (symsize);
symcount = bfd_canonicalize_symtab (ibfd, isympp);
if (symcount < 0)
{
nonfatal (bfd_get_filename (ibfd));
}
if (strip_symbols == strip_debug || discard_locals != locals_undef)
{
@ -560,7 +573,7 @@ copy_section (ibfd, isection, obfd)
bfd *obfd;
{
arelent **relpp;
int relcount;
long relcount;
sec_ptr osection;
bfd_size_type size;
@ -578,16 +591,29 @@ copy_section (ibfd, isection, obfd)
if (size == 0 || osection == 0)
return;
if (strip_symbols == strip_all
|| bfd_get_reloc_upper_bound (ibfd, isection) == 0)
{
bfd_set_reloc (obfd, osection, (arelent **) NULL, 0);
}
if (strip_symbols == strip_all)
bfd_set_reloc (obfd, osection, (arelent **) NULL, 0);
else
{
relpp = (arelent **) xmalloc (bfd_get_reloc_upper_bound (ibfd, isection));
relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
bfd_set_reloc (obfd, osection, relpp, relcount);
long relsize;
relsize = bfd_get_reloc_upper_bound (ibfd, isection);
if (relsize < 0)
{
nonfatal (bfd_get_filename (ibfd));
}
if (relsize == 0)
bfd_set_reloc (obfd, osection, (arelent **) NULL, 0);
else
{
relpp = (arelent **) xmalloc (relsize);
relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
if (relcount < 0)
{
nonfatal (bfd_get_filename (ibfd));
}
bfd_set_reloc (obfd, osection, relpp, relcount);
}
}
isection->_cooked_size = isection->_raw_size;
@ -626,15 +652,22 @@ mark_symbols_used_in_relocations (ibfd, isection, symbols)
sec_ptr isection;
asymbol **symbols;
{
long relsize;
arelent **relpp;
unsigned int relcount, i;
long relcount, i;
/* Ignore an input section with no corresponding output section. */
if (isection->output_section == NULL)
return;
relpp = (arelent **) xmalloc (bfd_get_reloc_upper_bound (ibfd, isection));
relsize = bfd_get_reloc_upper_bound (ibfd, isection);
if (relsize < 0)
bfd_fatal (bfd_get_filename (ibfd));
relpp = (arelent **) xmalloc (relsize);
relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, symbols);
if (relcount < 0)
bfd_fatal (bfd_get_filename (ibfd));
/* Examine each symbol used in a relocation. If it's not one of the
special bfd section symbols, then mark it with BSF_KEEP. */

View File

@ -64,11 +64,8 @@ char *machine = (char *) NULL;
/* The symbol table. */
asymbol **syms;
/* Number of bytes allocated for `syms'. */
unsigned int storage;
/* Number of symbols in `syms'. */
unsigned int symcount = 0;
long symcount = 0;
/* Forward declarations. */
@ -179,6 +176,7 @@ slurp_symtab (abfd)
bfd *abfd;
{
asymbol **sy = (asymbol **) NULL;
long storage;
if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
{
@ -186,13 +184,18 @@ slurp_symtab (abfd)
return NULL;
}
storage = get_symtab_upper_bound (abfd);
storage = bfd_get_symtab_upper_bound (abfd);
if (storage < 0)
bfd_fatal (bfd_get_filename (abfd));
if (storage)
{
sy = (asymbol **) xmalloc (storage);
}
symcount = bfd_canonicalize_symtab (abfd, sy);
if (symcount <= 0)
if (symcount < 0)
bfd_fatal (bfd_get_filename (abfd));
if (symcount == 0)
{
fprintf (stderr, "%s: %s: Invalid symbol table\n",
program_name, bfd_get_filename (abfd));
@ -205,10 +208,10 @@ slurp_symtab (abfd)
COUNT is the number of elements in SYMBOLS.
Return the number of useful symbols. */
int
long
remove_useless_symbols (symbols, count)
asymbol **symbols;
int count;
long count;
{
register asymbol **in_ptr = symbols, **out_ptr = symbols;
@ -267,9 +270,9 @@ objdump_print_address (vma, info)
constantly churned by code doing heavy memory accesses. */
/* Indices in `syms'. */
unsigned int min = 0;
unsigned int max = symcount;
unsigned int thisplace;
long min = 0;
long max = symcount;
long thisplace;
bfd_signed_vma vardiff;
@ -308,7 +311,7 @@ objdump_print_address (vma, info)
/* If this symbol isn't global, search for one with the same value
that is. */
bfd_vma val = syms[thisplace]->value;
int i;
long i;
if (syms[thisplace]->flags & (BSF_LOCAL|BSF_DEBUGGING))
for (i = thisplace - 1; i >= 0; i--)
{
@ -344,7 +347,7 @@ objdump_print_address (vma, info)
no way to tell what's desired without looking at the relocation
table. */
struct objdump_disasm_info *aux;
int i;
long i;
aux = (struct objdump_disasm_info *) info->application_data;
if ((aux->abfd->flags & HAS_RELOC)
@ -413,7 +416,7 @@ void
disassemble_data (abfd)
bfd *abfd;
{
bfd_size_type i;
long i;
unsigned int (*print) () = 0; /* Old style */
disassembler_ftype disassemble = 0; /* New style */
struct disassemble_info disasm_info;
@ -1065,8 +1068,7 @@ static void
dump_symbols (abfd)
bfd *abfd;
{
unsigned int count;
long count;
asymbol **current = syms;
printf ("SYMBOL TABLE:\n");
@ -1097,11 +1099,13 @@ dump_relocs (abfd)
bfd *abfd;
{
arelent **relpp;
unsigned int relcount;
long relcount;
asection *a;
for (a = abfd->sections; a != (asection *) NULL; a = a->next)
{
long relsize;
if (a == &bfd_abs_section)
continue;
if (a == &bfd_und_section)
@ -1119,7 +1123,11 @@ dump_relocs (abfd)
printf ("RELOCATION RECORDS FOR [%s]:", a->name);
if (bfd_get_reloc_upper_bound (abfd, a) == 0)
relsize = bfd_get_reloc_upper_bound (abfd, a);
if (relsize < 0)
bfd_fatal (bfd_get_filename (abfd));
if (relsize == 0)
{
printf (" (none)\n\n");
}
@ -1127,10 +1135,12 @@ dump_relocs (abfd)
{
arelent **p;
relpp = (arelent **) xmalloc (bfd_get_reloc_upper_bound (abfd, a));
relpp = (arelent **) xmalloc (relsize);
/* Note that this must be done *before* we sort the syms table. */
relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
if (relcount == 0)
if (relcount < 0)
bfd_fatal (bfd_get_filename (abfd));
else if (relcount == 0)
{
printf (" (none)\n\n");
}
@ -1253,7 +1263,7 @@ display_info_table (first, last)
extern bfd_target *bfd_target_vector[];
/* Print heading of target names. */
printf ("\n%*s", LONGEST_ARCH, " ");
printf ("\n%*s", (int) LONGEST_ARCH, " ");
for (t = first; t++ < last && bfd_target_vector[t];)
printf ("%s ", bfd_target_vector[t]->name);
putchar ('\n');
@ -1261,7 +1271,8 @@ display_info_table (first, last)
for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
{
printf ("%*s ", LONGEST_ARCH - 1, bfd_printable_arch_mach (a, 0));
printf ("%*s ", (int) LONGEST_ARCH - 1,
bfd_printable_arch_mach (a, 0));
for (t = first; t++ < last && bfd_target_vector[t];)
{
bfd_target *p = bfd_target_vector[t];