Make bfd_byte an int8_t, flagword a uint32_t
[binutils-gdb.git] / bfd / coff-rs6000.c
index a29cf5b958d1f8b4e04f3df32d7eaad5cb81c6a9..3b451912df77fd87ea8bed92dc48b0a77127fa1c 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for IBM RS/6000 "XCOFF" files.
-   Copyright (C) 1990-2021 Free Software Foundation, Inc.
+   Copyright (C) 1990-2023 Free Software Foundation, Inc.
    Written by Metin G. Ozisik, Mimi Phuong-Thao Vo, and John Gilmore.
    Archive support from Damon A. Permezel.
    Contributed by IBM Corporation and Cygnus Support.
 #include "libcoff.h"
 #include "libxcoff.h"
 
-extern bfd_boolean _bfd_xcoff_mkobject (bfd *);
-extern bfd_boolean _bfd_xcoff_copy_private_bfd_data (bfd *, bfd *);
-extern bfd_boolean _bfd_xcoff_is_local_label_name (bfd *, const char *);
+extern bool _bfd_xcoff_mkobject (bfd *);
+extern bool _bfd_xcoff_copy_private_bfd_data (bfd *, bfd *);
+extern bool _bfd_xcoff_is_local_label_name (bfd *, const char *);
 extern reloc_howto_type *_bfd_xcoff_reloc_type_lookup
   (bfd *, bfd_reloc_code_real_type);
-extern bfd_boolean _bfd_xcoff_slurp_armap (bfd *);
+extern bool _bfd_xcoff_slurp_armap (bfd *);
 extern bfd_cleanup _bfd_xcoff_archive_p (bfd *);
 extern void * _bfd_xcoff_read_ar_hdr (bfd *);
 extern bfd *_bfd_xcoff_openr_next_archived_file (bfd *, bfd *);
 extern int _bfd_xcoff_stat_arch_elt (bfd *, struct stat *);
-extern bfd_boolean _bfd_xcoff_write_armap
+extern bool _bfd_xcoff_write_armap
   (bfd *, unsigned int, struct orl *, unsigned int, int);
-extern bfd_boolean _bfd_xcoff_write_archive_contents (bfd *);
+extern bool _bfd_xcoff_write_archive_contents (bfd *);
 extern int _bfd_xcoff_sizeof_headers (bfd *, struct bfd_link_info *);
 extern void _bfd_xcoff_swap_sym_in (bfd *, void *, void *);
 extern unsigned int _bfd_xcoff_swap_sym_out (bfd *, void *, void *);
@@ -78,7 +78,7 @@ void xcoff_rtype2howto (arelent *, struct internal_reloc *);
 #define coff_bfd_is_local_label_name _bfd_xcoff_is_local_label_name
 #ifdef AIX_CORE
 extern bfd_cleanup rs6000coff_core_p (bfd *abfd);
-extern bfd_boolean rs6000coff_core_file_matches_executable_p
+extern bool rs6000coff_core_file_matches_executable_p
   (bfd *cbfd, bfd *ebfd);
 extern char *rs6000coff_core_file_failing_command (bfd *abfd);
 extern int rs6000coff_core_file_failing_signal (bfd *abfd);
@@ -119,33 +119,33 @@ extern int rs6000coff_core_file_failing_signal (bfd *abfd);
 /* The main body of code is in coffcode.h.  */
 
 static const char *normalize_filename (bfd *);
-static bfd_boolean xcoff_write_armap_old
+static bool xcoff_write_armap_old
   (bfd *, unsigned int, struct orl *, unsigned int, int);
-static bfd_boolean xcoff_write_armap_big
+static bool xcoff_write_armap_big
   (bfd *, unsigned int, struct orl *, unsigned int, int);
-static bfd_boolean xcoff_write_archive_contents_old (bfd *);
-static bfd_boolean xcoff_write_archive_contents_big (bfd *);
+static bool xcoff_write_archive_contents_old (bfd *);
+static bool xcoff_write_archive_contents_big (bfd *);
 static void xcoff_swap_ldhdr_in (bfd *, const void *, struct internal_ldhdr *);
 static void xcoff_swap_ldhdr_out (bfd *, const struct internal_ldhdr *, void *);
 static void xcoff_swap_ldsym_in (bfd *, const void *, struct internal_ldsym *);
 static void xcoff_swap_ldsym_out (bfd *, const struct internal_ldsym *, void *);
 static void xcoff_swap_ldrel_in (bfd *, const void *, struct internal_ldrel *);
 static void xcoff_swap_ldrel_out (bfd *, const struct internal_ldrel *, void *);
-static bfd_boolean xcoff_ppc_relocate_section
+static bool xcoff_ppc_relocate_section
   (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
    struct internal_reloc *, struct internal_syment *, asection **);
-static bfd_boolean _bfd_xcoff_put_ldsymbol_name
+static bool _bfd_xcoff_put_ldsymbol_name
   (bfd *, struct xcoff_loader_info *, struct internal_ldsym *, const char *);
 static asection *xcoff_create_csect_from_smclas
   (bfd *, union internal_auxent *, const char *);
-static bfd_boolean xcoff_is_lineno_count_overflow (bfd *, bfd_vma);
-static bfd_boolean xcoff_is_reloc_count_overflow (bfd *, bfd_vma);
+static bool xcoff_is_lineno_count_overflow (bfd *, bfd_vma);
+static bool xcoff_is_reloc_count_overflow (bfd *, bfd_vma);
 static bfd_vma xcoff_loader_symbol_offset (bfd *, struct internal_ldhdr *);
 static bfd_vma xcoff_loader_reloc_offset (bfd *, struct internal_ldhdr *);
-static bfd_boolean xcoff_generate_rtinit
-  (bfd *, const char *, const char *, bfd_boolean);
-static bfd_boolean do_pad (bfd *, unsigned int);
-static bfd_boolean do_copy (bfd *, bfd *);
+static bool xcoff_generate_rtinit
+  (bfd *, const char *, const char *, bool);
+static bool do_pad (bfd *, unsigned int);
+static bool do_copy (bfd *, bfd *);
 
 /* Relocation functions */
 static xcoff_reloc_function xcoff_reloc_type_br;
@@ -318,11 +318,11 @@ archive_iterator_begin (struct archive_iterator *iterator,
 /* Make ITERATOR visit the first unvisited archive member.  Return true
    on success; return false if all members have been visited.  */
 
-static bfd_boolean
+static bool
 archive_iterator_next (struct archive_iterator *iterator)
 {
   if (!iterator->next.member)
-    return FALSE;
+    return false;
 
   iterator->current = iterator->next;
   member_layout_init (&iterator->next, iterator->archive,
@@ -331,13 +331,13 @@ archive_iterator_next (struct archive_iterator *iterator)
                      + iterator->current.header_size
                      + iterator->current.contents_size
                      + iterator->current.trailing_padding);
-  return TRUE;
+  return true;
 }
 
 /* We use our own tdata type.  Its first field is the COFF tdata type,
    so the COFF routines are compatible.  */
 
-bfd_boolean
+bool
 _bfd_xcoff_mkobject (bfd *abfd)
 {
   coff_data_type *coff;
@@ -345,7 +345,7 @@ _bfd_xcoff_mkobject (bfd *abfd)
 
   abfd->tdata.xcoff_obj_data = (struct xcoff_tdata *) bfd_zalloc (abfd, amt);
   if (abfd->tdata.xcoff_obj_data == NULL)
-    return FALSE;
+    return false;
   coff = coff_data (abfd);
   coff->symbols = (coff_symbol_type *) NULL;
   coff->conversion_table = (unsigned int *) NULL;
@@ -364,19 +364,19 @@ _bfd_xcoff_mkobject (bfd *abfd)
   /* text section alignment is different than the default */
   bfd_xcoff_text_align_power (abfd) = 2;
 
-  return TRUE;
+  return true;
 }
 
 /* Copy XCOFF data from one BFD to another.  */
 
-bfd_boolean
+bool
 _bfd_xcoff_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
 {
   struct xcoff_tdata *ix, *ox;
   asection *sec;
 
   if (ibfd->xvec != obfd->xvec)
-    return TRUE;
+    return true;
   ix = xcoff_data (ibfd);
   ox = xcoff_data (obfd);
   ox->full_aouthdr = ix->full_aouthdr;
@@ -386,7 +386,7 @@ _bfd_xcoff_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
   else
     {
       sec = coff_section_from_bfd_index (ibfd, ix->sntoc);
-      if (sec == NULL)
+      if (sec == NULL || sec->output_section == NULL)
        ox->sntoc = 0;
       else
        ox->sntoc = sec->output_section->target_index;
@@ -396,7 +396,7 @@ _bfd_xcoff_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
   else
     {
       sec = coff_section_from_bfd_index (ibfd, ix->snentry);
-      if (sec == NULL)
+      if (sec == NULL || sec->output_section == NULL)
        ox->snentry = 0;
       else
        ox->snentry = sec->output_section->target_index;
@@ -407,7 +407,7 @@ _bfd_xcoff_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
   ox->cputype = ix->cputype;
   ox->maxdata = ix->maxdata;
   ox->maxstack = ix->maxstack;
-  return TRUE;
+  return true;
 }
 
 /* I don't think XCOFF really has a notion of local labels based on
@@ -415,11 +415,11 @@ _bfd_xcoff_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
    The AIX native linker does not have a -X option, and it ignores the
    -x option.  */
 
-bfd_boolean
+bool
 _bfd_xcoff_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
                                const char *name ATTRIBUTE_UNUSED)
 {
-  return FALSE;
+  return false;
 }
 \f
 void
@@ -470,43 +470,44 @@ _bfd_xcoff_swap_sym_out (bfd *abfd, void * inp, void * extp)
 }
 
 void
-_bfd_xcoff_swap_aux_in (bfd *abfd, void * ext1, int type, int in_class,
-                       int indx, int numaux, void * in1)
+_bfd_xcoff_swap_aux_in (bfd *abfd, void * ext1, int type ATTRIBUTE_UNUSED,
+                       int in_class, int indx, int numaux, void * in1)
 {
   AUXENT * ext = (AUXENT *)ext1;
   union internal_auxent *in = (union internal_auxent *)in1;
 
   switch (in_class)
     {
+    default:
+      _bfd_error_handler
+       /* xgettext: c-format */
+       (_("%pB: unsupported swap_aux_in for storage class %#x"),
+        abfd, (unsigned int) in_class);
+      bfd_set_error (bfd_error_bad_value);
+      break;
+
     case C_FILE:
       if (ext->x_file.x_n.x_fname[0] == 0)
        {
-         in->x_file.x_n.x_zeroes = 0;
-         in->x_file.x_n.x_offset =
+         in->x_file.x_n.x_n.x_zeroes = 0;
+         in->x_file.x_n.x_n.x_offset =
            H_GET_32 (abfd, ext->x_file.x_n.x_n.x_offset);
        }
       else
-       {
-         if (numaux > 1)
-           {
-             if (indx == 0)
-               memcpy (in->x_file.x_fname, ext->x_file.x_n.x_fname,
-                       numaux * sizeof (AUXENT));
-           }
-         else
-           {
-             memcpy (in->x_file.x_fname, ext->x_file.x_n.x_fname, FILNMLEN);
-           }
-       }
-      goto end;
+       memcpy (in->x_file.x_n.x_fname, ext->x_file.x_n.x_fname, FILNMLEN);
+      in->x_file.x_ftype = H_GET_8 (abfd, ext->x_file.x_ftype);
+      break;
 
-      /* RS/6000 "csect" auxents */
+      /* RS/6000 "csect" auxents.
+         There is always a CSECT auxiliary entry. But functions can
+         have FCN ones too. In this case, CSECT is always the last
+         one. */
     case C_EXT:
     case C_AIX_WEAKEXT:
     case C_HIDEXT:
       if (indx + 1 == numaux)
        {
-         in->x_csect.x_scnlen.l = H_GET_32 (abfd, ext->x_csect.x_scnlen);
+         in->x_csect.x_scnlen.u64 = H_GET_32 (abfd, ext->x_csect.x_scnlen);
          in->x_csect.x_parmhash = H_GET_32 (abfd, ext->x_csect.x_parmhash);
          in->x_csect.x_snhash   = H_GET_16 (abfd, ext->x_csect.x_snhash);
          /* We don't have to hack bitfields in x_smtyp because it's
@@ -516,74 +517,47 @@ _bfd_xcoff_swap_aux_in (bfd *abfd, void * ext1, int type, int in_class,
          in->x_csect.x_smclas   = H_GET_8 (abfd, ext->x_csect.x_smclas);
          in->x_csect.x_stab     = H_GET_32 (abfd, ext->x_csect.x_stab);
          in->x_csect.x_snstab   = H_GET_16 (abfd, ext->x_csect.x_snstab);
-         goto end;
+       }
+      else
+       {
+         /* x_exptr isn't supported.  */
+         in->x_sym.x_misc.x_fsize
+           = H_GET_32 (abfd, ext->x_fcn.x_fsize);
+         in->x_sym.x_fcnary.x_fcn.x_lnnoptr
+           = H_GET_32 (abfd, ext->x_fcn.x_lnnoptr);
+         in->x_sym.x_fcnary.x_fcn.x_endndx.u32
+           = H_GET_32 (abfd, ext->x_fcn.x_endndx);
        }
       break;
 
     case C_STAT:
-    case C_LEAFSTAT:
-    case C_HIDDEN:
-      if (type == T_NULL)
-       {
-         in->x_scn.x_scnlen = H_GET_32 (abfd, ext->x_scn.x_scnlen);
-         in->x_scn.x_nreloc = H_GET_16 (abfd, ext->x_scn.x_nreloc);
-         in->x_scn.x_nlinno = H_GET_16 (abfd, ext->x_scn.x_nlinno);
-         /* PE defines some extra fields; we zero them out for
-            safety.  */
-         in->x_scn.x_checksum = 0;
-         in->x_scn.x_associated = 0;
-         in->x_scn.x_comdat = 0;
-
-         goto end;
-       }
+      in->x_scn.x_scnlen = H_GET_32 (abfd, ext->x_scn.x_scnlen);
+      in->x_scn.x_nreloc = H_GET_16 (abfd, ext->x_scn.x_nreloc);
+      in->x_scn.x_nlinno = H_GET_16 (abfd, ext->x_scn.x_nlinno);
+      /* PE defines some extra fields; we zero them out for
+        safety.  */
+      in->x_scn.x_checksum = 0;
+      in->x_scn.x_associated = 0;
+      in->x_scn.x_comdat = 0;
       break;
-    }
 
-  in->x_sym.x_tagndx.l = H_GET_32 (abfd, ext->x_sym.x_tagndx);
-  in->x_sym.x_tvndx = H_GET_16 (abfd, ext->x_sym.x_tvndx);
+    case C_BLOCK:
+    case C_FCN:
+      in->x_sym.x_misc.x_lnsz.x_lnno
+       = H_GET_32 (abfd, ext->x_sym.x_lnno);
+      break;
 
-  if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
-      || ISTAG (in_class))
-    {
-      in->x_sym.x_fcnary.x_fcn.x_lnnoptr =
-       H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
-      in->x_sym.x_fcnary.x_fcn.x_endndx.l =
-       H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_endndx);
-    }
-  else
-    {
-      in->x_sym.x_fcnary.x_ary.x_dimen[0] =
-       H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
-      in->x_sym.x_fcnary.x_ary.x_dimen[1] =
-       H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
-      in->x_sym.x_fcnary.x_ary.x_dimen[2] =
-       H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
-      in->x_sym.x_fcnary.x_ary.x_dimen[3] =
-       H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
-    }
+    case C_DWARF:
+      in->x_sect.x_scnlen = H_GET_32 (abfd, ext->x_sect.x_scnlen);
+      in->x_sect.x_nreloc = H_GET_32 (abfd, ext->x_sect.x_nreloc);
+      break;
 
