Automatic date update in version.in
[platform/upstream/binutils.git] / bfd / aoutx.h
index 1244510..9385a98 100644 (file)
@@ -1,7 +1,5 @@
 /* BFD semi-generic back-end for a.out binaries.
-   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
-   Free Software Foundation, Inc.
+   Copyright (C) 1990-2014 Free Software Foundation, Inc.
    Written by Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -68,12 +66,12 @@ DESCRIPTION
        from @file{sunos.c}:
 
 |      #define TARGET_NAME "a.out-sunos-big"
-|      #define VECNAME    sunos_big_vec
+|      #define VECNAME    sparc_aout_sunos_be_vec
 |      #include "aoutf1.h"
 
        requires all the names from @file{aout32.c}, and produces the jump vector
 
-|      sunos_big_vec
+|      sparc_aout_sunos_be_vec
 
        The file @file{host-aout.c} is a special case.  It is for a large set
        of hosts that use ``more or less standard'' a.out files, and
@@ -103,7 +101,7 @@ DESCRIPTION
 |      TDEFAULTS = -DDEFAULT_VECTOR=host_aout_big_vec
 |      TDEPFILES= host-aout.o trad-core.o
 
-       in the @file{config/@var{XXX}.mt} file, and modify @file{configure.in}
+       in the @file{config/@var{XXX}.mt} file, and modify @file{configure.ac}
        to use the
        @file{@var{XXX}.mt} file (by setting "<<bfd_target=XXX>>") when your
        configuration is selected.  */
@@ -269,7 +267,7 @@ NAME (aout, reloc_type_lookup) (bfd *abfd, bfd_reloc_code_real_type code)
   int ext = obj_reloc_entry_size (abfd) == RELOC_EXT_SIZE;
 
   if (code == BFD_RELOC_CTOR)
-    switch (bfd_get_arch_info (abfd)->bits_per_address)
+    switch (bfd_arch_bits_per_address (abfd))
       {
       case 32:
        code = BFD_RELOC_32;
@@ -464,7 +462,7 @@ NAME (aout, some_aout_object_p) (bfd *abfd,
   const bfd_target *result;
   bfd_size_type amt = sizeof (* rawptr);
 
-  rawptr = bfd_zalloc (abfd, amt);
+  rawptr = (struct aout_data_struct *) bfd_zalloc (abfd, amt);
   if (rawptr == NULL)
     return NULL;
 
@@ -629,7 +627,9 @@ NAME (aout, some_aout_object_p) (bfd *abfd,
   if (execp->a_entry != 0
       || (execp->a_entry >= obj_textsec (abfd)->vma
          && execp->a_entry < (obj_textsec (abfd)->vma
-                              + obj_textsec (abfd)->size)))
+                              + obj_textsec (abfd)->size)
+         && execp->a_trsize == 0
+         && execp->a_drsize == 0))
     abfd->flags |= EXEC_P;
 #ifdef STAT_FOR_EXEC
   else
@@ -679,7 +679,7 @@ NAME (aout, mkobject) (bfd *abfd)
 
   bfd_set_error (bfd_error_system_call);
 
-  rawptr = bfd_zalloc (abfd, amt);
+  rawptr = (struct aout_data_struct *) bfd_zalloc (abfd, amt);
   if (rawptr == NULL)
     return FALSE;
 
