Update for recent BFD changes to symbol and reloc reading. Rename
authorIan Lance Taylor <ian@airs.com>
Wed, 30 Mar 1994 22:06:17 +0000 (22:06 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 30 Mar 1994 22:06:17 +0000 (22:06 +0000)
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.

binutils/ChangeLog
binutils/nlmconv.c
binutils/nm.c
binutils/objcopy.c
binutils/objdump.c

index 1c14a02235daff21fb48e3c36e09aa3e786d3090..b94f0e91757f5328f816753565b0a1757509464c 100644 (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
index 3979d29f41b8c0175ec7739eb793264e54c38a4c..2fe381e13337141ab0e714dc17f97029d0a67320 100644 (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 */
index 201c3c90104b1cc3cc8ef8245eee844a72a30672..2baa9a61caede7769ade51746b09a5eb877cdb91 100644 (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);
index ebcb24fdee81222364d694e9095d7b719259f01b..4572626f3a08dbbb86f911a12946eb75580f8828 100644 (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.  */
index d6647d2140eb4b098b1ff3d2f8b312bbbf3fe343..512e6a749a2f368aa83be31a178ccaaca29e0e1d 100644 (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];