-  if (ISFCN (type))
-    {
-      in->x_sym.x_misc.x_fsize = H_GET_32 (abfd, ext->x_sym.x_misc.x_fsize);
-    }
-  else
-    {
-      in->x_sym.x_misc.x_lnsz.x_lnno =
-       H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_lnno);
-      in->x_sym.x_misc.x_lnsz.x_size =
-       H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_size);
     }
-
- end: ;
-  /* The semicolon is because MSVC doesn't like labels at
-     end of block.  */
 }
 
 unsigned int
-_bfd_xcoff_swap_aux_out (bfd *abfd, void * inp, int type, int in_class,
-                        int indx ATTRIBUTE_UNUSED,
-                        int numaux ATTRIBUTE_UNUSED,
-                        void * extp)
+_bfd_xcoff_swap_aux_out (bfd *abfd, void * inp, int type ATTRIBUTE_UNUSED,
+                        int in_class, int indx, int numaux, void * extp)
 {
   union internal_auxent *in = (union internal_auxent *)inp;
   AUXENT *ext = (AUXENT *)extp;
@@ -591,18 +565,25 @@ _bfd_xcoff_swap_aux_out (bfd *abfd, void * inp, int type, int in_class,
   memset (ext, 0, bfd_coff_auxesz (abfd));
   switch (in_class)
     {
+    default:
+      _bfd_error_handler
+       /* xgettext: c-format */
+       (_("%pB: unsupported swap_aux_out for storage class %#x"),
+        abfd, (unsigned int) in_class);
+      bfd_set_error (bfd_error_bad_value);
+      break;
+
     case C_FILE:
-      if (in->x_file.x_fname[0] == 0)
+      if (in->x_file.x_n.x_fname[0] == 0)
        {
          H_PUT_32 (abfd, 0, ext->x_file.x_n.x_n.x_zeroes);
-         H_PUT_32 (abfd, in->x_file.x_n.x_offset,
+         H_PUT_32 (abfd, in->x_file.x_n.x_n.x_offset,
                    ext->x_file.x_n.x_n.x_offset);
        }
       else
-       {
-         memcpy (ext->x_file.x_n.x_fname, in->x_file.x_fname, FILNMLEN);
-       }
-      goto end;
+       memcpy (ext->x_file.x_n.x_fname, in->x_file.x_n.x_fname, FILNMLEN);
+      H_PUT_8 (abfd, in->x_file.x_ftype, ext->x_file.x_ftype);
+      break;
 
       /* RS/6000 "csect" auxents */
     case C_EXT:
@@ -610,7 +591,7 @@ _bfd_xcoff_swap_aux_out (bfd *abfd, void * inp, int type, int in_class,
     case C_HIDEXT:
       if (indx + 1 == numaux)
        {
-         H_PUT_32 (abfd, in->x_csect.x_scnlen.l, ext->x_csect.x_scnlen);
+         H_PUT_32 (abfd, in->x_csect.x_scnlen.u64, ext->x_csect.x_scnlen);
          H_PUT_32 (abfd, in->x_csect.x_parmhash, ext->x_csect.x_parmhash);
          H_PUT_16 (abfd, in->x_csect.x_snhash, ext->x_csect.x_snhash);
          /* We don't have to hack bitfields in x_smtyp because it's
@@ -620,57 +601,34 @@ _bfd_xcoff_swap_aux_out (bfd *abfd, void * inp, int type, int in_class,
          H_PUT_8 (abfd, in->x_csect.x_smclas, ext->x_csect.x_smclas);
          H_PUT_32 (abfd, in->x_csect.x_stab, ext->x_csect.x_stab);
          H_PUT_16 (abfd, in->x_csect.x_snstab, ext->x_csect.x_snstab);
-         goto end;
        }
-      break;
-
-    case C_STAT:
-    case C_LEAFSTAT:
-    case C_HIDDEN:
-      if (type == T_NULL)
+      else
        {
-         H_PUT_32 (abfd, in->x_scn.x_scnlen, ext->x_scn.x_scnlen);
-         H_PUT_16 (abfd, in->x_scn.x_nreloc, ext->x_scn.x_nreloc);
-         H_PUT_16 (abfd, in->x_scn.x_nlinno, ext->x_scn.x_nlinno);
-         goto end;
+         H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_fcn.x_fsize);
+         H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr,
+                   ext->x_fcn.x_lnnoptr);
+         H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.u32,
+                   ext->x_fcn.x_endndx);
        }
       break;
-    }
 
-  H_PUT_32 (abfd, in->x_sym.x_tagndx.l, ext->x_sym.x_tagndx);
-  H_PUT_16 (abfd, in->x_sym.x_tvndx, ext->x_sym.x_tvndx);
+    case C_STAT:
+      H_PUT_32 (abfd, in->x_scn.x_scnlen, ext->x_scn.x_scnlen);
+      H_PUT_16 (abfd, in->x_scn.x_nreloc, ext->x_scn.x_nreloc);
+      H_PUT_16 (abfd, in->x_scn.x_nlinno, ext->x_scn.x_nlinno);
+      break;
 
-  if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
-      || ISTAG (in_class))
-    {
-      H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr,
-               ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
-      H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l,
-               ext->x_sym.x_fcnary.x_fcn.x_endndx);
-    }
-  else
-    {
-      H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
-               ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
-      H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
-               ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
-      H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
-               ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
-      H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
-               ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
-    }
+    case C_BLOCK:
+    case C_FCN:
+      H_PUT_32 (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext->x_sym.x_lnno);
+      break;
 
-  if (ISFCN (type))
-    H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_sym.x_misc.x_fsize);
-  else
-    {
-      H_PUT_16 (abfd, in->x_sym.x_misc.x_lnsz.x_lnno,
-               ext->x_sym.x_misc.x_lnsz.x_lnno);
-      H_PUT_16 (abfd, in->x_sym.x_misc.x_lnsz.x_size,
-               ext->x_sym.x_misc.x_lnsz.x_size);
+    case C_DWARF:
+      H_PUT_32 (abfd, in->x_sect.x_scnlen, ext->x_sect.x_scnlen);
+      H_PUT_32 (abfd, in->x_sect.x_nreloc, ext->x_sect.x_nreloc);
+      break;
     }
 
- end:
   return bfd_coff_auxesz (abfd);
 }
 \f
@@ -692,190 +650,190 @@ reloc_howto_type xcoff_howto_table[] =
   /* 0x00: Standard 32 bit relocation.  */
   HOWTO (R_POS,                        /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_POS",               /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x01: 32 bit relocation, but store negative value.  */
   HOWTO (R_NEG,                        /* type */
         0,                     /* rightshift */
-        -2,                    /* size (0 = byte, 1 = short, 2 = long) */
+        -4,                    /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_NEG",               /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x02: 32 bit PC relative relocation.  */
   HOWTO (R_REL,                        /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         0,                     /* special_function */
         "R_REL",               /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x03: 16 bit TOC relative relocation.  */
   HOWTO (R_TOC,                        /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_TOC",               /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0,                     /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x04: Same as R_TOC  */
   HOWTO (R_TRL,                        /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_TRL",               /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0,                     /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x05: External TOC relative symbol.  */
   HOWTO (R_GL,                 /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_GL",                /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0,                     /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x06: Local TOC relative symbol.   */
   HOWTO (R_TCL,                        /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_TCL",               /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0,                     /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   EMPTY_HOWTO (7),
 
   /* 0x08: Same as R_RBA.  */
   HOWTO (R_BA,                 /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         26,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_BA_26",             /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0x03fffffc,            /* src_mask */
         0x03fffffc,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   EMPTY_HOWTO (9),
 
   /* 0x0a: Same as R_RBR.  */
   HOWTO (R_BR,                 /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         26,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         0,                     /* special_function */
         "R_BR",                /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0x03fffffc,            /* src_mask */
         0x03fffffc,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   EMPTY_HOWTO (0xb),
 
   /* 0x0c: Same as R_POS.  */
   HOWTO (R_RL,                 /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_RL",                /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x0d: Same as R_POS.  */
   HOWTO (R_RLA,                        /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_RLA",               /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   EMPTY_HOWTO (0xe),
 
   /* 0x0f: Non-relocating reference.  Bitsize is 1 so that r_rsize is 0.  */
   HOWTO (R_REF,                        /* type */
         0,                     /* rightshift */
-        0,                     /* size (0 = byte, 1 = short, 2 = long) */
+        1,                     /* size */
         1,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         0,                     /* special_function */
         "R_REF",               /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   EMPTY_HOWTO (0x10),
   EMPTY_HOWTO (0x11),
@@ -884,275 +842,275 @@ reloc_howto_type xcoff_howto_table[] =
   /* 0x13: Same as R_TOC.  */
   HOWTO (R_TRLA,               /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_TRLA",              /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0,                     /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x14: Modifiable relative branch.  */
   HOWTO (R_RRTBI,              /* type */
         1,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_RRTBI",             /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x15: Modifiable absolute branch.  */
   HOWTO (R_RRTBA,              /* type */
         1,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_RRTBA",             /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x16: Modifiable call absolute indirect.  */
   HOWTO (R_CAI,                        /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_CAI",               /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x17: Modifiable call relative.  */
   HOWTO (R_CREL,               /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_CREL",              /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x18: Modifiable branch absolute.  */
   HOWTO (R_RBA,                        /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         26,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_RBA",               /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0x03fffffc,            /* src_mask */
         0x03fffffc,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x19: Modifiable branch absolute.  */
   HOWTO (R_RBAC,               /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_RBAC",              /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x1a: Modifiable branch relative.  */
   HOWTO (R_RBR,                        /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         26,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         0,                     /* special_function */
         "R_RBR_26",            /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0x03fffffc,            /* src_mask */
         0x03fffffc,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x1b: Modifiable branch absolute.  */
   HOWTO (R_RBRC,               /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_RBRC",              /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x1c: 16 bit Non modifiable absolute branch.  */
   HOWTO (R_BA,                 /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_BA_16",             /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xfffc,                /* src_mask */
         0xfffc,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x1d: Modifiable branch relative.  */
   HOWTO (R_RBR,                        /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         16,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         0,                     /* special_function */
         "R_RBR_16",            /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xfffc,                /* src_mask */
         0xfffc,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x1e: Modifiable branch relative.  */
   HOWTO (R_RBA,                        /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         0,                     /* special_function */
         "R_RBA_16",            /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   EMPTY_HOWTO (0x1f),
 
   /* 0x20: General-dynamic TLS relocation.  */
   HOWTO (R_TLS,                        /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_TLS",               /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x21: Initial-exec TLS relocation.  */
   HOWTO (R_TLS_IE,             /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_TLS_IE",            /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x22: Local-dynamic TLS relocation.  */
   HOWTO (R_TLS_LD,             /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_TLS_LD",            /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x23: Local-exec TLS relocation.  */
   HOWTO (R_TLS_LE,             /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_TLS_LE",            /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x24: TLS relocation.  */
   HOWTO (R_TLSM,               /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_TLSM",              /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
 
   /* 0x25: TLS module relocation.  */
   HOWTO (R_TLSML,              /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
-        "R_TLSM",              /* name */
-        TRUE,                  /* partial_inplace */
+        "R_TLSML",             /* name */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   EMPTY_HOWTO(0x26),
   EMPTY_HOWTO(0x27),
@@ -1168,32 +1126,32 @@ reloc_howto_type xcoff_howto_table[] =
   /* 0x30: High-order 16 bit TOC relative relocation.  */
   HOWTO (R_TOCU,               /* type */
         16,                    /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "R_TOCU",              /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0,                     /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 0x31: Low-order 16 bit TOC relative relocation.  */
   HOWTO (R_TOCL,               /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         0,                     /* special_function */
         "R_TOCL",              /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0,                     /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
 };
 
@@ -1253,6 +1211,8 @@ _bfd_xcoff_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
       return &xcoff_howto_table[0];
     case BFD_RELOC_NONE:
       return &xcoff_howto_table[0xf];
+    case BFD_RELOC_PPC_NEG:
+      return &xcoff_howto_table[0x1];
     case BFD_RELOC_PPC_TLSGD:
       return &xcoff_howto_table[0x20];
     case BFD_RELOC_PPC_TLSIE:
@@ -1375,7 +1335,7 @@ _bfd_strntoll (const char * nptr, int base, unsigned int maxlen)
 
 /* Read in the armap of an XCOFF archive.  */
 
-bfd_boolean
+bool
 _bfd_xcoff_slurp_armap (bfd *abfd)
 {
   file_ptr off;
@@ -1386,10 +1346,10 @@ _bfd_xcoff_slurp_armap (bfd *abfd)
   carsym *arsym;
   bfd_byte *p;
 
-  if (xcoff_ardata (abfd) == NULL)
+  if (x_artdata (abfd) == NULL)
     {
-      abfd->has_armap = FALSE;
-      return TRUE;
+      abfd->has_armap = false;
+      return true;
     }
 
   if (! xcoff_big_format_p (abfd))
@@ -1397,38 +1357,38 @@ _bfd_xcoff_slurp_armap (bfd *abfd)
       /* This is for the old format.  */
       struct xcoff_ar_hdr hdr;
 
-      GET_VALUE_IN_FIELD (off, xcoff_ardata (abfd)->symoff, 10);
+      GET_VALUE_IN_FIELD (off, x_artdata (abfd)->u.hdr.symoff, 10);
       if (off == 0)
        {
-         abfd->has_armap = FALSE;
-         return TRUE;
+         abfd->has_armap = false;
+         return true;
        }
 
       if (bfd_seek (abfd, off, SEEK_SET) != 0)
-       return FALSE;
+       return false;
 
       /* The symbol table starts with a normal archive header.  */
       if (bfd_bread (&hdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
          != SIZEOF_AR_HDR)
-       return FALSE;
+       return false;
 
       /* Skip the name (normally empty).  */
       GET_VALUE_IN_FIELD (namlen, hdr.namlen, 10);
       off = ((namlen + 1) & ~ (size_t) 1) + SXCOFFARFMAG;
       if (bfd_seek (abfd, off, SEEK_CUR) != 0)
-       return FALSE;
+       return false;
 
       GET_VALUE_IN_FIELD (sz, hdr.size, 10);
       if (sz + 1 < 5)
        {
          bfd_set_error (bfd_error_bad_value);
-         return FALSE;
+         return false;
        }
 
       /* Read in the entire symbol table.  */
       contents = (bfd_byte *) _bfd_alloc_and_read (abfd, sz + 1, sz);
       if (contents == NULL)
-       return FALSE;
+       return false;
 
       /* Ensure strings are NULL terminated so we don't wander off the
         end of the buffer.  */
@@ -1440,13 +1400,13 @@ _bfd_xcoff_slurp_armap (bfd *abfd)
       if (c >= sz / 4)
        {
          bfd_set_error (bfd_error_bad_value);
-         return FALSE;
+         return false;
        }
 
       bfd_ardata (abfd)->symdefs =
        ((carsym *) bfd_alloc (abfd, c * sizeof (carsym)));
       if (bfd_ardata (abfd)->symdefs == NULL)
-       return FALSE;
+       return false;
 
       /* After the count comes a list of four byte file offsets.  */
       for (i = 0, arsym = bfd_ardata (abfd)->symdefs, p = contents + 4;
@@ -1459,38 +1419,38 @@ _bfd_xcoff_slurp_armap (bfd *abfd)
       /* This is for the new format.  */
       struct xcoff_ar_hdr_big hdr;
 
-      GET_VALUE_IN_FIELD (off, xcoff_ardata_big (abfd)->symoff, 10);
+      GET_VALUE_IN_FIELD (off, x_artdata (abfd)->u.bhdr.symoff, 10);
       if (off == 0)
        {
-         abfd->has_armap = FALSE;
-         return TRUE;
+         abfd->has_armap = false;
+         return true;
        }
 
       if (bfd_seek (abfd, off, SEEK_SET) != 0)
-       return FALSE;
+       return false;
 
       /* The symbol table starts with a normal archive header.  */
       if (bfd_bread (&hdr, (bfd_size_type) SIZEOF_AR_HDR_BIG, abfd)
          != SIZEOF_AR_HDR_BIG)
-       return FALSE;
+       return false;
 
       /* Skip the name (normally empty).  */
       GET_VALUE_IN_FIELD (namlen, hdr.namlen, 10);
       off = ((namlen + 1) & ~ (size_t) 1) + SXCOFFARFMAG;
       if (bfd_seek (abfd, off, SEEK_CUR) != 0)
-       return FALSE;
+       return false;
 
       GET_VALUE_IN_FIELD (sz, hdr.size, 10);
       if (sz + 1 < 9)
        {
          bfd_set_error (bfd_error_bad_value);
-         return FALSE;
+         return false;
        }
 
       /* Read in the entire symbol table.  */
       contents = (bfd_byte *) _bfd_alloc_and_read (abfd, sz + 1, sz);
       if (contents == NULL)
-       return FALSE;
+       return false;
 
       /* Ensure strings are NULL terminated so we don't wander off the
         end of the buffer.  */
@@ -1502,13 +1462,13 @@ _bfd_xcoff_slurp_armap (bfd *abfd)
       if (c >= sz / 8)
        {
          bfd_set_error (bfd_error_bad_value);
-         return FALSE;
+         return false;
        }
 
       bfd_ardata (abfd)->symdefs =
        ((carsym *) bfd_alloc (abfd, c * sizeof (carsym)));
       if (bfd_ardata (abfd)->symdefs == NULL)
-       return FALSE;
+       return false;
 
       /* After the count comes a list of eight byte file offsets.  */
       for (i = 0, arsym = bfd_ardata (abfd)->symdefs, p = contents + 8;
@@ -1526,15 +1486,15 @@ _bfd_xcoff_slurp_armap (bfd *abfd)
       if (p >= cend)
        {
          bfd_set_error (bfd_error_bad_value);
-         return FALSE;
+         return false;
        }
       arsym->name = (char *) p;
     }
 
   bfd_ardata (abfd)->symdef_count = c;
-  abfd->has_armap = TRUE;
+  abfd->has_armap = true;
 
-  return TRUE;
+  return true;
 }
 
 /* See if this is an XCOFF archive.  */
@@ -1567,13 +1527,6 @@ _bfd_xcoff_archive_p (bfd *abfd)
   if (bfd_ardata (abfd) == (struct artdata *) NULL)
     goto error_ret_restore;
 
-  /* Cleared by bfd_zalloc above.
-     bfd_ardata (abfd)->cache = NULL;
-     bfd_ardata (abfd)->archive_head = NULL;
-     bfd_ardata (abfd)->symdefs = NULL;
-     bfd_ardata (abfd)->extended_names = NULL;
-     bfd_ardata (abfd)->extended_names_size = 0;  */
-
   /* Now handle the two formats.  */
   if (magic[1] != 'b')
     {
@@ -1595,12 +1548,12 @@ _bfd_xcoff_archive_p (bfd *abfd)
       GET_VALUE_IN_FIELD (bfd_ardata (abfd)->first_file_filepos,
                          hdr.firstmemoff, 10);
 
-      amt = SIZEOF_AR_FILE_HDR;
+      amt = sizeof (struct xcoff_artdata);
       bfd_ardata (abfd)->tdata = bfd_zalloc (abfd, amt);
       if (bfd_ardata (abfd)->tdata == NULL)
        goto error_ret;
 
-      memcpy (bfd_ardata (abfd)->tdata, &hdr, SIZEOF_AR_FILE_HDR);
+      memcpy (&x_artdata (abfd)->u.hdr, &hdr, SIZEOF_AR_FILE_HDR);
     }
   else
     {
@@ -1623,12 +1576,12 @@ _bfd_xcoff_archive_p (bfd *abfd)
                                                            (const char **) 0,
                                                            10);
 
-      amt = SIZEOF_AR_FILE_HDR_BIG;
+      amt = sizeof (struct xcoff_artdata);
       bfd_ardata (abfd)->tdata = bfd_zalloc (abfd, amt);
       if (bfd_ardata (abfd)->tdata == NULL)
        goto error_ret;
 
-      memcpy (bfd_ardata (abfd)->tdata, &hdr, SIZEOF_AR_FILE_HDR_BIG);
+      memcpy (&x_artdata (abfd)->u.bhdr, &hdr, SIZEOF_AR_FILE_HDR_BIG);
     }
 
   if (! _bfd_xcoff_slurp_armap (abfd))
@@ -1643,6 +1596,78 @@ _bfd_xcoff_archive_p (bfd *abfd)
   return _bfd_no_cleanup;
 }
 
+/* Track file ranges occupied by elements.  Add [START,END) to the
+   list of ranges and return TRUE if there is no overlap between the
+   new and any other element or the archive file header.  Note that
+   this would seem to preclude calling _bfd_get_elt_at_filepos twice
+   for the same element, but we won't get to _bfd_xcoff_read_ar_hdr if
+   an element is read more than once.  See _bfd_get_elt_at_filepos use
+   of _bfd_look_for_bfd_in_cache.  Also, the xcoff archive code
+   doesn't call _bfd_read_ar_hdr when reading the armap, nor does it
+   need to use extended name tables.  So those other routines in
+   archive.c that call _bfd_read_ar_hdr are unused.  */
+
+static bool
+add_range (bfd *abfd, ufile_ptr start, ufile_ptr end)
+{
+  if (end <= start)
+    {
+    err:
+      bfd_set_error (bfd_error_malformed_archive);
+      return false;
+    }
+
+  /* This list is kept sorted by address.  Find the highest address
+     range on the list that ends before the new range starts.  Exit
+     the loop with that range in LO, and the mext higher range in HI.  */
+  struct ar_ranges *hi = &x_artdata (abfd)->ranges;
+  struct ar_ranges *lo = NULL;
+  while (hi && hi->end <= start)
+    {
+      lo = hi;
+      hi = hi->next;
+    }
+
+  if (lo == NULL)
+    /* Start overlaps the file header or elements adjacent to it.  */
+    goto err;
+
+  if (hi && hi->start < end)
+    /* Overlap with another element.  */
+    goto err;
+
+  unsigned min_elt = x_artdata (abfd)->min_elt;
+  if (start - lo->end < min_elt)
+    {
+      /* Merge into an existing range.  */
+      lo->end = end;
+      if (hi && hi->start - end < min_elt)
+       {
+         /* In fact, we can merge two ranges.  */
+         lo->end = hi->end;
+         lo->next = hi->next;
+         /* The list uses bfd_alloc so don't free HI.  */
+       }
+      return true;
+    }
+
+  if (hi && hi->start - end < min_elt)
+    {
+      /* Merge into an existing range.  */
+      hi->start = start;
+      return true;
+    }
+
+  struct ar_ranges *newr = bfd_alloc (abfd, sizeof (*newr));
+  if (newr == NULL)
+    return false;
+  newr->start = start;
+  newr->end = end;
+  newr->next = hi;
+  lo->next = newr;
+  return true;
+}
+
 /* Read the archive header in an XCOFF archive.  */
 
 void *
@@ -1651,6 +1676,7 @@ _bfd_xcoff_read_ar_hdr (bfd *abfd)
   bfd_size_type namlen;
   struct areltdata *ret;
   bfd_size_type amt;
+  ufile_ptr start = abfd->where;
 
   if (! xcoff_big_format_p (abfd))
     {
@@ -1661,6 +1687,8 @@ _bfd_xcoff_read_ar_hdr (bfd *abfd)
        return NULL;
 
       GET_VALUE_IN_FIELD (namlen, hdr.namlen, 10);
+      if (namlen > bfd_get_file_size (abfd))
+       return NULL;
       amt = sizeof (struct areltdata) + SIZEOF_AR_HDR + namlen + 1;
       ret = (struct areltdata *) bfd_malloc (amt);
       if (ret == NULL)
@@ -1688,6 +1716,8 @@ _bfd_xcoff_read_ar_hdr (bfd *abfd)
        return NULL;
 
       GET_VALUE_IN_FIELD (namlen, hdr.namlen, 10);
+      if (namlen > bfd_get_file_size (abfd))
+       return NULL;
       amt = sizeof (struct areltdata) + SIZEOF_AR_HDR_BIG + namlen + 1;
       ret = (struct areltdata *) bfd_malloc (amt);
       if (ret == NULL)
@@ -1707,9 +1737,17 @@ _bfd_xcoff_read_ar_hdr (bfd *abfd)
       ret->filename = (char *) hdrp + SIZEOF_AR_HDR_BIG;
     }
 
+  /* Size occupied by the header above that covered in the fixed
+     SIZEOF_AR_HDR or SIZEOF_AR_HDR_BIG.  */
+  ret->extra_size = namlen + (namlen & 1) + SXCOFFARFMAG;
+
   /* Skip over the XCOFFARFMAG at the end of the file name.  */
-  if (bfd_seek (abfd, (file_ptr) ((namlen & 1) + SXCOFFARFMAG), SEEK_CUR) != 0)
-    return NULL;
+  if (bfd_seek (abfd, (namlen & 1) + SXCOFFARFMAG, SEEK_CUR) != 0
+      || !add_range (abfd, start, abfd->where + ret->parsed_size))
+    {
+      free (ret);
+      return NULL;
+    }
 
   return ret;
 }
@@ -1721,7 +1759,7 @@ _bfd_xcoff_openr_next_archived_file (bfd *archive, bfd *last_file)
 {
   file_ptr filestart;
 
-  if (xcoff_ardata (archive) == NULL)
+  if (x_artdata (archive) == NULL)
     {
       bfd_set_error (bfd_error_invalid_operation);
       return NULL;
@@ -1730,13 +1768,22 @@ _bfd_xcoff_openr_next_archived_file (bfd *archive, bfd *last_file)
   if (! xcoff_big_format_p (archive))
     {
       if (last_file == NULL)
-       filestart = bfd_ardata (archive)->first_file_filepos;
+       {
+         filestart = bfd_ardata (archive)->first_file_filepos;
+         if (x_artdata (archive)->min_elt == 0)
+           {
+             x_artdata (archive)->ranges.end = SIZEOF_AR_FILE_HDR;
+             x_artdata (archive)->min_elt = SIZEOF_AR_HDR + SXCOFFARFMAG + 2;
+           }
+       }
       else
        GET_VALUE_IN_FIELD (filestart, arch_xhdr (last_file)->nextoff, 10);
 
       if (filestart == 0
-         || EQ_VALUE_IN_FIELD (filestart, xcoff_ardata (archive)->memoff, 10)
-         || EQ_VALUE_IN_FIELD (filestart, xcoff_ardata (archive)->symoff, 10))
+         || EQ_VALUE_IN_FIELD (filestart,
+                               x_artdata (archive)->u.hdr.memoff, 10)
+         || EQ_VALUE_IN_FIELD (filestart,
+                               x_artdata (archive)->u.hdr.symoff, 10))
        {
          bfd_set_error (bfd_error_no_more_archived_files);
          return NULL;
@@ -1745,20 +1792,29 @@ _bfd_xcoff_openr_next_archived_file (bfd *archive, bfd *last_file)
   else
     {
       if (last_file == NULL)
-       filestart = bfd_ardata (archive)->first_file_filepos;
+       {
+         filestart = bfd_ardata (archive)->first_file_filepos;
+         if (x_artdata (archive)->min_elt == 0)
+           {
+             x_artdata (archive)->ranges.end = SIZEOF_AR_FILE_HDR_BIG;
+             x_artdata (archive)->min_elt = SIZEOF_AR_HDR_BIG + SXCOFFARFMAG + 2;
+           }
+       }
       else
        GET_VALUE_IN_FIELD (filestart, arch_xhdr_big (last_file)->nextoff, 10);
 
       if (filestart == 0
-         || EQ_VALUE_IN_FIELD (filestart, xcoff_ardata_big (archive)->memoff, 10)
-         || EQ_VALUE_IN_FIELD (filestart, xcoff_ardata_big (archive)->symoff, 10))
+         || EQ_VALUE_IN_FIELD (filestart,
+                               x_artdata (archive)->u.bhdr.memoff, 10)
+         || EQ_VALUE_IN_FIELD (filestart,
+                               x_artdata (archive)->u.bhdr.symoff, 10))
        {
          bfd_set_error (bfd_error_no_more_archived_files);
          return NULL;
        }
     }
 
-  return _bfd_get_elt_at_filepos (archive, filestart);
+  return _bfd_get_elt_at_filepos (archive, filestart, NULL);
 }
 
 /* Stat an element in an XCOFF archive.  */
@@ -1815,7 +1871,7 @@ normalize_filename (bfd *abfd)
 
 /* Write out an XCOFF armap.  */
 
-static bfd_boolean
+static bool
 xcoff_write_armap_old (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
                       struct orl *map, unsigned int orl_count, int stridx)
 {
@@ -1828,7 +1884,8 @@ xcoff_write_armap_old (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
   memset (&hdr, 0, sizeof hdr);
   sprintf (hdr.size, "%ld", (long) (4 + orl_count * 4 + stridx));
   sprintf (hdr.nextoff, "%d", 0);
-  memcpy (hdr.prevoff, xcoff_ardata (abfd)->memoff, XCOFFARMAG_ELEMENT_SIZE);
+  memcpy (hdr.prevoff, x_artdata (abfd)->u.hdr.memoff,
+         XCOFFARMAG_ELEMENT_SIZE);
   sprintf (hdr.date, "%d", 0);
   sprintf (hdr.uid, "%d", 0);
   sprintf (hdr.gid, "%d", 0);
@@ -1844,11 +1901,11 @@ xcoff_write_armap_old (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
       != SIZEOF_AR_HDR
       || (bfd_bwrite (XCOFFARFMAG, (bfd_size_type) SXCOFFARFMAG, abfd)
          != SXCOFFARFMAG))
-    return FALSE;
+    return false;
 
   H_PUT_32 (abfd, orl_count, buf);
   if (bfd_bwrite (buf, (bfd_size_type) 4, abfd) != 4)
-    return FALSE;
+    return false;
 
   i = 0;
   archive_iterator_begin (&iterator, abfd);
@@ -1857,7 +1914,7 @@ xcoff_write_armap_old (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
       {
        H_PUT_32 (abfd, iterator.current.offset, buf);
        if (bfd_bwrite (buf, (bfd_size_type) 4, abfd) != 4)
-         return FALSE;
+         return false;
        ++i;
       }
 
@@ -1869,7 +1926,7 @@ xcoff_write_armap_old (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
       name = *map[i].name;
       namlen = strlen (name);
       if (bfd_bwrite (name, (bfd_size_type) (namlen + 1), abfd) != namlen + 1)
-       return FALSE;
+       return false;
     }
 
   if ((stridx & 1) != 0)
@@ -1878,25 +1935,19 @@ xcoff_write_armap_old (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
 
       b = '\0';
       if (bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
-       return FALSE;
+       return false;
     }
 
-  return TRUE;
+  return true;
 }
 
 static char buff20[XCOFFARMAGBIG_ELEMENT_SIZE + 1];
-#if BFD_HOST_64BIT_LONG
-#define FMT20  "%-20ld"
-#elif defined (__MSVCRT__)
-#define FMT20  "%-20I64d"
-#else
-#define FMT20  "%-20lld"
-#endif
+#define FMT20  "%-20" PRId64
 #define FMT12  "%-12d"
 #define FMT12_OCTAL  "%-12o"
 #define FMT4  "%-4d"
 #define PRINT20(d, v) \
-  sprintf (buff20, FMT20, (bfd_uint64_t)(v)), \
+  sprintf (buff20, FMT20, (uint64_t) (v)), \
   memcpy ((void *) (d), buff20, 20)
 
 #define PRINT12(d, v) \
@@ -1916,30 +1967,30 @@ static char buff20[XCOFFARMAGBIG_ELEMENT_SIZE + 1];
   memcpy (buff20, (d), 20), \
   (v) = bfd_scan_vma (buff20, (const char **) NULL, 10)
 
-static bfd_boolean
+static bool
 do_pad (bfd *abfd, unsigned int number)
 {
   bfd_byte b = 0;
 
   /* Limit pad to <= 4096.  */
   if (number > 4096)
-    return FALSE;
+    return false;
 
   while (number--)
     if (bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
-      return FALSE;
+      return false;
 
-  return TRUE;
+  return true;
 }
 
-static bfd_boolean
+static bool
 do_copy (bfd *out_bfd, bfd *in_bfd)
 {
   bfd_size_type remaining;
   bfd_byte buffer[DEFAULT_BUFFERSIZE];
 
   if (bfd_seek (in_bfd, (file_ptr) 0, SEEK_SET) != 0)
-    return FALSE;
+    return false;
 
   remaining = arelt_size (in_bfd);
 
@@ -1947,7 +1998,7 @@ do_copy (bfd *out_bfd, bfd *in_bfd)
     {
       if (bfd_bread (buffer, DEFAULT_BUFFERSIZE, in_bfd) != DEFAULT_BUFFERSIZE
          || bfd_bwrite (buffer, DEFAULT_BUFFERSIZE, out_bfd) != DEFAULT_BUFFERSIZE)
-       return FALSE;
+       return false;
 
       remaining -= DEFAULT_BUFFERSIZE;
     }
@@ -1956,13 +2007,13 @@ do_copy (bfd *out_bfd, bfd *in_bfd)
     {
       if (bfd_bread (buffer, remaining, in_bfd) != remaining
          || bfd_bwrite (buffer, remaining, out_bfd) != remaining)
-       return FALSE;
+       return false;
     }
 
-  return TRUE;
+  return true;
 }
 
-static bfd_boolean
+static bool
 xcoff_write_armap_big (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
                       struct orl *map, unsigned int orl_count, int stridx)
 {
@@ -2006,7 +2057,7 @@ xcoff_write_armap_big (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
   /* Explicit cast to int for compiler.  */
   BFD_ASSERT ((int)(str_64 + str_32) == stridx);
 
-  fhdr = xcoff_ardata_big (abfd);
+  fhdr = &x_artdata (abfd)->u.bhdr;
 
   /* xcoff_write_archive_contents_big passes nextoff in symoff. */
   READ20 (fhdr->memoff, prevoff);
@@ -2050,7 +2101,7 @@ xcoff_write_armap_big (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
 
       symbol_table = bfd_zmalloc (symbol_table_size);
       if (symbol_table == NULL)
-       return FALSE;
+       return false;
 
       hdr = (struct xcoff_ar_hdr_big *) symbol_table;
 
@@ -2135,7 +2186,7 @@ xcoff_write_armap_big (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
 
       symbol_table = bfd_zmalloc (symbol_table_size);
       if (symbol_table == NULL)
-       return FALSE;
+       return false;
 
       hdr = (struct xcoff_ar_hdr_big *) symbol_table;
 
@@ -2199,10 +2250,10 @@ xcoff_write_armap_big (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
   else
     PRINT20 (fhdr->symoff64, 0);
 
-  return TRUE;
+  return true;
 }
 
-bfd_boolean
+bool
 _bfd_xcoff_write_armap (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
                        struct orl *map, unsigned int orl_count, int stridx)
 {
@@ -2215,16 +2266,17 @@ _bfd_xcoff_write_armap (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
 /* Write out an XCOFF archive.  We always write an entire archive,
    rather than fussing with the freelist and so forth.  */
 
-static bfd_boolean
+static bool
 xcoff_write_archive_contents_old (bfd *abfd)
 {
   struct archive_iterator iterator;
-  struct xcoff_ar_file_hdr fhdr;
+  struct xcoff_artdata xtdata;
+  struct xcoff_ar_file_hdr *fhdr = &xtdata.u.hdr;
   bfd_size_type count;
   bfd_size_type total_namlen;
   file_ptr *offsets;
-  bfd_boolean makemap;
-  bfd_boolean hasobjects;
+  bool makemap;
+  bool hasobjects;
   file_ptr prevoff, nextoff;
   bfd *sub;
   size_t i;
@@ -2233,10 +2285,10 @@ xcoff_write_archive_contents_old (bfd *abfd)
   char *p;
   char decbuf[XCOFFARMAG_ELEMENT_SIZE + 1];
 
-  memset (&fhdr, 0, sizeof fhdr);
-  (void) memcpy (fhdr.magic, XCOFFARMAG, SXCOFFARMAG);
-  sprintf (fhdr.firstmemoff, "%d", SIZEOF_AR_FILE_HDR);
-  sprintf (fhdr.freeoff, "%d", 0);
+  memset (&xtdata, 0, sizeof (xtdata));
+  memcpy (fhdr->magic, XCOFFARMAG, SXCOFFARMAG);
+  sprintf (fhdr->firstmemoff, "%zu", SIZEOF_AR_FILE_HDR);
+  sprintf (fhdr->freeoff, "%d", 0);
 
   count = 0;
   total_namlen = 0;
@@ -2248,7 +2300,7 @@ xcoff_write_archive_contents_old (bfd *abfd)
        {
          sub->arelt_data = bfd_zmalloc (sizeof (struct areltdata));
          if (sub->arelt_data == NULL)
-           return FALSE;
+           return false;
        }
       if (arch_xhdr (sub) == NULL)
        {
@@ -2269,7 +2321,7 @@ xcoff_write_archive_contents_old (bfd *abfd)
          else if (stat (bfd_get_filename (sub), &s) != 0)
            {
              bfd_set_input_error (sub, bfd_error_system_call);
-             return FALSE;
+             return false;
            }
 
          if ((abfd->flags & BFD_DETERMINISTIC_OUTPUT) != 0)
@@ -2282,7 +2334,7 @@ xcoff_write_archive_contents_old (bfd *abfd)
 
          ahdrp = bfd_zalloc (sub, sizeof (*ahdrp));
          if (ahdrp == NULL)
-           return FALSE;
+           return false;
 
          sprintf (ahdrp->size, "%ld", (long) s.st_size);
          sprintf (ahdrp->date, "%ld", (long) s.st_mtime);
@@ -2296,13 +2348,13 @@ xcoff_write_archive_contents_old (bfd *abfd)
     }
   offsets = (file_ptr *) bfd_alloc (abfd, count * sizeof (file_ptr));
   if (offsets == NULL)
-    return FALSE;
+    return false;
 
   if (bfd_seek (abfd, (file_ptr) SIZEOF_AR_FILE_HDR, SEEK_SET) != 0)
-    return FALSE;
+    return false;
 
   makemap = bfd_has_map (abfd);
-  hasobjects = FALSE;
+  hasobjects = false;
   prevoff = 0;
   for (archive_iterator_begin (&iterator, abfd), i = 0;
        archive_iterator_next (&iterator);
@@ -2314,7 +2366,7 @@ xcoff_write_archive_contents_old (bfd *abfd)
       if (makemap && ! hasobjects)
        {
          if (bfd_check_format (iterator.current.member, bfd_object))
-           hasobjects = TRUE;
+           hasobjects = true;
        }
 
       ahdrp = arch_xhdr (iterator.current.member);
@@ -2328,7 +2380,7 @@ xcoff_write_archive_contents_old (bfd *abfd)
          *p = ' ';
 
       if (!do_pad (abfd, iterator.current.leading_padding))
-       return FALSE;
+       return false;
 
       BFD_ASSERT (iterator.current.offset == bfd_tell (abfd));
       namlen = iterator.current.padded_namlen;
@@ -2338,19 +2390,19 @@ xcoff_write_archive_contents_old (bfd *abfd)
          || bfd_seek (iterator.current.member, 0, SEEK_SET) != 0
          || !do_copy (abfd, iterator.current.member)
          || !do_pad (abfd, iterator.current.trailing_padding))
-       return FALSE;
+       return false;
 
       offsets[i] = iterator.current.offset;
       prevoff = iterator.current.offset;
     }
 
-  sprintf (fhdr.lastmemoff, "%ld", (long) prevoff);
+  sprintf (fhdr->lastmemoff, "%ld", (long) prevoff);
 
   /* Write out the member table.  */
 
   nextoff = iterator.next.offset;
   BFD_ASSERT (nextoff == bfd_tell (abfd));
-  sprintf (fhdr.memoff, "%ld", (long) nextoff);
+  sprintf (fhdr->memoff, "%ld", (long) nextoff);
 
   memset (&ahdr, 0, sizeof ahdr);
   sprintf (ahdr.size, "%ld", (long) (XCOFFARMAG_ELEMENT_SIZE
@@ -2386,18 +2438,18 @@ xcoff_write_archive_contents_old (bfd *abfd)
        != SIZEOF_AR_HDR)
       || (bfd_bwrite (XCOFFARFMAG, (bfd_size_type) SXCOFFARFMAG, abfd)
          != SXCOFFARFMAG))
-    return FALSE;
+    return false;
 
   sprintf (decbuf, "%-12ld", (long) count);
   if (bfd_bwrite (decbuf, (bfd_size_type) XCOFFARMAG_ELEMENT_SIZE, abfd)
       != XCOFFARMAG_ELEMENT_SIZE)
-    return FALSE;
+    return false;
   for (i = 0; i < (size_t) count; i++)
     {
       sprintf (decbuf, "%-12ld", (long) offsets[i]);
       if (bfd_bwrite (decbuf, (bfd_size_type) XCOFFARMAG_ELEMENT_SIZE,
                      abfd) != XCOFFARMAG_ELEMENT_SIZE)
-       return FALSE;
+       return false;
     }
   for (sub = abfd->archive_head; sub != NULL; sub = sub->archive_next)
     {
@@ -2407,48 +2459,50 @@ xcoff_write_archive_contents_old (bfd *abfd)
       name = normalize_filename (sub);
       namlen = strlen (name);
       if (bfd_bwrite (name, namlen + 1, abfd) != namlen + 1)
-       return FALSE;
+       return false;
     }
 
   if (! do_pad (abfd, size & 1))
-    return FALSE;
+    return false;
 
   /* Write out the armap, if appropriate.  */
   if (! makemap || ! hasobjects)
-    sprintf (fhdr.symoff, "%d", 0);
+    sprintf (fhdr->symoff, "%d", 0);
   else
     {
       BFD_ASSERT (nextoff == bfd_tell (abfd));
-      sprintf (fhdr.symoff, "%ld", (long) nextoff);
-      bfd_ardata (abfd)->tdata = &fhdr;
-      if (! _bfd_compute_and_write_armap (abfd, 0))
-       return FALSE;
+      sprintf (fhdr->symoff, "%ld", (long) nextoff);
+      bfd_ardata (abfd)->tdata = &xtdata;
+      bool ret = _bfd_compute_and_write_armap (abfd, 0);
+      bfd_ardata (abfd)->tdata = NULL;
+      if (!ret)
+       return false;
     }
 
   /* Write out the archive file header.  */
 
   /* We need spaces, not null bytes, in the header.  */
-  for (p = (char *) &fhdr; p < (char *) &fhdr + SIZEOF_AR_FILE_HDR; p++)
+  for (p = (char *) fhdr; p < (char *) fhdr + SIZEOF_AR_FILE_HDR; p++)
     if (*p == '\0')
       *p = ' ';
 
-  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
-      || (bfd_bwrite (&fhdr, (bfd_size_type) SIZEOF_AR_FILE_HDR, abfd)
-         != SIZEOF_AR_FILE_HDR))
-    return FALSE;
+  if (bfd_seek (abfd, 0, SEEK_SET) != 0
+      || (bfd_bwrite (fhdr, SIZEOF_AR_FILE_HDR, abfd) != SIZEOF_AR_FILE_HDR))
+    return false;
 
-  return TRUE;
+  return true;
 }
 
-static bfd_boolean
+static bool
 xcoff_write_archive_contents_big (bfd *abfd)
 {
-  struct xcoff_ar_file_hdr_big fhdr;
+  struct xcoff_artdata xtdata;
+  struct xcoff_ar_file_hdr_big *fhdr = &xtdata.u.bhdr;
   bfd_size_type count;
   bfd_size_type total_namlen;
   file_ptr *offsets;
-  bfd_boolean makemap;
-  bfd_boolean hasobjects;
+  bool makemap;
+  bool hasobjects;
   file_ptr prevoff, nextoff;
   bfd *current_bfd;
   size_t i;
@@ -2458,15 +2512,15 @@ xcoff_write_archive_contents_big (bfd *abfd)
   bfd_vma member_table_size;
   struct archive_iterator iterator;
 
-  memset (&fhdr, 0, SIZEOF_AR_FILE_HDR_BIG);
-  memcpy (fhdr.magic, XCOFFARMAGBIG, SXCOFFARMAG);
+  memset (&xtdata, 0, sizeof (xtdata));
+  memcpy (fhdr->magic, XCOFFARMAGBIG, SXCOFFARMAG);
 
   if (bfd_seek (abfd, (file_ptr) SIZEOF_AR_FILE_HDR_BIG, SEEK_SET) != 0)
-    return FALSE;
+    return false;
 
   /* Calculate count and total_namlen.  */
   makemap = bfd_has_map (abfd);
-  hasobjects = FALSE;
+  hasobjects = false;
   for (current_bfd = abfd->archive_head, count = 0, total_namlen = 0;
        current_bfd != NULL;
        current_bfd = current_bfd->archive_next, count++)
@@ -2476,14 +2530,14 @@ xcoff_write_archive_contents_big (bfd *abfd)
       if (makemap
          && ! hasobjects
          && bfd_check_format (current_bfd, bfd_object))
-       hasobjects = TRUE;
+       hasobjects = true;
 
       if (current_bfd->arelt_data == NULL)
        {
          size = sizeof (struct areltdata);
          current_bfd->arelt_data = bfd_zmalloc (size);
          if (current_bfd->arelt_data == NULL)
-           return FALSE;
+           return false;
        }
 
       if (arch_xhdr_big (current_bfd) == NULL)
@@ -2505,7 +2559,7 @@ xcoff_write_archive_contents_big (bfd *abfd)
          else if (stat (bfd_get_filename (current_bfd), &s) != 0)
            {
              bfd_set_input_error (current_bfd, bfd_error_system_call);
-             return FALSE;
+             return false;
            }
 
          if ((abfd->flags & BFD_DETERMINISTIC_OUTPUT) != 0)
@@ -2518,7 +2572,7 @@ xcoff_write_archive_contents_big (bfd *abfd)
 
          ahdrp = bfd_zalloc (current_bfd, sizeof (*ahdrp));
          if (ahdrp == NULL)
-           return FALSE;
+           return false;
 
          PRINT20 (ahdrp->size, s.st_size);
          PRINT12 (ahdrp->date, s.st_mtime);
@@ -2536,7 +2590,7 @@ xcoff_write_archive_contents_big (bfd *abfd)
     {
       offsets = (file_ptr *) bfd_malloc (count * sizeof (file_ptr));
       if (offsets == NULL)
-       return FALSE;
+       return false;
     }
 
   prevoff = 0;
@@ -2555,7 +2609,7 @@ xcoff_write_archive_contents_big (bfd *abfd)
       if (!do_pad (abfd, iterator.current.leading_padding))
        {
          free (offsets);
-         return FALSE;
+         return false;
        }
 
       BFD_ASSERT (iterator.current.offset == bfd_tell (abfd));
@@ -2568,7 +2622,7 @@ xcoff_write_archive_contents_big (bfd *abfd)
          || !do_pad (abfd, iterator.current.trailing_padding))
        {
          free (offsets);
-         return FALSE;
+         return false;
        }
 
       offsets[i] = iterator.current.offset;
@@ -2577,8 +2631,8 @@ xcoff_write_archive_contents_big (bfd *abfd)
 
   if (count)
     {
-      PRINT20 (fhdr.firstmemoff, offsets[0]);
-      PRINT20 (fhdr.lastmemoff, prevoff);
+      PRINT20 (fhdr->firstmemoff, offsets[0]);
+      PRINT20 (fhdr->lastmemoff, prevoff);
     }
 
   /* Write out the member table.
@@ -2616,7 +2670,7 @@ xcoff_write_archive_contents_big (bfd *abfd)
   if (member_table == NULL)
     {
       free (offsets);
-      return FALSE;
+      return false;
     }
 
   hdr = (struct xcoff_ar_hdr_big *) member_table;
@@ -2666,11 +2720,11 @@ xcoff_write_archive_contents_big (bfd *abfd)
     }
 
   if (bfd_bwrite (member_table, member_table_size, abfd) != member_table_size)
-    return FALSE;
+    return false;
 
   free (member_table);
 
-  PRINT20 (fhdr.memoff, nextoff);
+  PRINT20 (fhdr->memoff, nextoff);
 
   prevoff = nextoff;
   nextoff += member_table_size;
@@ -2678,30 +2732,32 @@ xcoff_write_archive_contents_big (bfd *abfd)
   /* Write out the armap, if appropriate.  */
 
   if (! makemap || ! hasobjects)
-    PRINT20 (fhdr.symoff, 0);
+    PRINT20 (fhdr->symoff, 0);
   else
     {
       BFD_ASSERT (nextoff == bfd_tell (abfd));
 
-      /* Save nextoff in fhdr.symoff so the armap routine can use it.  */
-      PRINT20 (fhdr.symoff, nextoff);
+      /* Save nextoff in fhdr->symoff so the armap routine can use it.  */
+      PRINT20 (fhdr->symoff, nextoff);
 
-      bfd_ardata (abfd)->tdata = &fhdr;
-      if (! _bfd_compute_and_write_armap (abfd, 0))
-       return FALSE;
+      bfd_ardata (abfd)->tdata = &xtdata;
+      bool ret = _bfd_compute_and_write_armap (abfd, 0);
+      bfd_ardata (abfd)->tdata = NULL;
+      if (!ret)
+       return false;
     }
 
   /* Write out the archive file header.  */
 
-  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
-      || (bfd_bwrite (&fhdr, (bfd_size_type) SIZEOF_AR_FILE_HDR_BIG,
-                     abfd) != SIZEOF_AR_FILE_HDR_BIG))
-    return FALSE;
+  if (bfd_seek (abfd, 0, SEEK_SET) != 0
+      || bfd_bwrite (fhdr,
+                    SIZEOF_AR_FILE_HDR_BIG, abfd) != SIZEOF_AR_FILE_HDR_BIG)
+    return false;
 
-  return TRUE;
+  return true;
 }
 
-bfd_boolean
+bool
 _bfd_xcoff_write_archive_contents (bfd *abfd)
 {
   if (! xcoff_big_format_p (abfd))
@@ -2922,7 +2978,7 @@ xcoff_swap_ldrel_out (bfd *abfd, const struct internal_ldrel *src, void * d)
 }
 \f
 
-bfd_boolean
+bool
 xcoff_reloc_type_noop (bfd *input_bfd ATTRIBUTE_UNUSED,
                       asection *input_section ATTRIBUTE_UNUSED,
                       bfd *output_bfd ATTRIBUTE_UNUSED,
@@ -2932,12 +2988,13 @@ xcoff_reloc_type_noop (bfd *input_bfd ATTRIBUTE_UNUSED,
                       bfd_vma val ATTRIBUTE_UNUSED,
                       bfd_vma addend ATTRIBUTE_UNUSED,
                       bfd_vma *relocation ATTRIBUTE_UNUSED,
-                      bfd_byte *contents ATTRIBUTE_UNUSED)
+                      bfd_byte *contents ATTRIBUTE_UNUSED,
+                      struct bfd_link_info *info ATTRIBUTE_UNUSED)
 {
-  return TRUE;
+  return true;
 }
 
-bfd_boolean
+bool
 xcoff_reloc_type_fail (bfd *input_bfd,
                       asection *input_section ATTRIBUTE_UNUSED,
                       bfd *output_bfd ATTRIBUTE_UNUSED,
@@ -2947,17 +3004,18 @@ xcoff_reloc_type_fail (bfd *input_bfd,
                       bfd_vma val ATTRIBUTE_UNUSED,
                       bfd_vma addend ATTRIBUTE_UNUSED,
                       bfd_vma *relocation ATTRIBUTE_UNUSED,
-                      bfd_byte *contents ATTRIBUTE_UNUSED)
+                      bfd_byte *contents ATTRIBUTE_UNUSED,
+                      struct bfd_link_info *info ATTRIBUTE_UNUSED)
 {
   _bfd_error_handler
     /* xgettext: c-format */
     (_("%pB: unsupported relocation type %#x"),
      input_bfd, (unsigned int) rel->r_type);
   bfd_set_error (bfd_error_bad_value);
-  return FALSE;
+  return false;
 }
 
-bfd_boolean
+bool
 xcoff_reloc_type_pos (bfd *input_bfd ATTRIBUTE_UNUSED,
                      asection *input_section ATTRIBUTE_UNUSED,
                      bfd *output_bfd ATTRIBUTE_UNUSED,
@@ -2967,13 +3025,14 @@ xcoff_reloc_type_pos (bfd *input_bfd ATTRIBUTE_UNUSED,
                      bfd_vma val,
                      bfd_vma addend,
                      bfd_vma *relocation,
-                     bfd_byte *contents ATTRIBUTE_UNUSED)
+                     bfd_byte *contents ATTRIBUTE_UNUSED,
+                     struct bfd_link_info *info ATTRIBUTE_UNUSED)
 {
   *relocation = val + addend;
-  return TRUE;
+  return true;
 }
 
-bfd_boolean
+bool
 xcoff_reloc_type_neg (bfd *input_bfd ATTRIBUTE_UNUSED,
                      asection *input_section ATTRIBUTE_UNUSED,
                      bfd *output_bfd ATTRIBUTE_UNUSED,
@@ -2983,13 +3042,14 @@ xcoff_reloc_type_neg (bfd *input_bfd ATTRIBUTE_UNUSED,
                      bfd_vma val,
                      bfd_vma addend,
                      bfd_vma *relocation,
-                     bfd_byte *contents ATTRIBUTE_UNUSED)
+                     bfd_byte *contents ATTRIBUTE_UNUSED,
+                     struct bfd_link_info *info ATTRIBUTE_UNUSED)
 {
-  *relocation = addend - val;
-  return TRUE;
+  *relocation = - val - addend;
+  return true;
 }
 
-bfd_boolean
+bool
 xcoff_reloc_type_rel (bfd *input_bfd ATTRIBUTE_UNUSED,
                      asection *input_section,
                      bfd *output_bfd ATTRIBUTE_UNUSED,
@@ -2999,9 +3059,10 @@ xcoff_reloc_type_rel (bfd *input_bfd ATTRIBUTE_UNUSED,
                      bfd_vma val,
                      bfd_vma addend,
                      bfd_vma *relocation,
-                     bfd_byte *contents ATTRIBUTE_UNUSED)
+                     bfd_byte *contents ATTRIBUTE_UNUSED,
+                     struct bfd_link_info *info ATTRIBUTE_UNUSED)
 {
-  howto->pc_relative = TRUE;
+  howto->pc_relative = true;
 
   /* A PC relative reloc includes the section address.  */
   addend += input_section->vma;
@@ -3009,10 +3070,10 @@ xcoff_reloc_type_rel (bfd *input_bfd ATTRIBUTE_UNUSED,
   *relocation = val + addend;
   *relocation -= (input_section->output_section->vma
                  + input_section->output_offset);
-  return TRUE;
+  return true;
 }
 
-bfd_boolean
+bool
 xcoff_reloc_type_toc (bfd *input_bfd,
                      asection *input_section ATTRIBUTE_UNUSED,
                      bfd *output_bfd,
@@ -3022,12 +3083,13 @@ xcoff_reloc_type_toc (bfd *input_bfd,
                      bfd_vma val,
                      bfd_vma addend ATTRIBUTE_UNUSED,
                      bfd_vma *relocation,
-                     bfd_byte *contents ATTRIBUTE_UNUSED)
+                     bfd_byte *contents ATTRIBUTE_UNUSED,
+                     struct bfd_link_info *info ATTRIBUTE_UNUSED)
 {
   struct xcoff_link_hash_entry *h;
 
   if (0 > rel->r_symndx)
-    return FALSE;
+    return false;
 
   h = obj_xcoff_sym_hashes (input_bfd)[rel->r_symndx];
 
@@ -3040,7 +3102,7 @@ xcoff_reloc_type_toc (bfd *input_bfd,
            (_("%pB: TOC reloc at %#" PRIx64 " to symbol `%s' with no TOC entry"),
             input_bfd, (uint64_t) rel->r_vaddr, h->root.root.string);
          bfd_set_error (bfd_error_bad_value);
-         return FALSE;
+         return false;
        }
 
       BFD_ASSERT ((h->flags & XCOFF_SET_TOC) == 0);
@@ -3058,10 +3120,10 @@ xcoff_reloc_type_toc (bfd *input_bfd,
   if (rel->r_type == R_TOCL)
     *relocation = *relocation & 0x0000ffff;
 
-  return TRUE;
+  return true;
 }
 
-bfd_boolean
+bool
 xcoff_reloc_type_ba (bfd *input_bfd ATTRIBUTE_UNUSED,
                     asection *input_section ATTRIBUTE_UNUSED,
                     bfd *output_bfd ATTRIBUTE_UNUSED,
@@ -3071,17 +3133,18 @@ xcoff_reloc_type_ba (bfd *input_bfd ATTRIBUTE_UNUSED,
                     bfd_vma val,
                     bfd_vma addend,
                     bfd_vma *relocation,
-                    bfd_byte *contents ATTRIBUTE_UNUSED)
+                    bfd_byte *contents ATTRIBUTE_UNUSED,
+                    struct bfd_link_info *info ATTRIBUTE_UNUSED)
 {
   howto->src_mask &= ~3;
   howto->dst_mask = howto->src_mask;
 
   *relocation = val + addend;
 
-  return TRUE;
+  return true;
 }
 
-static bfd_boolean
+static bool
 xcoff_reloc_type_br (bfd *input_bfd,
                     asection *input_section,
                     bfd *output_bfd ATTRIBUTE_UNUSED,
@@ -3091,13 +3154,16 @@ xcoff_reloc_type_br (bfd *input_bfd,
                     bfd_vma val,
                     bfd_vma addend,
                     bfd_vma *relocation,
-                    bfd_byte *contents)
+                    bfd_byte *contents,
+                    struct bfd_link_info *info)
 {
   struct xcoff_link_hash_entry *h;
   bfd_vma section_offset;
+  struct xcoff_stub_hash_entry *stub_entry = NULL;
+  enum xcoff_stub_type stub_type;
 
   if (0 > rel->r_symndx)
-    return FALSE;
+    return false;
 
   h = obj_xcoff_sym_hashes (input_bfd)[rel->r_symndx];
   section_offset = rel->r_vaddr - input_section->vma;
@@ -3148,6 +3214,27 @@ xcoff_reloc_type_br (bfd *input_bfd,
       howto->complain_on_overflow = complain_overflow_dont;
     }
 
+  /* Check if a stub is needed.  */
+  stub_type = bfd_xcoff_type_of_stub (input_section, rel, val, h);
+  if (stub_type != xcoff_stub_none)
+    {
+      asection *stub_csect;
+
+      stub_entry = bfd_xcoff_get_stub_entry (input_section, h, info);
+      if (stub_entry == NULL)
+       {
+         _bfd_error_handler (_("Unable to find the stub entry targeting %s"),
+                             h->root.root.string);
+         bfd_set_error (bfd_error_bad_value);
+         return false;
+       }
+
+      stub_csect = stub_entry->hcsect->root.u.def.section;
+      val = (stub_entry->stub_offset
+            + stub_csect->output_section->vma
+            + stub_csect->output_offset);
+    }
+
   /* The original PC-relative relocation is biased by -r_vaddr, so adding
      the value below will give the absolute target address.  */
   *relocation = val + addend + rel->r_vaddr;
@@ -3172,22 +3259,22 @@ xcoff_reloc_type_br (bfd *input_bfd,
       bfd_put_32 (input_bfd, insn, ptr);
 
       /* Make the howto absolute too.  */
-      howto->pc_relative = FALSE;
+      howto->pc_relative = false;
       howto->complain_on_overflow = complain_overflow_bitfield;
     }
   else
     {
       /* Use a PC-relative howto and subtract the instruction's address
         from the target address we calculated above.  */
-      howto->pc_relative = TRUE;
+      howto->pc_relative = true;
       *relocation -= (input_section->output_section->vma
                      + input_section->output_offset
                      + section_offset);
     }
-  return TRUE;
+  return true;
 }
 
-bfd_boolean
+bool
 xcoff_reloc_type_crel (bfd *input_bfd ATTRIBUTE_UNUSED,
                       asection *input_section,
                       bfd *output_bfd ATTRIBUTE_UNUSED,
@@ -3197,9 +3284,10 @@ xcoff_reloc_type_crel (bfd *input_bfd ATTRIBUTE_UNUSED,
                       bfd_vma val ATTRIBUTE_UNUSED,
                       bfd_vma addend,
                       bfd_vma *relocation,
-                      bfd_byte *contents ATTRIBUTE_UNUSED)
+                      bfd_byte *contents ATTRIBUTE_UNUSED,
+                      struct bfd_link_info *info ATTRIBUTE_UNUSED)
 {
-  howto->pc_relative = TRUE;
+  howto->pc_relative = true;
   howto->src_mask &= ~3;
   howto->dst_mask = howto->src_mask;
 
@@ -3209,10 +3297,10 @@ xcoff_reloc_type_crel (bfd *input_bfd ATTRIBUTE_UNUSED,
   *relocation = val + addend;
   *relocation -= (input_section->output_section->vma
                  + input_section->output_offset);
-  return TRUE;
+  return true;
 }
 
-bfd_boolean
+bool
 xcoff_reloc_type_tls (bfd *input_bfd ATTRIBUTE_UNUSED,
                      asection *input_section ATTRIBUTE_UNUSED,
                      bfd *output_bfd ATTRIBUTE_UNUSED,
@@ -3222,43 +3310,37 @@ xcoff_reloc_type_tls (bfd *input_bfd ATTRIBUTE_UNUSED,
                      bfd_vma val,
                      bfd_vma addend,
                      bfd_vma *relocation,
-                     bfd_byte *contents ATTRIBUTE_UNUSED)
+                     bfd_byte *contents ATTRIBUTE_UNUSED,
+                     struct bfd_link_info *info ATTRIBUTE_UNUSED)
 {
   struct xcoff_link_hash_entry *h;
 
   if (0 > rel->r_symndx)
-    return FALSE;
+    return false;
 
   h = obj_xcoff_sym_hashes (input_bfd)[rel->r_symndx];
 
-  /* FIXME: R_TLSML is targeting a internal TOC symbol, which will
-     make the following checks failing. It should be moved with
-     R_TLSM bellow once it works.  */
+  /* R_TLSML is handled by the loader but must be from a
+     TOC entry targeting itslef.  This is already verified in
+     xcoff_link_add_symbols.
+     The value must be 0.  */
   if (howto->type == R_TLSML)
     {
       *relocation = 0;
-      return TRUE;
-    }
-
-  /* FIXME: h is sometimes null, if the TLS symbol is not exported.  */
-  if (!h)
-    {
-      _bfd_error_handler
-       (_("%pB: TLS relocation at (0x%" BFD_VMA_FMT "x) over "
-          "internal symbols (C_HIDEXT) not yet possible\n"),
-        input_bfd, rel->r_vaddr);
-      return FALSE;
+      return true;
     }
 
+  /* The target symbol should always be available even if it's not
+     exported.  */
+  BFD_ASSERT (h != NULL);
 
   /* TLS relocations must target a TLS symbol.  */
   if (h->smclas != XMC_TL && h->smclas != XMC_UL)
     {
       _bfd_error_handler
-       (_("%pB: TLS relocation at (0x%" BFD_VMA_FMT "x) over "
-          "non-TLS symbol %s (0x%x)\n"),
-        input_bfd, rel->r_vaddr, h->root.root.string, h->smclas);
-      return FALSE;
+       (_("%pB: TLS relocation at 0x%" PRIx64 " over non-TLS symbol %s (0x%x)\n"),
+        input_bfd, (uint64_t) rel->r_vaddr, h->root.root.string, h->smclas);
+      return false;
     }
 
   /* Local TLS relocations must target a local symbol, ie
@@ -3269,19 +3351,17 @@ xcoff_reloc_type_tls (bfd *input_bfd ATTRIBUTE_UNUSED,
          || (h->flags & XCOFF_IMPORT) != 0))
     {
       _bfd_error_handler
-       (_("%pB: TLS local relocation at (0x%" BFD_VMA_FMT "x) over "
-          "imported symbol %s\n"),
-        input_bfd, rel->r_vaddr, h->root.root.string);
-      return FALSE;
+       (_("%pB: TLS local relocation at 0x%" PRIx64 " over imported symbol %s\n"),
+        input_bfd, (uint64_t) rel->r_vaddr, h->root.root.string);
+      return false;
     }
 
-  /* R_TLSM and R_TLSML are relocations used by the loader.
-     The value must be 0.
-     FIXME: move R_TLSML here.  */
+  /* R_TLSM are relocations used by the loader.
+     The value must be 0.  */
   if (howto->type == R_TLSM)
     {
       *relocation = 0;
-      return TRUE;
+      return true;
     }
 
   /* Other TLS relocations aims to put offsets from TLS pointers
@@ -3291,20 +3371,20 @@ xcoff_reloc_type_tls (bfd *input_bfd ATTRIBUTE_UNUSED,
      TODO: implement optimization when tls size is < 62K.  */
   *relocation = val + addend;
 
-  return TRUE;
+  return true;
 }
 
-static bfd_boolean
+static bool
 xcoff_complain_overflow_dont_func (bfd *input_bfd ATTRIBUTE_UNUSED,
                                   bfd_vma val ATTRIBUTE_UNUSED,
                                   bfd_vma relocation ATTRIBUTE_UNUSED,
                                   struct reloc_howto_struct *
                                      howto ATTRIBUTE_UNUSED)
 {
-  return FALSE;
+  return false;
 }
 
-static bfd_boolean
+static bool
 xcoff_complain_overflow_bitfield_func (bfd *input_bfd,
                                       bfd_vma val,
                                       bfd_vma relocation,
@@ -3350,7 +3430,7 @@ xcoff_complain_overflow_bitfield_func (bfd *input_bfd,
         ones, we are OK, assuming a signed bitfield.  */
       ss = (signmask << howto->rightshift) - 1;
       if ((ss | relocation) != ~ (bfd_vma) 0)
-       return TRUE;
+       return true;
       a &= fieldmask;
     }
 
@@ -3363,7 +3443,7 @@ xcoff_complain_overflow_bitfield_func (bfd *input_bfd,
      away from the location at which it is linked.  */
   if ((unsigned) howto->bitsize + howto->rightshift
       == bfd_arch_bits_per_address (input_bfd))
-    return FALSE;
+    return false;
 
   sum = a + b;
   if (sum < a || (sum & ~ fieldmask) != 0)
@@ -3372,13 +3452,13 @@ xcoff_complain_overflow_bitfield_func (bfd *input_bfd,
         for signed operands again.  Here is the overflow test
         is as for complain_overflow_signed.  */
       if (((~ (a ^ b)) & (a ^ sum)) & signmask)
-       return TRUE;
+       return true;
     }
 
-  return FALSE;
+  return false;
 }
 
-static bfd_boolean
+static bool
 xcoff_complain_overflow_signed_func (bfd *input_bfd,
                                     bfd_vma val,
                                     bfd_vma relocation,
@@ -3404,7 +3484,7 @@ xcoff_complain_overflow_signed_func (bfd *input_bfd,
   signmask = ~ (fieldmask >> 1);
   ss = a & signmask;
   if (ss != 0 && ss != ((addrmask >> howto->rightshift) & signmask))
-    return TRUE;
+    return true;
 
   /* We only need this next bit of code if the sign bit of B
      is below the sign bit of A.  This would only happen if
@@ -3434,12 +3514,12 @@ xcoff_complain_overflow_signed_func (bfd *input_bfd,
   */
   signmask = (fieldmask >> 1) + 1;
   if (((~ (a ^ b)) & (a ^ sum)) & signmask)
-    return TRUE;
+    return true;
 
-  return FALSE;
+  return false;
 }
 
-static bfd_boolean
+static bool
 xcoff_complain_overflow_unsigned_func (bfd *input_bfd,
                                       bfd_vma val,
                                       bfd_vma relocation,
@@ -3472,9 +3552,9 @@ xcoff_complain_overflow_unsigned_func (bfd *input_bfd,
   b = (b & addrmask) >> howto->bitpos;
   sum = (a + b) & addrmask;
   if ((a | b | sum) & ~ fieldmask)
-    return TRUE;
+    return true;
 
-  return FALSE;
+  return false;
 }
 
 /* This is the relocation function for the RS/6000/POWER/PowerPC.
@@ -3610,10 +3690,10 @@ xcoff_complain_overflow_unsigned_func (bfd *input_bfd,
    R_TLS_LE:
    Thread-local storage relocation using local-exec model.
 
-   R_TLS:
+   R_TLSM:
    Tread-local storage relocation used by the loader.
 
-   R_TLSM:
+   R_TLSML:
    Tread-local storage relocation used by the loader.
 
    R_TOCU:
@@ -3625,7 +3705,7 @@ xcoff_complain_overflow_unsigned_func (bfd *input_bfd,
    low-order 16 bit of a TOC relative relocation.
 */
 
-bfd_boolean
+bool
 xcoff_ppc_relocate_section (bfd *output_bfd,
                            struct bfd_link_info *info,
                            bfd *input_bfd,
@@ -3671,16 +3751,15 @@ xcoff_ppc_relocate_section (bfd *output_bfd,
            case R_POS:
            case R_NEG:
              howto.bitsize = (rel->r_size & 0x1f) + 1;
-             howto.size = howto.bitsize > 16 ? 2 : 1;
+             howto.size = HOWTO_RSIZE (howto.bitsize > 16 ? 4 : 2);
              howto.src_mask = howto.dst_mask = N_ONES (howto.bitsize);
              break;
 
            default:
              _bfd_error_handler
-               (_("%pB: relocatation (%d) at (0x%" BFD_VMA_FMT "x) has wrong"
-                  " r_rsize (0x%x)\n"),
-                input_bfd, rel->r_type, rel->r_vaddr, rel->r_size);
-             return FALSE;
+               (_("%pB: relocation (%d) at 0x%" PRIx64 " has wrong r_rsize (0x%x)\n"),
+                input_bfd, rel->r_type, (uint64_t) rel->r_vaddr, rel->r_size);
+             return false;
            }
        }
 
@@ -3757,8 +3836,8 @@ xcoff_ppc_relocate_section (bfd *output_bfd,
       if (rel->r_type >= XCOFF_MAX_CALCULATE_RELOCATION
          || !((*xcoff_calculate_relocation[rel->r_type])
               (input_bfd, input_section, output_bfd, rel, sym, &howto, val,
-               addend, &relocation, contents)))
-       return FALSE;
+               addend, &relocation, contents, info)))
+       return false;
 
       /* address */
       address = rel->r_vaddr - input_section->vma;
@@ -3768,7 +3847,7 @@ xcoff_ppc_relocate_section (bfd *output_bfd,
        abort ();
 
       /* Get the value we are going to relocate.  */
-      if (1 == howto.size)
+      if (2 == bfd_get_reloc_size (&howto))
        value_to_relocate = bfd_get_16 (input_bfd, location);
       else
        value_to_relocate = bfd_get_32 (input_bfd, location);
@@ -3815,13 +3894,13 @@ xcoff_ppc_relocate_section (bfd *output_bfd,
                               + relocation) & howto.dst_mask));
 
       /* Put the value back in the object file.  */
-      if (1 == howto.size)
+      if (2 == bfd_get_reloc_size (&howto))
        bfd_put_16 (input_bfd, value_to_relocate, location);
       else
        bfd_put_32 (input_bfd, value_to_relocate, location);
     }
 
-  return TRUE;
+  return true;
 }
 
 /* gcc-8 warns (*) on all the strncpy calls in this function about
@@ -3841,7 +3920,7 @@ xcoff_ppc_relocate_section (bfd *output_bfd,
 # pragma GCC diagnostic push
 # pragma GCC diagnostic ignored "-Wstringop-truncation"
 #endif
-static bfd_boolean
+static bool
 _bfd_xcoff_put_ldsymbol_name (bfd *abfd ATTRIBUTE_UNUSED,
                              struct xcoff_loader_info *ldinfo,
                              struct internal_ldsym *ldsym,
@@ -3868,25 +3947,25 @@ _bfd_xcoff_put_ldsymbol_name (bfd *abfd ATTRIBUTE_UNUSED,
          newstrings = bfd_realloc (ldinfo->strings, newalc);
          if (newstrings == NULL)
            {
-             ldinfo->failed = TRUE;
-             return FALSE;
+             ldinfo->failed = true;
+             return false;
            }
          ldinfo->string_alc = newalc;
          ldinfo->strings = newstrings;
        }
 
-      bfd_put_16 (ldinfo->output_bfd, (bfd_vma) (len + 1),
-                 ldinfo->strings + ldinfo->string_size);
+      ldinfo->strings[ldinfo->string_size] = ((len + 1) >> 8) & 0xff;
+      ldinfo->strings[ldinfo->string_size + 1] = ((len + 1)) & 0xff;
       strcpy (ldinfo->strings + ldinfo->string_size + 2, name);
       ldsym->_l._l_l._l_zeroes = 0;
       ldsym->_l._l_l._l_offset = ldinfo->string_size + 2;
       ldinfo->string_size += len + 3;
     }
 
-  return TRUE;
+  return true;
 }
 
-static bfd_boolean
+static bool
 _bfd_xcoff_put_symbol_name (struct bfd_link_info *info,
                            struct bfd_strtab_hash *strtab,
                            struct internal_syment *sym,
@@ -3898,17 +3977,17 @@ _bfd_xcoff_put_symbol_name (struct bfd_link_info *info,
     }
   else
     {
-      bfd_boolean hash;
+      bool hash;
       bfd_size_type indx;
 
       hash = !info->traditional_format;
-      indx = _bfd_stringtab_add (strtab, name, hash, FALSE);
+      indx = _bfd_stringtab_add (strtab, name, hash, false);
       if (indx == (bfd_size_type) -1)
-       return FALSE;
+       return false;
       sym->_n._n_n._n_zeroes = 0;
       sym->_n._n_n._n_offset = STRING_SIZE_SIZE + indx;
     }
-  return TRUE;
+  return true;
 }
 #if GCC_VERSION >= 8000
 # pragma GCC diagnostic pop
@@ -3948,22 +4027,22 @@ xcoff_create_csect_from_smclas (bfd *abfd,
   return return_value;
 }
 
-static bfd_boolean
+static bool
 xcoff_is_lineno_count_overflow (bfd *abfd ATTRIBUTE_UNUSED, bfd_vma value)
 {
   if (0xffff <= value)
-    return TRUE;
+    return true;
 
-  return FALSE;
+  return false;
 }
 
-static bfd_boolean
+static bool
 xcoff_is_reloc_count_overflow (bfd *abfd ATTRIBUTE_UNUSED, bfd_vma value)
 {
   if (0xffff <= value)
-    return TRUE;
+    return true;
 
-  return FALSE;
+  return false;
 }
 
 static bfd_vma
@@ -3979,9 +4058,9 @@ xcoff_loader_reloc_offset (bfd *abfd, struct internal_ldhdr *ldhdr)
   return bfd_xcoff_ldhdrsz (abfd) + ldhdr->l_nsyms * bfd_xcoff_ldsymsz (abfd);
 }
 
-static bfd_boolean
+static bool
 xcoff_generate_rtinit  (bfd *abfd, const char *init, const char *fini,
-                       bfd_boolean rtld)
+                       bool rtld)
 {
   bfd_byte filehdr_ext[FILHSZ];
   bfd_byte scnhdr_ext[SCNHSZ];
@@ -4004,7 +4083,7 @@ xcoff_generate_rtinit  (bfd *abfd, const char *init, const char *fini,
   char *rtld_name = "__rtld";
 
   if (! bfd_xcoff_rtinit_size (abfd))
-    return FALSE;
+    return false;
 
   initsz = (init == NULL ? 0 : 1 + strlen (init));
   finisz = (fini == NULL ? 0 : 1 + strlen (fini));
@@ -4059,7 +4138,7 @@ xcoff_generate_rtinit  (bfd *abfd, const char *init, const char *fini,
   data_buffer = NULL;
   data_buffer = (bfd_byte *) bfd_zmalloc (data_buffer_size);
   if (data_buffer == NULL)
-    return FALSE;
+    return false;
 
   if (initsz)
     {
@@ -4095,7 +4174,7 @@ xcoff_generate_rtinit  (bfd *abfd, const char *init, const char *fini,
       string_table_size += 4;
       string_table = (bfd_byte *) bfd_zmalloc (string_table_size);
       if (string_table == NULL)
-       return FALSE;
+       return false;
 
       val = string_table_size;
       bfd_h_put_32 (abfd, val, &string_table[0]);
@@ -4118,7 +4197,7 @@ xcoff_generate_rtinit  (bfd *abfd, const char *init, const char *fini,
   syment.n_scnum = 1;
   syment.n_sclass = C_HIDEXT;
   syment.n_numaux = 1;
-  auxent.x_csect.x_scnlen.l = data_buffer_size;
+  auxent.x_csect.x_scnlen.u64 = data_buffer_size;
   auxent.x_csect.x_smtyp = 3 << 3 | XTY_SD;
   auxent.x_csect.x_smclas = XMC_RW;
   bfd_coff_swap_sym_out (abfd, &syment,
@@ -4256,24 +4335,52 @@ xcoff_generate_rtinit  (bfd *abfd, const char *init, const char *fini,
   free (data_buffer);
   data_buffer = NULL;
 
-  return TRUE;
+  return true;
 }
 
 
 static reloc_howto_type xcoff_dynamic_reloc =
 HOWTO (0,                      /* type */
        0,                      /* rightshift */
-       2,                      /* size (0 = byte, 1 = short, 2 = long) */
+       4,                      /* size */
        32,                     /* bitsize */
-       FALSE,                  /* pc_relative */
+       false,                  /* pc_relative */
        0,                      /* bitpos */
        complain_overflow_bitfield, /* complain_on_overflow */
        0,                      /* special_function */
        "R_POS",                        /* name */
-       TRUE,                   /* partial_inplace */
+       true,                   /* partial_inplace */
        0xffffffff,             /* src_mask */
        0xffffffff,             /* dst_mask */
-       FALSE);                 /* pcrel_offset */
+       false);                 /* pcrel_offset */
+
+/* Indirect call stub
+   The first word of the code must be modified by filling in
+   the correct TOC offset.  */
+
+static const unsigned long xcoff_stub_indirect_call_code[4] =
+  {
+    0x81820000,        /* lwz r12,0(r2) */
+    0x800c0000,        /* lwz r0,0(r12) */
+    0x7c0903a6,        /* mtctr r0 */
+    0x4e800420,        /* bctr */
+  };
+
+/*  Shared call stub
+    The first word of the code must be modified by filling in
+    the correct TOC offset.
+    This is exactly as the glink code but without the traceback,
+    as it won't be an independent function.  */
+
+static const unsigned long xcoff_stub_shared_call_code[6] =
+  {
+    0x81820000,        /* lwz r12,0(r2) */
+    0x90410014,        /* stw r2,20(r1) */
+    0x800c0000,        /* lwz r0,0(r12) */
+    0x804c0004,        /* lwz r2,4(r12) */
+    0x7c0903a6,        /* mtctr r0 */
+    0x4e800420,        /* bctr */
+  };
 
 /*  glink
 
@@ -4293,21 +4400,26 @@ static const unsigned long xcoff_glink_code[9] =
     0x00000000,        /* traceback table */
   };
 
-/* Table to convert DWARF flags to section names.  */
+/* Table to convert DWARF flags to section names.
+   Remember to update binutils/dwarf.c:debug_displays
+   if new DWARF sections are supported by XCOFF.  */
 
 const struct xcoff_dwsect_name xcoff_dwsect_names[] = {
-  { SSUBTYP_DWINFO,  ".dwinfo",   TRUE },
-  { SSUBTYP_DWLINE,  ".dwline",   TRUE },
-  { SSUBTYP_DWPBNMS, ".dwpbnms",  TRUE },
-  { SSUBTYP_DWPBTYP, ".dwpbtyp",  TRUE },
-  { SSUBTYP_DWARNGE, ".dwarnge",  TRUE },
-  { SSUBTYP_DWABREV, ".dwabrev",  FALSE },
-  { SSUBTYP_DWSTR,   ".dwstr",    TRUE },
-  { SSUBTYP_DWRNGES, ".dwrnges",  TRUE }
+  { SSUBTYP_DWINFO,  ".dwinfo",  ".debug_info",     true },
+  { SSUBTYP_DWLINE,  ".dwline",  ".debug_line",     true },
+  { SSUBTYP_DWPBNMS, ".dwpbnms", ".debug_pubnames", true },
+  { SSUBTYP_DWPBTYP, ".dwpbtyp", ".debug_pubtypes", true },
+  { SSUBTYP_DWARNGE, ".dwarnge", ".debug_aranges",  true },
+  { SSUBTYP_DWABREV, ".dwabrev", ".debug_abbrev",   false },
+  { SSUBTYP_DWSTR,   ".dwstr",   ".debug_str",      true },
+  { SSUBTYP_DWRNGES, ".dwrnges", ".debug_ranges",   true },
+  { SSUBTYP_DWLOC,   ".dwloc",   ".debug_loc",      true },
+  { SSUBTYP_DWFRAME, ".dwframe", ".debug_frame",    true },
+  { SSUBTYP_DWMAC,   ".dwmac",   ".debug_macro",    true }
 };
 
 /* For generic entry points.  */
-#define _bfd_xcoff_close_and_cleanup _bfd_archive_close_and_cleanup
+#define _bfd_xcoff_close_and_cleanup _bfd_coff_close_and_cleanup
 #define _bfd_xcoff_bfd_free_cached_info _bfd_bool_bfd_true
 #define _bfd_xcoff_new_section_hook coff_new_section_hook
 #define _bfd_xcoff_get_section_contents _bfd_generic_get_section_contents
@@ -4354,6 +4466,8 @@ const struct xcoff_dwsect_name xcoff_dwsect_names[] = {
   coff_bfd_is_target_special_symbol
 #define _bfd_xcoff_get_lineno coff_get_lineno
 #define _bfd_xcoff_find_nearest_line coff_find_nearest_line
+#define _bfd_xcoff_find_nearest_line_with_alt \
+coff_find_nearest_line_with_alt
 #define _bfd_xcoff_find_line coff_find_line
 #define _bfd_xcoff_find_inliner_info coff_find_inliner_info
 #define _bfd_xcoff_bfd_make_debug_symbol coff_bfd_make_debug_symbol
@@ -4412,10 +4526,10 @@ static const struct xcoff_backend_data_rec bfd_xcoff_backend_data =
       RELSZ,
       LINESZ,
       FILNMLEN,
-      TRUE,                    /* _bfd_coff_long_filenames */
+      true,                    /* _bfd_coff_long_filenames */
       XCOFF_NO_LONG_SECTION_NAMES,  /* _bfd_coff_long_section_names */
       3,                       /* _bfd_coff_default_section_alignment_power */
-      FALSE,                   /* _bfd_coff_force_symnames_in_strings */
+      false,                   /* _bfd_coff_force_symnames_in_strings */
       2,                       /* _bfd_coff_debug_string_prefix_length */
       32768,                   /* _bfd_coff_max_nscns */
       coff_swap_filehdr_in,
@@ -4486,6 +4600,14 @@ static const struct xcoff_backend_data_rec bfd_xcoff_backend_data =
     /* rtinit */
     64,                                /* _xcoff_rtinit_size */
     xcoff_generate_rtinit,
+
+    /* Stub indirect call.  */
+    &xcoff_stub_indirect_call_code[0],
+    16,                                /* _xcoff_stub_indirect_call_size */
+
+    /* Stub shared call.  */
+    &xcoff_stub_shared_call_code[0],
+    24,                                /* _xcoff_stub_shared_call_size */
   };
 
 /* The transfer vector that leads the outside world to all of the above.  */
@@ -4594,10 +4716,10 @@ static const struct xcoff_backend_data_rec bfd_pmac_xcoff_backend_data =
       RELSZ,
       LINESZ,
       FILNMLEN,
-      TRUE,                    /* _bfd_coff_long_filenames */
+      true,                    /* _bfd_coff_long_filenames */
       XCOFF_NO_LONG_SECTION_NAMES,  /* _bfd_coff_long_section_names */
       3,                       /* _bfd_coff_default_section_alignment_power */
-      FALSE,                   /* _bfd_coff_force_symnames_in_strings */
+      false,                   /* _bfd_coff_force_symnames_in_strings */
       2,                       /* _bfd_coff_debug_string_prefix_length */
       32768,                   /* _bfd_coff_max_nscns */
       coff_swap_filehdr_in,
@@ -4668,6 +4790,14 @@ static const struct xcoff_backend_data_rec bfd_pmac_xcoff_backend_data =
     /* rtinit */
     0,                         /* _xcoff_rtinit_size */
     xcoff_generate_rtinit,
+
+    /* Stub indirect call.  */
+    &xcoff_stub_indirect_call_code[0],
+    16,                                /* _xcoff_stub_indirect_call_size */
+
+    /* Stub shared call.  */
+    &xcoff_stub_shared_call_code[0],
+    24,                                /* _xcoff_stub_shared_call_size */
   };
 
 /* The transfer vector that leads the outside world to all of the above.  */