@@ -786,13 +786,22 @@ NAME (aout, machine_type) (enum bfd_architecture arch,
        case bfd_mach_mips9000:
        case bfd_mach_mips10000:
        case bfd_mach_mips12000:
+       case bfd_mach_mips14000:
+       case bfd_mach_mips16000:
        case bfd_mach_mips16:
        case bfd_mach_mipsisa32:
        case bfd_mach_mipsisa32r2:
+       case bfd_mach_mipsisa32r3:
+       case bfd_mach_mipsisa32r5:
+       case bfd_mach_mipsisa32r6:
        case bfd_mach_mips5:
        case bfd_mach_mipsisa64:
        case bfd_mach_mipsisa64r2:
+       case bfd_mach_mipsisa64r3:
+       case bfd_mach_mipsisa64r5:
+       case bfd_mach_mipsisa64r6:
        case bfd_mach_mips_sb1:
+       case bfd_mach_mips_xlr:
          /* FIXME: These should be MIPS3, MIPS4, MIPS16, MIPS32, etc.  */
          arch_flags = M_MIPS2;
          break;
@@ -1291,13 +1300,14 @@ aout_get_external_symbols (bfd *abfd)
     {
       bfd_size_type count;
       struct external_nlist *syms;
-      bfd_size_type amt;
+      bfd_size_type amt = exec_hdr (abfd)->a_syms;
 
-      count = exec_hdr (abfd)->a_syms / EXTERNAL_NLIST_SIZE;
+      count = amt / EXTERNAL_NLIST_SIZE;
+      if (count == 0)
+       return TRUE;            /* Nothing to do.  */
 
 #ifdef USE_MMAP
-      if (! bfd_get_file_window (abfd, obj_sym_filepos (abfd),
-                                exec_hdr (abfd)->a_syms,
+      if (! bfd_get_file_window (abfd, obj_sym_filepos (abfd), amt,
                                 &obj_aout_sym_window (abfd), TRUE))
        return FALSE;
       syms = (struct external_nlist *) obj_aout_sym_window (abfd).data;
@@ -1305,11 +1315,10 @@ aout_get_external_symbols (bfd *abfd)
       /* We allocate using malloc to make the values easy to free
         later on.  If we put them on the objalloc it might not be
         possible to free them.  */
-      syms = bfd_malloc (count * EXTERNAL_NLIST_SIZE);
-      if (syms == NULL && count != 0)
+      syms = (struct external_nlist *) bfd_malloc (amt);
+      if (syms == NULL)
        return FALSE;
 
-      amt = exec_hdr (abfd)->a_syms;
       if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
          || bfd_bread (syms, amt, abfd) != amt)
        {
@@ -1342,7 +1351,7 @@ aout_get_external_symbols (bfd *abfd)
        return FALSE;
       strings = (char *) obj_aout_string_window (abfd).data;
 #else
-      strings = bfd_malloc (stringsize + 1);
+      strings = (char *) bfd_malloc (stringsize + 1);
       if (strings == NULL)
        return FALSE;
 
@@ -1661,12 +1670,12 @@ NAME (aout, make_empty_symbol) (bfd *abfd)
 {
   bfd_size_type amt = sizeof (aout_symbol_type);
 
-  aout_symbol_type *new = bfd_zalloc (abfd, amt);
-  if (!new)
+  aout_symbol_type *new_symbol = (aout_symbol_type *) bfd_zalloc (abfd, amt);
+  if (!new_symbol)
     return NULL;
-  new->symbol.the_bfd = abfd;
+  new_symbol->symbol.the_bfd = abfd;
 
-  return &new->symbol;
+  return &new_symbol->symbol;
 }
 
 /* Translate a set of internal symbols into external symbols.  */
@@ -1743,7 +1752,7 @@ NAME (aout, slurp_symbol_table) (bfd *abfd)
     return TRUE;               /* Nothing to do.  */
 
   cached_size *= sizeof (aout_symbol_type);
-  cached = bfd_zmalloc (cached_size);
+  cached = (aout_symbol_type *) bfd_zmalloc (cached_size);
   if (cached == NULL)
     return FALSE;
 
@@ -1801,7 +1810,7 @@ add_to_stringtab (bfd *abfd,
                  bfd_boolean copy)
 {
   bfd_boolean hash;
-  bfd_size_type index;
+  bfd_size_type str_index;
 
   /* An index of 0 always means the empty string.  */
   if (str == 0 || *str == '\0')
@@ -1813,14 +1822,14 @@ add_to_stringtab (bfd *abfd,
   if ((abfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
     hash = FALSE;
 
-  index = _bfd_stringtab_add (tab, str, hash, copy);
+  str_index = _bfd_stringtab_add (tab, str, hash, copy);
 
-  if (index != (bfd_size_type) -1)
+  if (str_index != (bfd_size_type) -1)
     /* Add BYTES_IN_WORD to the return value to account for the
        space taken up by the string table size.  */
-    index += BYTES_IN_WORD;
+    str_index += BYTES_IN_WORD;
 
-  return index;
+  return str_index;
 }
 
 /* Write out a strtab.  ABFD is already at the right location in the
@@ -2304,7 +2313,7 @@ NAME (aout, slurp_reloc_table) (bfd *abfd, sec_ptr asect, asymbol **symbols)
     return TRUE;               /* Nothing to be done.  */
 
   amt = count * sizeof (arelent);
-  reloc_cache = bfd_zmalloc (amt);
+  reloc_cache = (arelent *) bfd_zmalloc (amt);
   if (reloc_cache == NULL)
     return FALSE;
 
@@ -2365,7 +2374,7 @@ NAME (aout, squirt_out_relocs) (bfd *abfd, asection *section)
 
   each_size = obj_reloc_entry_size (abfd);
   natsize = (bfd_size_type) each_size * count;
-  native = bfd_zalloc (abfd, natsize);
+  native = (unsigned char *) bfd_zalloc (abfd, natsize);
   if (!native)
     return FALSE;
 
@@ -2627,12 +2636,13 @@ NAME (aout, minisymbol_to_symbol) (bfd *abfd,
 
 bfd_boolean
 NAME (aout, find_nearest_line) (bfd *abfd,
-                               asection *section,
                                asymbol **symbols,
+                               asection *section,
                                bfd_vma offset,
                                const char **filename_ptr,
                                const char **functionname_ptr,
-                               unsigned int *line_ptr)
+                               unsigned int *line_ptr,
+                               unsigned int *disriminator_ptr)
 {
   /* Run down the file looking for the filename, function and linenumber.  */
   asymbol **p;
@@ -2650,6 +2660,8 @@ NAME (aout, find_nearest_line) (bfd *abfd,
   *filename_ptr = abfd->filename;
   *functionname_ptr = 0;
   *line_ptr = 0;
+  if (disriminator_ptr)
+    *disriminator_ptr = 0;
 
   if (symbols != NULL)
     {
@@ -2779,7 +2791,7 @@ NAME (aout, find_nearest_line) (bfd *abfd,
     adata (abfd).line_buf = buf = NULL;
   else
     {
-      buf = bfd_malloc (filelen + funclen + 3);
+      buf = (char *) bfd_malloc (filelen + funclen + 3);
       adata (abfd).line_buf = buf;
       if (buf == NULL)
        return FALSE;
@@ -2873,7 +2885,8 @@ NAME (aout, link_hash_newfunc) (struct bfd_hash_entry *entry,
   /* Allocate the structure if it has not already been allocated by a
      subclass.  */
   if (ret == NULL)
-    ret = bfd_hash_allocate (table, sizeof (* ret));
+    ret = (struct aout_link_hash_entry *) bfd_hash_allocate (table,
+                                                             sizeof (* ret));
   if (ret == NULL)
     return NULL;
 
@@ -2912,7 +2925,7 @@ NAME (aout, link_hash_table_create) (bfd *abfd)
   struct aout_link_hash_table *ret;
   bfd_size_type amt = sizeof (* ret);
 
-  ret = bfd_malloc (amt);
+  ret = (struct aout_link_hash_table *) bfd_malloc (amt);
   if (ret == NULL)
     return NULL;
 
@@ -2967,7 +2980,7 @@ aout_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
      table, but keeping the list is more efficient.  Perhaps this
      should be conditional on info->keep_memory.  */
   amt = sym_count * sizeof (struct aout_link_hash_entry *);
-  sym_hash = bfd_alloc (abfd, amt);
+  sym_hash = (struct aout_link_hash_entry **) bfd_alloc (abfd, amt);
   if (sym_hash == NULL)
     return FALSE;
   obj_aout_sym_hashes (abfd) = sym_hash;
@@ -3200,7 +3213,8 @@ aout_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
 static bfd_boolean
 aout_link_check_ar_symbols (bfd *abfd,
                            struct bfd_link_info *info,
-                           bfd_boolean *pneeded)
+                           bfd_boolean *pneeded,
+                           bfd **subsbfd)
 {
   struct external_nlist *p;
   struct external_nlist *pend;
@@ -3276,7 +3290,7 @@ aout_link_check_ar_symbols (bfd *abfd,
            {
              int skip = 0;
 
-             switch (info->common_skip_ar_aymbols)
+             switch (info->common_skip_ar_symbols)
                {
                case bfd_link_common_skip_text:
                  skip = (type == (N_TEXT | N_EXT));
@@ -3294,7 +3308,8 @@ aout_link_check_ar_symbols (bfd *abfd,
                continue;
            }
 
-         if (! (*info->callbacks->add_archive_element) (info, abfd, name))
+         if (!(*info->callbacks
+               ->add_archive_element) (info, abfd, name, subsbfd))
            return FALSE;
          *pneeded = TRUE;
          return TRUE;
@@ -3321,9 +3336,8 @@ aout_link_check_ar_symbols (bfd *abfd,
                         outside BFD.  We assume that we should link
                         in the object file.  This is done for the -u
                         option in the linker.  */
-                     if (! (*info->callbacks->add_archive_element) (info,
-                                                                    abfd,
-                                                                    name))
+                     if (!(*info->callbacks
+                           ->add_archive_element) (info, abfd, name, subsbfd))
                        return FALSE;
                      *pneeded = TRUE;
                      return TRUE;
@@ -3331,8 +3345,9 @@ aout_link_check_ar_symbols (bfd *abfd,
                  /* Turn the current link symbol into a common
                     symbol.  It is already on the undefs list.  */
                  h->type = bfd_link_hash_common;
-                 h->u.c.p = bfd_hash_allocate (&info->hash->table,
-                                               sizeof (struct bfd_link_hash_common_entry));
+                 h->u.c.p = (struct bfd_link_hash_common_entry *)
+                   bfd_hash_allocate (&info->hash->table,
+                                      sizeof (struct bfd_link_hash_common_entry));
                  if (h->u.c.p == NULL)
                    return FALSE;
 
@@ -3370,7 +3385,8 @@ aout_link_check_ar_symbols (bfd *abfd,
             it if the current link symbol is common.  */
          if (h->type == bfd_link_hash_undefined)
            {
-             if (! (*info->callbacks->add_archive_element) (info, abfd, name))
+             if (!(*info->callbacks
+                   ->add_archive_element) (info, abfd, name, subsbfd))
                return FALSE;
              *pneeded = TRUE;
              return TRUE;
@@ -3389,23 +3405,40 @@ aout_link_check_ar_symbols (bfd *abfd,
 static bfd_boolean
 aout_link_check_archive_element (bfd *abfd,
                                 struct bfd_link_info *info,
+                                struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED,
+                                const char *name ATTRIBUTE_UNUSED,
                                 bfd_boolean *pneeded)
 {
-  if (! aout_get_external_symbols (abfd))
+  bfd *oldbfd;
+  bfd_boolean needed;
+
+  if (!aout_get_external_symbols (abfd))
     return FALSE;
 
-  if (! aout_link_check_ar_symbols (abfd, info, pneeded))
+  oldbfd = abfd;
+  if (!aout_link_check_ar_symbols (abfd, info, pneeded, &abfd))
     return FALSE;
 
-  if (*pneeded)
+  needed = *pneeded;
+  if (needed)
     {
-      if (! aout_link_add_symbols (abfd, info))
+      /* Potentially, the add_archive_element hook may have set a
+        substitute BFD for us.  */
+      if (abfd != oldbfd)
+       {
+         if (!info->keep_memory
+             && !aout_link_free_symbols (oldbfd))
+           return FALSE;
+         if (!aout_get_external_symbols (abfd))
+           return FALSE;
+       }
+      if (!aout_link_add_symbols (abfd, info))
        return FALSE;
     }
 
-  if (! info->keep_memory || ! *pneeded)
+  if (!info->keep_memory || !needed)
     {
-      if (! aout_link_free_symbols (abfd))
+      if (!aout_link_free_symbols (abfd))
        return FALSE;
     }
 
@@ -3502,7 +3535,8 @@ aout_link_includes_newfunc (struct bfd_hash_entry *entry,
   /* Allocate the structure if it has not already been allocated by a
      subclass.  */
   if (ret == NULL)
-    ret = bfd_hash_allocate (table, sizeof (* ret));
+    ret = (struct aout_link_includes_entry *)
+        bfd_hash_allocate (table, sizeof (* ret));
   if (ret == NULL)
     return NULL;
 
@@ -3522,9 +3556,10 @@ aout_link_includes_newfunc (struct bfd_hash_entry *entry,
    object.  */
 
 static bfd_boolean
-aout_link_write_other_symbol (struct aout_link_hash_entry *h, void * data)
+aout_link_write_other_symbol (struct bfd_hash_entry *bh, void *data)
 {
-  struct aout_final_link_info *finfo = (struct aout_final_link_info *) data;
+  struct aout_link_hash_entry *h = (struct aout_link_hash_entry *) bh;
+  struct aout_final_link_info *flaginfo = (struct aout_final_link_info *) data;
   bfd *output_bfd;
   int type;
   bfd_vma val;
@@ -3539,12 +3574,12 @@ aout_link_write_other_symbol (struct aout_link_hash_entry *h, void * data)
        return TRUE;
     }
 
-  output_bfd = finfo->output_bfd;
+  output_bfd = flaginfo->output_bfd;
 
   if (aout_backend_info (output_bfd)->write_dynamic_symbol != NULL)
     {
       if (! ((*aout_backend_info (output_bfd)->write_dynamic_symbol)
-            (output_bfd, finfo->info, h)))
+            (output_bfd, flaginfo->info, h)))
        {
          /* FIXME: No way to handle errors.  */
          abort ();
@@ -3558,9 +3593,9 @@ aout_link_write_other_symbol (struct aout_link_hash_entry *h, void * data)
 
   /* An indx of -2 means the symbol must be written.  */
   if (h->indx != -2
-      && (finfo->info->strip == strip_all
-         || (finfo->info->strip == strip_some
-             && bfd_hash_lookup (finfo->info->keep_hash, h->root.root.string,
+      && (flaginfo->info->strip == strip_all
+         || (flaginfo->info->strip == strip_some
+             && bfd_hash_lookup (flaginfo->info->keep_hash, h->root.root.string,
                                  FALSE, FALSE) == NULL)))
     return TRUE;
 
@@ -3608,6 +3643,7 @@ aout_link_write_other_symbol (struct aout_link_hash_entry *h, void * data)
     case bfd_link_hash_undefweak:
       type = N_WEAKU;
       val = 0;
+      break;
     case bfd_link_hash_indirect:
       /* We ignore these symbols, since the indirected symbol is
         already in the hash table.  */
@@ -3617,7 +3653,7 @@ aout_link_write_other_symbol (struct aout_link_hash_entry *h, void * data)
   H_PUT_8 (output_bfd, type, outsym.e_type);
   H_PUT_8 (output_bfd, 0, outsym.e_other);
   H_PUT_16 (output_bfd, 0, outsym.e_desc);
-  indx = add_to_stringtab (output_bfd, finfo->strtab, h->root.root.string,
+  indx = add_to_stringtab (output_bfd, flaginfo->strtab, h->root.root.string,
                           FALSE);
   if (indx == - (bfd_size_type) 1)
     /* FIXME: No way to handle errors.  */
@@ -3627,12 +3663,12 @@ aout_link_write_other_symbol (struct aout_link_hash_entry *h, void * data)
   PUT_WORD (output_bfd, val, outsym.e_value);
 
   amt = EXTERNAL_NLIST_SIZE;
-  if (bfd_seek (output_bfd, finfo->symoff, SEEK_SET) != 0
+  if (bfd_seek (output_bfd, flaginfo->symoff, SEEK_SET) != 0
       || bfd_bwrite ((void *) &outsym, amt, output_bfd) != amt)
     /* FIXME: No way to handle errors.  */
     abort ();
 
-  finfo->symoff += EXTERNAL_NLIST_SIZE;
+  flaginfo->symoff += EXTERNAL_NLIST_SIZE;
   h->indx = obj_aout_external_sym_count (output_bfd);
   ++obj_aout_external_sym_count (output_bfd);
 
@@ -3642,7 +3678,7 @@ aout_link_write_other_symbol (struct aout_link_hash_entry *h, void * data)
 /* Handle a link order which is supposed to generate a reloc.  */
 
 static bfd_boolean
-aout_link_reloc_link_order (struct aout_final_link_info *finfo,
+aout_link_reloc_link_order (struct aout_final_link_info *flaginfo,
                            asection *o,
                            struct bfd_link_order *p)
 {
@@ -3665,7 +3701,7 @@ aout_link_reloc_link_order (struct aout_final_link_info *finfo,
        r_index = N_ABS | N_EXT;
       else
        {
-         BFD_ASSERT (pr->u.section->owner == finfo->output_bfd);
+         BFD_ASSERT (pr->u.section->owner == flaginfo->output_bfd);
          r_index = pr->u.section->target_index;
        }
     }
@@ -3676,7 +3712,7 @@ aout_link_reloc_link_order (struct aout_final_link_info *finfo,
       BFD_ASSERT (p->type == bfd_symbol_reloc_link_order);
       r_extern = 1;
       h = ((struct aout_link_hash_entry *)
-          bfd_wrapped_link_hash_lookup (finfo->output_bfd, finfo->info,
+          bfd_wrapped_link_hash_lookup (flaginfo->output_bfd, flaginfo->info,
                                         pr->u.name, FALSE, FALSE, TRUE));
       if (h != NULL
          && h->indx >= 0)
@@ -3689,37 +3725,37 @@ aout_link_reloc_link_order (struct aout_final_link_info *finfo,
             symbol.  */
          h->indx = -2;
          h->written = FALSE;
-         if (! aout_link_write_other_symbol (h, (void *) finfo))
+         if (!aout_link_write_other_symbol (&h->root.root, flaginfo))
            return FALSE;
          r_index = h->indx;
        }
       else
        {
-         if (! ((*finfo->info->callbacks->unattached_reloc)
-                (finfo->info, pr->u.name, NULL, NULL, (bfd_vma) 0)))
+         if (! ((*flaginfo->info->callbacks->unattached_reloc)
+                (flaginfo->info, pr->u.name, NULL, NULL, (bfd_vma) 0)))
            return FALSE;
          r_index = 0;
        }
     }
 
-  howto = bfd_reloc_type_lookup (finfo->output_bfd, pr->reloc);
+  howto = bfd_reloc_type_lookup (flaginfo->output_bfd, pr->reloc);
   if (howto == 0)
     {
       bfd_set_error (bfd_error_bad_value);
       return FALSE;
     }
 
-  if (o == obj_textsec (finfo->output_bfd))
-    reloff_ptr = &finfo->treloff;
-  else if (o == obj_datasec (finfo->output_bfd))
-    reloff_ptr = &finfo->dreloff;
+  if (o == obj_textsec (flaginfo->output_bfd))
+    reloff_ptr = &flaginfo->treloff;
+  else if (o == obj_datasec (flaginfo->output_bfd))
+    reloff_ptr = &flaginfo->dreloff;
   else
     abort ();
 
-  if (obj_reloc_entry_size (finfo->output_bfd) == RELOC_STD_SIZE)
+  if (obj_reloc_entry_size (flaginfo->output_bfd) == RELOC_STD_SIZE)
     {
 #ifdef MY_put_reloc
-      MY_put_reloc (finfo->output_bfd, r_extern, r_index, p->offset, howto,
+      MY_put_reloc (flaginfo->output_bfd, r_extern, r_index, p->offset, howto,
                    &srel);
 #else
       {
@@ -3735,8 +3771,8 @@ aout_link_reloc_link_order (struct aout_final_link_info *finfo,
        r_relative = (howto->type & 32) != 0;
        r_length = howto->size;
 
-       PUT_WORD (finfo->output_bfd, p->offset, srel.r_address);
-       if (bfd_header_big_endian (finfo->output_bfd))
+       PUT_WORD (flaginfo->output_bfd, p->offset, srel.r_address);
+       if (bfd_header_big_endian (flaginfo->output_bfd))
          {
            srel.r_index[0] = r_index >> 16;
            srel.r_index[1] = r_index >> 8;
@@ -3779,10 +3815,10 @@ aout_link_reloc_link_order (struct aout_final_link_info *finfo,
          bfd_boolean ok;
 
          size = bfd_get_reloc_size (howto);
-         buf = bfd_zmalloc (size);
+         buf = (bfd_byte *) bfd_zmalloc (size);
          if (buf == NULL)
            return FALSE;
-         r = MY_relocate_contents (howto, finfo->output_bfd,
+         r = MY_relocate_contents (howto, flaginfo->output_bfd,
                                    (bfd_vma) pr->addend, buf);
          switch (r)
            {
@@ -3792,10 +3828,10 @@ aout_link_reloc_link_order (struct aout_final_link_info *finfo,
            case bfd_reloc_outofrange:
              abort ();
            case bfd_reloc_overflow:
-             if (! ((*finfo->info->callbacks->reloc_overflow)
-                    (finfo->info, NULL,
+             if (! ((*flaginfo->info->callbacks->reloc_overflow)
+                    (flaginfo->info, NULL,
                      (p->type == bfd_section_reloc_link_order
-                      ? bfd_section_name (finfo->output_bfd,
+                      ? bfd_section_name (flaginfo->output_bfd,
                                           pr->u.section)
                       : pr->u.name),
                      howto->name, pr->addend, NULL, NULL, (bfd_vma) 0)))
@@ -3805,7 +3841,7 @@ aout_link_reloc_link_order (struct aout_final_link_info *finfo,
                }
              break;
            }
-         ok = bfd_set_section_contents (finfo->output_bfd, o, (void *) buf,
+         ok = bfd_set_section_contents (flaginfo->output_bfd, o, (void *) buf,
                                         (file_ptr) p->offset, size);
          free (buf);
          if (! ok)
@@ -3815,12 +3851,12 @@ aout_link_reloc_link_order (struct aout_final_link_info *finfo,
   else
     {
 #ifdef MY_put_ext_reloc
-      MY_put_ext_reloc (finfo->output_bfd, r_extern, r_index, p->offset,
+      MY_put_ext_reloc (flaginfo->output_bfd, r_extern, r_index, p->offset,
                        howto, &erel, pr->addend);
 #else
-      PUT_WORD (finfo->output_bfd, p->offset, erel.r_address);
+      PUT_WORD (flaginfo->output_bfd, p->offset, erel.r_address);
 
-      if (bfd_header_big_endian (finfo->output_bfd))
+      if (bfd_header_big_endian (flaginfo->output_bfd))
        {
          erel.r_index[0] = r_index >> 16;
          erel.r_index[1] = r_index >> 8;
@@ -3839,25 +3875,25 @@ aout_link_reloc_link_order (struct aout_final_link_info *finfo,
              | (howto->type << RELOC_EXT_BITS_TYPE_SH_LITTLE);
        }
 
-      PUT_WORD (finfo->output_bfd, (bfd_vma) pr->addend, erel.r_addend);
+      PUT_WORD (flaginfo->output_bfd, (bfd_vma) pr->addend, erel.r_addend);
 #endif /* MY_put_ext_reloc */
 
       rel_ptr = (void *) &erel;
     }
 
-  amt = obj_reloc_entry_size (finfo->output_bfd);
-  if (bfd_seek (finfo->output_bfd, *reloff_ptr, SEEK_SET) != 0
-      || bfd_bwrite (rel_ptr, amt, finfo->output_bfd) != amt)
+  amt = obj_reloc_entry_size (flaginfo->output_bfd);
+  if (bfd_seek (flaginfo->output_bfd, *reloff_ptr, SEEK_SET) != 0
+      || bfd_bwrite (rel_ptr, amt, flaginfo->output_bfd) != amt)
     return FALSE;
 
-  *reloff_ptr += obj_reloc_entry_size (finfo->output_bfd);
+  *reloff_ptr += obj_reloc_entry_size (flaginfo->output_bfd);
 
   /* Assert that the relocs have not run into the symbols, and that n
      the text relocs have not run into the data relocs.  */
-  BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (finfo->output_bfd)
-             && (reloff_ptr != &finfo->treloff
+  BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (flaginfo->output_bfd)
+             && (reloff_ptr != &flaginfo->treloff
                  || (*reloff_ptr
-                     <= obj_datasec (finfo->output_bfd)->rel_filepos)));
+                     <= obj_datasec (flaginfo->output_bfd)->rel_filepos)));
 
   return TRUE;
 }
@@ -3882,7 +3918,7 @@ aout_reloc_index_to_section (bfd *abfd, int indx)
 /* Relocate an a.out section using standard a.out relocs.  */
 
 static bfd_boolean
-aout_link_input_section_std (struct aout_final_link_info *finfo,
+aout_link_input_section_std (struct aout_final_link_info *flaginfo,
                             bfd *input_bfd,
                             asection *input_section,
                             struct reloc_std_external *relocs,
@@ -3903,18 +3939,18 @@ aout_link_input_section_std (struct aout_final_link_info *finfo,
   struct reloc_std_external *rel;
   struct reloc_std_external *rel_end;
 
-  output_bfd = finfo->output_bfd;
+  output_bfd = flaginfo->output_bfd;
   check_dynamic_reloc = aout_backend_info (output_bfd)->check_dynamic_reloc;
 
   BFD_ASSERT (obj_reloc_entry_size (input_bfd) == RELOC_STD_SIZE);
   BFD_ASSERT (input_bfd->xvec->header_byteorder
              == output_bfd->xvec->header_byteorder);
 
-  relocatable = finfo->info->relocatable;
+  relocatable = flaginfo->info->relocatable;
   syms = obj_aout_external_syms (input_bfd);
   strings = obj_aout_external_strings (input_bfd);
   sym_hashes = obj_aout_sym_hashes (input_bfd);
-  symbol_map = finfo->symbol_map;
+  symbol_map = flaginfo->symbol_map;
 
   reloc_count = rel_size / RELOC_STD_SIZE;
   rel = relocs;
@@ -3983,7 +4019,7 @@ aout_link_input_section_std (struct aout_final_link_info *finfo,
 
       if (howto == NULL)
        {
-         (*finfo->info->callbacks->einfo)
+         (*flaginfo->info->callbacks->einfo)
            (_("%P: %B: unexpected relocation type\n"), input_bfd);
          bfd_set_error (bfd_error_bad_value);
          return FALSE;
@@ -4047,8 +4083,8 @@ aout_link_input_section_std (struct aout_final_link_info *finfo,
                            {
                              h->indx = -2;
                              h->written = FALSE;
-                             if (! aout_link_write_other_symbol (h,
-                                                                 (void *) finfo))
+                             if (!aout_link_write_other_symbol (&h->root.root,
+                                                                flaginfo))
                                return FALSE;
                            }
                          r_index = h->indx;
@@ -4059,8 +4095,8 @@ aout_link_input_section_std (struct aout_final_link_info *finfo,
 
                          name = strings + GET_WORD (input_bfd,
                                                     syms[r_index].e_strx);
-                         if (! ((*finfo->info->callbacks->unattached_reloc)
-                                (finfo->info, name, input_bfd, input_section,
+                         if (! ((*flaginfo->info->callbacks->unattached_reloc)
+                                (flaginfo->info, name, input_bfd, input_section,
                                  r_addr)))
                            return FALSE;
                          r_index = 0;
@@ -4166,7 +4202,7 @@ aout_link_input_section_std (struct aout_final_link_info *finfo,
              bfd_boolean skip;
 
              if (! ((*check_dynamic_reloc)
-                    (finfo->info, input_bfd, input_section, h,
+                    (flaginfo->info, input_bfd, input_section, h,
                      (void *) rel, contents, &skip, &relocation)))
                return FALSE;
              if (skip)
@@ -4176,7 +4212,7 @@ aout_link_input_section_std (struct aout_final_link_info *finfo,
          /* Now warn if a global symbol is undefined.  We could not
              do this earlier, because check_dynamic_reloc might want
              to skip this reloc.  */
-         if (hundef && ! finfo->info->shared && ! r_baserel)
+         if (hundef && ! flaginfo->info->shared && ! r_baserel)
            {
              const char *name;
 
@@ -4184,8 +4220,8 @@ aout_link_input_section_std (struct aout_final_link_info *finfo,
                name = h->root.root.string;
              else
                name = strings + GET_WORD (input_bfd, syms[r_index].e_strx);
-             if (! ((*finfo->info->callbacks->undefined_symbol)
-                    (finfo->info, name, input_bfd, input_section,
+             if (! ((*flaginfo->info->callbacks->undefined_symbol)
+                    (flaginfo->info, name, input_bfd, input_section,
                     r_addr, TRUE)))
                return FALSE;
            }
@@ -4219,8 +4255,8 @@ aout_link_input_section_std (struct aout_final_link_info *finfo,
                    s = aout_reloc_index_to_section (input_bfd, r_index);
                    name = bfd_section_name (input_bfd, s);
                  }
-               if (! ((*finfo->info->callbacks->reloc_overflow)
-                      (finfo->info, (h ? &h->root : NULL), name,
+               if (! ((*flaginfo->info->callbacks->reloc_overflow)
+                      (flaginfo->info, (h ? &h->root : NULL), name,
                        howto->name, (bfd_vma) 0, input_bfd,
                        input_section, r_addr)))
                  return FALSE;
@@ -4236,7 +4272,7 @@ aout_link_input_section_std (struct aout_final_link_info *finfo,
 /* Relocate an a.out section using extended a.out relocs.  */
 
 static bfd_boolean
-aout_link_input_section_ext (struct aout_final_link_info *finfo,
+aout_link_input_section_ext (struct aout_final_link_info *flaginfo,
                             bfd *input_bfd,
                             asection *input_section,
                             struct reloc_ext_external *relocs,
@@ -4257,18 +4293,18 @@ aout_link_input_section_ext (struct aout_final_link_info *finfo,
   struct reloc_ext_external *rel;
   struct reloc_ext_external *rel_end;
 
-  output_bfd = finfo->output_bfd;
+  output_bfd = flaginfo->output_bfd;
   check_dynamic_reloc = aout_backend_info (output_bfd)->check_dynamic_reloc;
 
   BFD_ASSERT (obj_reloc_entry_size (input_bfd) == RELOC_EXT_SIZE);
   BFD_ASSERT (input_bfd->xvec->header_byteorder
              == output_bfd->xvec->header_byteorder);
 
-  relocatable = finfo->info->relocatable;
+  relocatable = flaginfo->info->relocatable;
   syms = obj_aout_external_syms (input_bfd);
   strings = obj_aout_external_strings (input_bfd);
   sym_hashes = obj_aout_sym_hashes (input_bfd);
-  symbol_map = finfo->symbol_map;
+  symbol_map = flaginfo->symbol_map;
 
   reloc_count = rel_size / RELOC_EXT_SIZE;
   rel = relocs;
@@ -4309,7 +4345,7 @@ aout_link_input_section_ext (struct aout_final_link_info *finfo,
 
       if (r_type >= TABLE_SIZE (howto_table_ext))
        {
-         (*finfo->info->callbacks->einfo)
+         (*flaginfo->info->callbacks->einfo)
            (_("%P: %B: unexpected relocation type\n"), input_bfd);
          bfd_set_error (bfd_error_bad_value);
          return FALSE;
@@ -4389,8 +4425,8 @@ aout_link_input_section_ext (struct aout_final_link_info *finfo,
                            {
                              h->indx = -2;
                              h->written = FALSE;
-                             if (! aout_link_write_other_symbol (h,
-                                                                 (void *) finfo))
+                             if (!aout_link_write_other_symbol (&h->root.root,
+                                                                flaginfo))
                                return FALSE;
                            }
                          r_index = h->indx;
@@ -4401,8 +4437,8 @@ aout_link_input_section_ext (struct aout_final_link_info *finfo,
 
                          name = strings + GET_WORD (input_bfd,
                                                     syms[r_index].e_strx);
-                         if (! ((*finfo->info->callbacks->unattached_reloc)
-                                (finfo->info, name, input_bfd, input_section,
+                         if (! ((*flaginfo->info->callbacks->unattached_reloc)
+                                (flaginfo->info, name, input_bfd, input_section,
                                  r_addr)))
                            return FALSE;
                          r_index = 0;
@@ -4569,7 +4605,7 @@ aout_link_input_section_ext (struct aout_final_link_info *finfo,
              bfd_boolean skip;
 
              if (! ((*check_dynamic_reloc)
-                    (finfo->info, input_bfd, input_section, h,
+                    (flaginfo->info, input_bfd, input_section, h,
                      (void *) rel, contents, &skip, &relocation)))
                return FALSE;
              if (skip)
@@ -4580,7 +4616,7 @@ aout_link_input_section_ext (struct aout_final_link_info *finfo,
              do this earlier, because check_dynamic_reloc might want
              to skip this reloc.  */
          if (hundef
-             && ! finfo->info->shared
+             && ! flaginfo->info->shared
              && r_type != (unsigned int) RELOC_BASE10
              && r_type != (unsigned int) RELOC_BASE13
              && r_type != (unsigned int) RELOC_BASE22)
@@ -4591,8 +4627,8 @@ aout_link_input_section_ext (struct aout_final_link_info *finfo,
                name = h->root.root.string;
              else
                name = strings + GET_WORD (input_bfd, syms[r_index].e_strx);
-             if (! ((*finfo->info->callbacks->undefined_symbol)
-                    (finfo->info, name, input_bfd, input_section,
+             if (! ((*flaginfo->info->callbacks->undefined_symbol)
+                    (flaginfo->info, name, input_bfd, input_section,
                     r_addr, TRUE)))
                return FALSE;
            }
@@ -4638,8 +4674,8 @@ aout_link_input_section_ext (struct aout_final_link_info *finfo,
                        s = aout_reloc_index_to_section (input_bfd, r_index);
                        name = bfd_section_name (input_bfd, s);
                      }
-                   if (! ((*finfo->info->callbacks->reloc_overflow)
-                          (finfo->info, (h ? &h->root : NULL), name,
+                   if (! ((*flaginfo->info->callbacks->reloc_overflow)
+                          (flaginfo->info, (h ? &h->root : NULL), name,
                            howto_table_ext[r_type].name,
                            r_addend, input_bfd, input_section, r_addr)))
                      return FALSE;
@@ -4656,7 +4692,7 @@ aout_link_input_section_ext (struct aout_final_link_info *finfo,
 /* Link an a.out section into the output file.  */
 
 static bfd_boolean
-aout_link_input_section (struct aout_final_link_info *finfo,
+aout_link_input_section (struct aout_final_link_info *flaginfo,
                         bfd *input_bfd,
                         asection *input_section,
                         file_ptr *reloff_ptr,
@@ -4668,7 +4704,7 @@ aout_link_input_section (struct aout_final_link_info *finfo,
   /* Get the section contents.  */
   input_size = input_section->size;
   if (! bfd_get_section_contents (input_bfd, input_section,
-                                 (void *) finfo->contents,
+                                 (void *) flaginfo->contents,
                                  (file_ptr) 0, input_size))
     return FALSE;
 
@@ -4678,7 +4714,7 @@ aout_link_input_section (struct aout_final_link_info *finfo,
     relocs = aout_section_data (input_section)->relocs;
   else
     {
-      relocs = finfo->relocs;
+      relocs = flaginfo->relocs;
       if (rel_size > 0)
        {
          if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0
@@ -4690,44 +4726,44 @@ aout_link_input_section (struct aout_final_link_info *finfo,
   /* Relocate the section contents.  */
   if (obj_reloc_entry_size (input_bfd) == RELOC_STD_SIZE)
     {
-      if (! aout_link_input_section_std (finfo, input_bfd, input_section,
+      if (! aout_link_input_section_std (flaginfo, input_bfd, input_section,
                                         (struct reloc_std_external *) relocs,
-                                        rel_size, finfo->contents))
+                                        rel_size, flaginfo->contents))
        return FALSE;
     }
   else
     {
-      if (! aout_link_input_section_ext (finfo, input_bfd, input_section,
+      if (! aout_link_input_section_ext (flaginfo, input_bfd, input_section,
                                         (struct reloc_ext_external *) relocs,
-                                        rel_size, finfo->contents))
+                                        rel_size, flaginfo->contents))
        return FALSE;
     }
 
   /* Write out the section contents.  */
-  if (! bfd_set_section_contents (finfo->output_bfd,
+  if (! bfd_set_section_contents (flaginfo->output_bfd,
                                  input_section->output_section,
-                                 (void *) finfo->contents,
+                                 (void *) flaginfo->contents,
                                  (file_ptr) input_section->output_offset,
                                  input_size))
     return FALSE;
 
   /* If we are producing relocatable output, the relocs were
      modified, and we now write them out.  */
-  if (finfo->info->relocatable && rel_size > 0)
+  if (flaginfo->info->relocatable && rel_size > 0)
     {
-      if (bfd_seek (finfo->output_bfd, *reloff_ptr, SEEK_SET) != 0)
+      if (bfd_seek (flaginfo->output_bfd, *reloff_ptr, SEEK_SET) != 0)
        return FALSE;
-      if (bfd_bwrite (relocs, rel_size, finfo->output_bfd) != rel_size)
+      if (bfd_bwrite (relocs, rel_size, flaginfo->output_bfd) != rel_size)
        return FALSE;
       *reloff_ptr += rel_size;
 
       /* Assert that the relocs have not run into the symbols, and
         that if these are the text relocs they have not run into the
         data relocs.  */
-      BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (finfo->output_bfd)
-                 && (reloff_ptr != &finfo->treloff
+      BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (flaginfo->output_bfd)
+                 && (reloff_ptr != &flaginfo->treloff
                      || (*reloff_ptr
-                         <= obj_datasec (finfo->output_bfd)->rel_filepos)));
+                         <= obj_datasec (flaginfo->output_bfd)->rel_filepos)));
     }
 
   return TRUE;
@@ -4737,7 +4773,7 @@ aout_link_input_section (struct aout_final_link_info *finfo,
    symbol indices into a symbol_map.  */
 
 static bfd_boolean
-aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd)
+aout_link_write_symbols (struct aout_final_link_info *flaginfo, bfd *input_bfd)
 {
   bfd *output_bfd;
   bfd_size_type sym_count;
@@ -4753,25 +4789,25 @@ aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd)
   bfd_boolean pass;
   bfd_boolean skip_next;
 
-  output_bfd = finfo->output_bfd;
+  output_bfd = flaginfo->output_bfd;
   sym_count = obj_aout_external_sym_count (input_bfd);
   strings = obj_aout_external_strings (input_bfd);
-  strip = finfo->info->strip;
-  discard = finfo->info->discard;
-  outsym = finfo->output_syms;
+  strip = flaginfo->info->strip;
+  discard = flaginfo->info->discard;
+  outsym = flaginfo->output_syms;
 
   /* First write out a symbol for this object file, unless we are
      discarding such symbols.  */
   if (strip != strip_all
       && (strip != strip_some
-         || bfd_hash_lookup (finfo->info->keep_hash, input_bfd->filename,
+         || bfd_hash_lookup (flaginfo->info->keep_hash, input_bfd->filename,
                              FALSE, FALSE) != NULL)
       && discard != discard_all)
     {
       H_PUT_8 (output_bfd, N_TEXT, outsym->e_type);
       H_PUT_8 (output_bfd, 0, outsym->e_other);
       H_PUT_16 (output_bfd, 0, outsym->e_desc);
-      strtab_index = add_to_stringtab (output_bfd, finfo->strtab,
+      strtab_index = add_to_stringtab (output_bfd, flaginfo->strtab,
                                       input_bfd->filename, FALSE);
       if (strtab_index == (bfd_size_type) -1)
        return FALSE;
@@ -4790,7 +4826,7 @@ aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd)
   sym = obj_aout_external_syms (input_bfd);
   sym_end = sym + sym_count;
   sym_hash = obj_aout_sym_hashes (input_bfd);
-  symbol_map = finfo->symbol_map;
+  symbol_map = flaginfo->symbol_map;
   memset (symbol_map, 0, (size_t) sym_count * sizeof *symbol_map);
   for (; sym < sym_end; sym++, sym_hash++, symbol_map++)
     {
@@ -4889,7 +4925,7 @@ aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd)
                skip = TRUE;
              break;
            case strip_some:
-             if (bfd_hash_lookup (finfo->info->keep_hash, name, FALSE, FALSE)
+             if (bfd_hash_lookup (flaginfo->info->keep_hash, name, FALSE, FALSE)
                  == NULL)
                skip = TRUE;
              break;
@@ -5117,8 +5153,8 @@ aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd)
              /* If we have already included a header file with the
                  same value, then replace this one with an N_EXCL
                  symbol.  */
-             copy = (bfd_boolean) (! finfo->info->keep_memory);
-             incl_entry = aout_link_includes_lookup (&finfo->includes,
+             copy = (bfd_boolean) (! flaginfo->info->keep_memory);
+             incl_entry = aout_link_includes_lookup (&flaginfo->includes,
                                                      name, TRUE, copy);
              if (incl_entry == NULL)
                return FALSE;
@@ -5129,7 +5165,8 @@ aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd)
                {
                  /* This is the first time we have seen this header
                      file with this set of stabs strings.  */
-                 t = bfd_hash_allocate (&finfo->includes.root,
+                 t = (struct aout_link_includes_totals *)
+                      bfd_hash_allocate (&flaginfo->includes.root,
                                         sizeof *t);
                  if (t == NULL)
                    return FALSE;
@@ -5178,7 +5215,7 @@ aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd)
       H_PUT_8 (output_bfd, H_GET_8 (input_bfd, sym->e_other), outsym->e_other);
       H_PUT_16 (output_bfd, H_GET_16 (input_bfd, sym->e_desc), outsym->e_desc);
       copy = FALSE;
-      if (! finfo->info->keep_memory)
+      if (! flaginfo->info->keep_memory)
        {
          /* name points into a string table which we are going to
             free.  If there is a hash table entry, use that string.
@@ -5188,7 +5225,7 @@ aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd)
          else
            copy = TRUE;
        }
-      strtab_index = add_to_stringtab (output_bfd, finfo->strtab,
+      strtab_index = add_to_stringtab (output_bfd, flaginfo->strtab,
                                       name, copy);
       if (strtab_index == (bfd_size_type) -1)
        return FALSE;
@@ -5200,18 +5237,18 @@ aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd)
     }
 
   /* Write out the output symbols we have just constructed.  */
-  if (outsym > finfo->output_syms)
+  if (outsym > flaginfo->output_syms)
     {
       bfd_size_type outsym_size;
 
-      if (bfd_seek (output_bfd, finfo->symoff, SEEK_SET) != 0)
+      if (bfd_seek (output_bfd, flaginfo->symoff, SEEK_SET) != 0)
        return FALSE;
-      outsym_size = outsym - finfo->output_syms;
+      outsym_size = outsym - flaginfo->output_syms;
       outsym_size *= EXTERNAL_NLIST_SIZE;
-      if (bfd_bwrite ((void *) finfo->output_syms, outsym_size, output_bfd)
+      if (bfd_bwrite ((void *) flaginfo->output_syms, outsym_size, output_bfd)
          != outsym_size)
        return FALSE;
-      finfo->symoff += outsym_size;
+      flaginfo->symoff += outsym_size;
     }
 
   return TRUE;
@@ -5220,28 +5257,24 @@ aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd)
 /* Link an a.out input BFD into the output file.  */
 
 static bfd_boolean
-aout_link_input_bfd (struct aout_final_link_info *finfo, bfd *input_bfd)
+aout_link_input_bfd (struct aout_final_link_info *flaginfo, bfd *input_bfd)
 {
-  bfd_size_type sym_count;
-
   BFD_ASSERT (bfd_get_format (input_bfd) == bfd_object);
 
   /* If this is a dynamic object, it may need special handling.  */
   if ((input_bfd->flags & DYNAMIC) != 0
       && aout_backend_info (input_bfd)->link_dynamic_object != NULL)
     return ((*aout_backend_info (input_bfd)->link_dynamic_object)
-           (finfo->info, input_bfd));
+           (flaginfo->info, input_bfd));
 
   /* Get the symbols.  We probably have them already, unless
-     finfo->info->keep_memory is FALSE.  */
+     flaginfo->info->keep_memory is FALSE.  */
   if (! aout_get_external_symbols (input_bfd))
     return FALSE;
 
-  sym_count = obj_aout_external_sym_count (input_bfd);
-
   /* Write out the symbols and get a map of the new indices.  The map
-     is placed into finfo->symbol_map.  */
-  if (! aout_link_write_symbols (finfo, input_bfd))
+     is placed into flaginfo->symbol_map.  */
+  if (! aout_link_write_symbols (flaginfo, input_bfd))
     return FALSE;
 
   /* Relocate and write out the sections.  These functions use the
@@ -5250,17 +5283,17 @@ aout_link_input_bfd (struct aout_final_link_info *finfo, bfd *input_bfd)
      link, which will normally be the case.  */
   if (obj_textsec (input_bfd)->linker_mark)
     {
-      if (! aout_link_input_section (finfo, input_bfd,
+      if (! aout_link_input_section (flaginfo, input_bfd,
                                     obj_textsec (input_bfd),
-                                    &finfo->treloff,
+                                    &flaginfo->treloff,
                                     exec_hdr (input_bfd)->a_trsize))
        return FALSE;
     }
   if (obj_datasec (input_bfd)->linker_mark)
     {
-      if (! aout_link_input_section (finfo, input_bfd,
+      if (! aout_link_input_section (flaginfo, input_bfd,
                                     obj_datasec (input_bfd),
-                                    &finfo->dreloff,
+                                    &flaginfo->dreloff,
                                     exec_hdr (input_bfd)->a_drsize))
        return FALSE;
     }
@@ -5268,7 +5301,7 @@ aout_link_input_bfd (struct aout_final_link_info *finfo, bfd *input_bfd)
   /* If we are not keeping memory, we don't need the symbols any
      longer.  We still need them if we are keeping memory, because the
      strings in the hash table point into them.  */
-  if (! finfo->info->keep_memory)
+  if (! flaginfo->info->keep_memory)
     {
       if (! aout_link_free_symbols (input_bfd))
        return FALSE;
@@ -5279,7 +5312,7 @@ aout_link_input_bfd (struct aout_final_link_info *finfo, bfd *input_bfd)
 
 /* Do the final link step.  This is called on the output BFD.  The
    INFO structure should point to a list of BFDs linked through the
-   link_next field which can be used to find each BFD which takes part
+   link.next field which can be used to find each BFD which takes part
    in the output.  Also, each section in ABFD should point to a list
    of bfd_link_order structures which list all the input sections for
    the output section.  */
@@ -5326,7 +5359,7 @@ NAME (aout, final_link) (bfd *abfd,
   max_contents_size = 0;
   max_relocs_size = 0;
   max_sym_count = 0;
-  for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
+  for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
     {
       bfd_size_type sz;
 
@@ -5420,11 +5453,11 @@ NAME (aout, final_link) (bfd *abfd,
     goto error_return;
 
   /* Allocate buffers to hold section contents and relocs.  */
-  aout_info.contents = bfd_malloc (max_contents_size);
+  aout_info.contents = (bfd_byte *) bfd_malloc (max_contents_size);
   aout_info.relocs = bfd_malloc (max_relocs_size);
-  aout_info.symbol_map = bfd_malloc (max_sym_count * sizeof (int *));
-  aout_info.output_syms = bfd_malloc ((max_sym_count + 1)
-                                     * sizeof (struct external_nlist));
+  aout_info.symbol_map = (int *) bfd_malloc (max_sym_count * sizeof (int));
+  aout_info.output_syms = (struct external_nlist *)
+      bfd_malloc ((max_sym_count + 1) * sizeof (struct external_nlist));
   if ((aout_info.contents == NULL && max_contents_size != 0)
       || (aout_info.relocs == NULL && max_relocs_size != 0)
       || (aout_info.symbol_map == NULL && max_sym_count != 0)
@@ -5441,7 +5474,7 @@ NAME (aout, final_link) (bfd *abfd,
     h = aout_link_hash_lookup (aout_hash_table (info), "__DYNAMIC",
                               FALSE, FALSE, FALSE);
     if (h != NULL)
-      aout_link_write_other_symbol (h, &aout_info);
+      aout_link_write_other_symbol (&h->root.root, &aout_info);
   }
 
   /* The most time efficient way to do the link would be to read all
@@ -5465,7 +5498,7 @@ NAME (aout, final_link) (bfd *abfd,
 
      We use the output_has_begun field of the input BFDs to see
      whether we have already handled it.  */
-  for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
+  for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
     sub->output_has_begun = FALSE;
 
   /* Mark all sections which are to be included in the link.  This
@@ -5515,9 +5548,9 @@ NAME (aout, final_link) (bfd *abfd,
     }
 
   /* Write out any symbols that we have not already written out.  */
-  aout_link_hash_traverse (aout_hash_table (info),
-                          aout_link_write_other_symbol,
-                          (void *) &aout_info);
+  bfd_hash_traverse (&info->hash->table,
+                    aout_link_write_other_symbol,
+                    &aout_info);
 
   /* Now handle any relocs we were asked to create by the linker.
      These did not come from any input file.  We must do these after