* Makefile.am: Run "make dep-am".
[deliverable/binutils-gdb.git] / bfd / coff-ppc.c
index efc37767b22ff20287ba1b4ee46f4620f43b8b07..f2bdfe57a905708ad227f7e0e804d92a9c7bfc2f 100644 (file)
@@ -1,10 +1,12 @@
 /* BFD back-end for PowerPC Microsoft Portable Executable files.
-   Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
+   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+   2000, 2001
+   Free Software Foundation, Inc.
 
    Original version pieced together by Kim Knuttila (krk@cygnus.com)
 
    There is nothing new under the sun. This file draws a lot on other
-   coff files, in particular, those for the rs/6000, alpha, mips, and 
+   coff files, in particular, those for the rs/6000, alpha, mips, and
    intel backends, and the PE work for the arm.
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -21,22 +23,21 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 /* Current State:
    - objdump works
    - relocs generated by gas
    - ld will link files, but they do not run.
-   - dlltool will not produce correct output in some .reloc cases, and will 
+   - dlltool will not produce correct output in some .reloc cases, and will
      not produce the right glue code for dll function calls.
 */
 
-
 #include "bfd.h"
 #include "sysdep.h"
 
 #include "libbfd.h"
-#include "obstack.h"
 
 #include "coff/powerpc.h"
 #include "coff/internal.h"
@@ -51,6 +52,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include "libcoff.h"
 
+/* This file is compiled more than once, but we only compile the
+   final_link routine once.  */
+extern boolean ppc_bfd_coff_final_link
+  PARAMS ((bfd *, struct bfd_link_info *));
+extern void dump_toc PARAMS ((PTR));
+
 /* The toc is a set of bfd_vma fields. We use the fact that valid         */
 /* addresses are even (i.e. the bit representing "1" is off) to allow     */
 /* us to encode a little extra information in the field                   */
@@ -68,10 +75,35 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define MARK_AS_WRITTEN(x)  ((x) |= 1)
 #define MAKE_ADDR_AGAIN(x)  ((x) &= ~1)
 
+/* Turn on this check if you suspect something amiss in the hash tables */
+#ifdef DEBUG_HASH
+
+/* Need a 7 char string for an eye catcher */
+#define EYE "krkjunk"
+
+#define HASH_CHECK_DCL char eye_catcher[8];
+#define HASH_CHECK_INIT(ret)      strcpy(ret->eye_catcher, EYE)
+#define HASH_CHECK(addr) \
+ if (strcmp(addr->eye_catcher, EYE) != 0) \
+  { \
+    fprintf (stderr,\
+    _("File %s, line %d, Hash check failure, bad eye %8s\n"), \
+    __FILE__, __LINE__, addr->eye_catcher); \
+    abort (); \
+ }
+
+#else
+
+#define HASH_CHECK_DCL
+#define HASH_CHECK_INIT(ret)
+#define HASH_CHECK(addr)
+
+#endif
+
 /* In order not to add an int to every hash table item for every coff
    linker, we define our own hash table, derived from the coff one */
 
-/* PE linker hash table entries. */
+/* PE linker hash table entries.  */
 
 struct ppc_coff_link_hash_entry
 {
@@ -82,20 +114,9 @@ struct ppc_coff_link_hash_entry
   bfd_vma toc_offset;               /* Our addition, as required */
   int symbol_is_glue;
   unsigned long int glue_insn;
-  char eye_catcher[8];
-};
-
-/* Need a 7 char string for an eye catcher */
-#define EYE "krkjunk"
 
-#define CHECK_EYE(addr) \
- if (strcmp(addr, EYE) != 0) \
-  { \
-    fprintf(stderr,\
-    "File %s, line %d, Hash check failure, bad eye %8s\n", \
-    __FILE__, __LINE__, addr); \
-    abort(); \
- }
+  HASH_CHECK_DCL
+};
 
 /* PE linker hash table.  */
 
@@ -107,6 +128,20 @@ struct ppc_coff_link_hash_table
 static struct bfd_hash_entry *ppc_coff_link_hash_newfunc
   PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *,
           const char *));
+static boolean ppc_coff_link_hash_table_init
+  PARAMS ((struct ppc_coff_link_hash_table *, bfd *,
+          struct bfd_hash_entry *(*) (struct bfd_hash_entry *,
+                                      struct bfd_hash_table *,
+                                      const char *)));
+static struct bfd_link_hash_table *ppc_coff_link_hash_table_create
+  PARAMS ((bfd *));
+static boolean coff_ppc_relocate_section
+  PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
+          struct internal_reloc *, struct internal_syment *, asection **));
+static reloc_howto_type *coff_ppc_rtype_to_howto
+  PARAMS ((bfd *, asection *, struct internal_reloc *,
+          struct coff_link_hash_entry *, struct internal_syment *,
+          bfd_vma *));
 
 /* Routine to create an entry in the link hash table.  */
 
@@ -116,14 +151,14 @@ ppc_coff_link_hash_newfunc (entry, table, string)
      struct bfd_hash_table *table;
      const char *string;
 {
-  struct ppc_coff_link_hash_entry *ret = 
+  struct ppc_coff_link_hash_entry *ret =
     (struct ppc_coff_link_hash_entry *) entry;
 
   /* Allocate the structure if it has not already been allocated by a
      subclass.  */
   if (ret == (struct ppc_coff_link_hash_entry *) NULL)
     ret = (struct ppc_coff_link_hash_entry *)
-      bfd_hash_allocate (table, 
+      bfd_hash_allocate (table,
                         sizeof (struct ppc_coff_link_hash_entry));
 
   if (ret == (struct ppc_coff_link_hash_entry *) NULL)
@@ -131,7 +166,7 @@ ppc_coff_link_hash_newfunc (entry, table, string)
 
   /* Call the allocation method of the superclass.  */
   ret = ((struct ppc_coff_link_hash_entry *)
-        _bfd_coff_link_hash_newfunc ((struct bfd_hash_entry *) ret, 
+        _bfd_coff_link_hash_newfunc ((struct bfd_hash_entry *) ret,
                                      table, string));
 
   if (ret)
@@ -140,7 +175,8 @@ ppc_coff_link_hash_newfunc (entry, table, string)
       SET_UNALLOCATED(ret->toc_offset);
       ret->symbol_is_glue = 0;
       ret->glue_insn = 0;
-      strcpy(ret->eye_catcher, EYE);
+
+      HASH_CHECK_INIT(ret);
     }
 
   return (struct bfd_hash_entry *) ret;
@@ -166,9 +202,9 @@ ppc_coff_link_hash_table_create (abfd)
      bfd *abfd;
 {
   struct ppc_coff_link_hash_table *ret;
+  bfd_size_type amt = sizeof (struct ppc_coff_link_hash_table);
 
-  ret = ((struct ppc_coff_link_hash_table *)
-        bfd_alloc (abfd, sizeof (struct ppc_coff_link_hash_table)));
+  ret = (struct ppc_coff_link_hash_table *) bfd_alloc (abfd, amt);
   if (ret == NULL)
     return NULL;
   if (! ppc_coff_link_hash_table_init (ret, abfd,
@@ -183,11 +219,10 @@ ppc_coff_link_hash_table_create (abfd)
 /* Now, tailor coffcode.h to use our hash stuff */
 
 #define coff_bfd_link_hash_table_create ppc_coff_link_hash_table_create
-
 \f
 /* The nt loader points the toc register to &toc + 32768, in order to */
-/* use the complete range of a 16-bit displacement (I guess). We have */
-/* to adjust for this when we fix up loads displaced off the toc reg. */
+/* use the complete range of a 16-bit displacement. We have to adjust */
+/* for this when we fix up loads displaced off the toc reg.           */
 #define TOC_LOAD_ADJUSTMENT (-32768)
 #define TOC_SECTION_NAME ".private.toc"
 
@@ -199,7 +234,7 @@ ppc_coff_link_hash_table_create (abfd)
    from smaller values.  Start with zero, widen, *then* decrement.  */
 #define MINUS_ONE      (((bfd_vma)0) - 1)
 
-/* these should definitely go in a header file somewhere... */
+/* these should definitely go in a header file somewhere...  */
 
 /* NOP */
 #define IMAGE_REL_PPC_ABSOLUTE          0x0000
@@ -281,7 +316,6 @@ ppc_coff_link_hash_table_create (abfd)
 #define EXTRACT_FLAGS(x) ((x) & IMAGE_REL_PPC_FLAGMASK)
 #define EXTRACT_JUNK(x)  \
            ((x) & ~(IMAGE_REL_PPC_TYPEMASK | IMAGE_REL_PPC_FLAGMASK))
-
 \f
 /* static helper functions to make relocation work */
 /* (Work In Progress) */
@@ -309,7 +343,6 @@ static bfd_reloc_status_type ppc_pair_reloc PARAMS ((bfd *abfd,
                                                     asection *section,
                                                     bfd *output_bfd,
                                                     char **error));
-
 \f
 static bfd_reloc_status_type ppc_toc16_reloc PARAMS ((bfd *abfd,
                                                      arelent *reloc,
@@ -352,10 +385,7 @@ static bfd_reloc_status_type ppc_imglue_reloc PARAMS ((bfd *abfd,
                                                       bfd *output_bfd,
                                                       char **error));
 
-
-
 static boolean in_reloc_p PARAMS((bfd *abfd, reloc_howto_type *howto));
-
 \f
 /* FIXME: It'll take a while to get through all of these. I only need a few to
    get us started, so those I'll make sure work. Those marked FIXME are either
@@ -379,7 +409,7 @@ static boolean in_reloc_p PARAMS((bfd *abfd, reloc_howto_type *howto));
 /*                    the address of the SYM will be inserted at link time.  */
 /*   TOCREL16       : 16 bit displacement field referring to a slot in       */
 /*                    toc.                                                   */
-/*   TOCREL14       : 16 bit displacement field, similar to REL14 or ADDR14. */
+/*   TOCREL14       : 16 bit displacement field, similar to REL14 or ADDR14.  */
 /*   ADDR32NB       : 32 bit address relative to the virtual origin.         */
 /*                    (On the alpha, this is always a linker generated thunk)*/
 /*                    (i.e. 32bit addr relative to the image base)           */
@@ -399,32 +429,32 @@ static reloc_howto_type ppc_coff_howto_table[] =
 {
   /* IMAGE_REL_PPC_ABSOLUTE 0x0000   NOP */
   /* Unused: */
-  HOWTO (IMAGE_REL_PPC_ABSOLUTE, /* type */                                 
-        0,                      /* rightshift */                           
-        0,                      /* size (0 = byte, 1 = short, 2 = long) */ 
-        0,                      /* bitsize */                   
-        false,                  /* pc_relative */                          
-        0,                      /* bitpos */                               
+  HOWTO (IMAGE_REL_PPC_ABSOLUTE, /* type */
+        0,                      /* rightshift */
+        0,                      /* size (0 = byte, 1 = short, 2 = long) */
+        0,                      /* bitsize */
+        false,                  /* pc_relative */
+        0,                      /* bitpos */
         complain_overflow_dont, /* dont complain_on_overflow */
-        0,                      /* special_function */                     
+        0,                      /* special_function */
         "ABSOLUTE",             /* name */
-        false,                  /* partial_inplace */                      
-        0x00,                   /* src_mask */                             
-        0x00,                   /* dst_mask */                             
+        false,                  /* partial_inplace */
+        0x00,                   /* src_mask */
+        0x00,                   /* dst_mask */
         false),                 /* pcrel_offset */
-  
+
   /* IMAGE_REL_PPC_ADDR64 0x0001  64-bit address */
   /* Unused: */
-  HOWTO(IMAGE_REL_PPC_ADDR64,    /* type */                                 
-       0,                       /* rightshift */                           
-       3,                       /* size (0 = byte, 1 = short, 2 = long) */ 
-       64,                      /* bitsize */                   
-       false,                   /* pc_relative */                          
-       0,                       /* bitpos */                               
+  HOWTO(IMAGE_REL_PPC_ADDR64,    /* type */
+       0,                       /* rightshift */
+       3,                       /* size (0 = byte, 1 = short, 2 = long) */
+       64,                      /* bitsize */
+       false,                   /* pc_relative */
+       0,                       /* bitpos */
        complain_overflow_bitfield,      /* complain_on_overflow */
-       0,                       /* special_function */                     
+       0,                       /* special_function */
        "ADDR64",               /* name */
-       true,                    /* partial_inplace */                      
+       true,                    /* partial_inplace */
        MINUS_ONE,               /* src_mask */
        MINUS_ONE,               /* dst_mask */
        false),                 /* pcrel_offset */
@@ -432,314 +462,311 @@ static reloc_howto_type ppc_coff_howto_table[] =
   /* IMAGE_REL_PPC_ADDR32 0x0002  32-bit address */
   /* Used: */
   HOWTO (IMAGE_REL_PPC_ADDR32, /* type */
-        0,                     /* rightshift */                           
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        32,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
-        0,                     /* special_function */                     
+        0,                     /* special_function */
         "ADDR32",              /* name */
-        true,                  /* partial_inplace */                      
-        0xffffffff,            /* src_mask */                             
-        0xffffffff,            /* dst_mask */                             
+        true,                  /* partial_inplace */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
         false),                /* pcrel_offset */
-  
+
   /* IMAGE_REL_PPC_ADDR24 0x0003  26-bit address, shifted left 2 (branch absolute) */
   /* the LI field is in bit 6 through bit 29 is 24 bits, + 2 for the shift */
   /* Of course, That's the IBM approved bit numbering, which is not what */
-  /* anyone else uses.... The li field is in bit 2 thru 25 */ 
+  /* anyone else uses.... The li field is in bit 2 thru 25 */
   /* Used: */
   HOWTO (IMAGE_REL_PPC_ADDR24,  /* type */
-        0,                     /* rightshift */                           
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */ 
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
         26,                    /* bitsize */
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
-        0,                     /* special_function */                     
+        0,                     /* special_function */
         "ADDR24",              /* name */
-        true,                  /* partial_inplace */                      
-        0x07fffffc,            /* src_mask */                             
-        0x07fffffc,            /* dst_mask */                             
+        true,                  /* partial_inplace */
+        0x07fffffc,            /* src_mask */
+        0x07fffffc,            /* dst_mask */
         false),                /* pcrel_offset */
-  
+
   /* IMAGE_REL_PPC_ADDR16 0x0004  16-bit address */
   /* Used: */
-  HOWTO (IMAGE_REL_PPC_ADDR16,  /* type */             
-        0,                     /* rightshift */                           
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        16,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+  HOWTO (IMAGE_REL_PPC_ADDR16,  /* type */
+        0,                     /* rightshift */
+        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
-        0,                     /* special_function */                     
+        0,                     /* special_function */
         "ADDR16",              /* name */
-        true,                  /* partial_inplace */                      
-        0xffff,                /* src_mask */                             
-        0xffff,                /* dst_mask */                             
+        true,                  /* partial_inplace */
+        0xffff,                /* src_mask */
+        0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
-  
+
   /* IMAGE_REL_PPC_ADDR14 0x0005 */
   /*  16-bit address, shifted left 2 (load doubleword) */
   /* FIXME: the mask is likely wrong, and the bit position may be as well */
   /* Unused: */
-  HOWTO (IMAGE_REL_PPC_ADDR14,  /* type */             
-        1,                     /* rightshift */                           
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        16,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+  HOWTO (IMAGE_REL_PPC_ADDR14,  /* type */
+        1,                     /* rightshift */
+        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
-        0,                     /* special_function */                     
+        0,                     /* special_function */
         "ADDR16",              /* name */
-        true,                  /* partial_inplace */                      
-        0xffff,                /* src_mask */                             
-        0xffff,                /* dst_mask */                             
+        true,                  /* partial_inplace */
+        0xffff,                /* src_mask */
+        0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
-  
+
   /* IMAGE_REL_PPC_REL24 0x0006 */
   /*   26-bit PC-relative offset, shifted left 2 (branch relative) */
   /* Used: */
   HOWTO (IMAGE_REL_PPC_REL24,   /* type */
-        0,                     /* rightshift */                           
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        26,                    /* bitsize */                   
-        true,                  /* pc_relative */                          
-        0,                     /* bitpos */                               
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        26,                    /* bitsize */
+        true,                  /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
-        0,                     /* special_function */                     
+        0,                     /* special_function */
         "REL24",               /* name */
-        true,                  /* partial_inplace */                      
-        0x3fffffc,             /* src_mask */                             
-        0x3fffffc,             /* dst_mask */                             
+        true,                  /* partial_inplace */
+        0x3fffffc,             /* src_mask */
+        0x3fffffc,             /* dst_mask */
         false),                /* pcrel_offset */
-  
+
   /* IMAGE_REL_PPC_REL14 0x0007 */
   /*   16-bit PC-relative offset, shifted left 2 (br cond relative) */
   /* FIXME: the mask is likely wrong, and the bit position may be as well */
   /* FIXME: how does it know how far to shift? */
   /* Unused: */
-  HOWTO (IMAGE_REL_PPC_ADDR14,  /* type */             
-        1,                     /* rightshift */                           
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        16,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+  HOWTO (IMAGE_REL_PPC_ADDR14,  /* type */
+        1,                     /* rightshift */
+        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
-        0,                     /* special_function */                     
+        0,                     /* special_function */
         "ADDR16",              /* name */
-        true,                  /* partial_inplace */                      
-        0xffff,                /* src_mask */                             
-        0xffff,                /* dst_mask */                             
+        true,                  /* partial_inplace */
+        0xffff,                /* src_mask */
+        0xffff,                /* dst_mask */
         true),                 /* pcrel_offset */
-  
+
   /* IMAGE_REL_PPC_TOCREL16 0x0008 */
   /*   16-bit offset from TOC base */
   /* Used: */
-  HOWTO (IMAGE_REL_PPC_TOCREL16,/* type */             
-        0,                     /* rightshift */                           
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        16,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+  HOWTO (IMAGE_REL_PPC_TOCREL16,/* type */
+        0,                     /* rightshift */
+        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
-        ppc_toc16_reloc,       /* special_function */                     
+        ppc_toc16_reloc,       /* special_function */
         "TOCREL16",            /* name */
-        false,                 /* partial_inplace */                      
-        0xffff,                /* src_mask */                             
-        0xffff,                /* dst_mask */                             
+        false,                 /* partial_inplace */
+        0xffff,                /* src_mask */
+        0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
-  
+
   /* IMAGE_REL_PPC_TOCREL14 0x0009 */
   /*   16-bit offset from TOC base, shifted left 2 (load doubleword) */
   /* Unused: */
-  HOWTO (IMAGE_REL_PPC_TOCREL14,/* type */             
-        1,                     /* rightshift */                           
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        16,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+  HOWTO (IMAGE_REL_PPC_TOCREL14,/* type */
+        1,                     /* rightshift */
+        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
-        0,                     /* special_function */                     
+        0,                     /* special_function */
         "TOCREL14",            /* name */
-        false,                 /* partial_inplace */                      
-        0xffff,                /* src_mask */                             
-        0xffff,                /* dst_mask */                             
+        false,                 /* partial_inplace */
+        0xffff,                /* src_mask */
+        0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
-  
+
   /* IMAGE_REL_PPC_ADDR32NB 0x000A */
   /*   32-bit addr w/ image base */
   /* Unused: */
-  HOWTO (IMAGE_REL_PPC_ADDR32NB,/* type */             
-        0,                     /* rightshift */                           
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        32,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+  HOWTO (IMAGE_REL_PPC_ADDR32NB,/* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
-        0,                     /* special_function */                     
+        0,                     /* special_function */
         "ADDR32NB",            /* name */
-        true,                  /* partial_inplace */                      
-        0xffffffff,            /* src_mask */                             
-        0xffffffff,            /* dst_mask */                             
+        true,                  /* partial_inplace */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
         false),                 /* pcrel_offset */
-  
+
   /* IMAGE_REL_PPC_SECREL 0x000B */
   /*   va of containing section (as in an image sectionhdr) */
   /* Unused: */
-  HOWTO (IMAGE_REL_PPC_SECREL,/* type */             
-        0,                     /* rightshift */                           
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        32,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+  HOWTO (IMAGE_REL_PPC_SECREL,/* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
-        ppc_secrel_reloc,      /* special_function */                     
+        ppc_secrel_reloc,      /* special_function */
         "SECREL",              /* name */
-        true,                  /* partial_inplace */                      
-        0xffffffff,            /* src_mask */                             
-        0xffffffff,            /* dst_mask */                             
+        true,                  /* partial_inplace */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
         true),                 /* pcrel_offset */
 
   /* IMAGE_REL_PPC_SECTION 0x000C */
   /*   sectionheader number */
   /* Unused: */
-  HOWTO (IMAGE_REL_PPC_SECTION,/* type */             
-        0,                     /* rightshift */                           
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        32,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+  HOWTO (IMAGE_REL_PPC_SECTION,/* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
-        ppc_section_reloc,     /* special_function */                     
+        ppc_section_reloc,     /* special_function */
         "SECTION",             /* name */
-        true,                  /* partial_inplace */                      
-        0xffffffff,            /* src_mask */                             
-        0xffffffff,            /* dst_mask */                             
+        true,                  /* partial_inplace */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
         true),                 /* pcrel_offset */
 
   /* IMAGE_REL_PPC_IFGLUE 0x000D */
   /*   substitute TOC restore instruction iff symbol is glue code */
   /* Used: */
-  HOWTO (IMAGE_REL_PPC_IFGLUE,/* type */             
-        0,                     /* rightshift */                           
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        32,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+  HOWTO (IMAGE_REL_PPC_IFGLUE,/* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
-        0,                     /* special_function */                     
+        0,                     /* special_function */
         "IFGLUE",              /* name */
-        true,                  /* partial_inplace */                      
-        0xffffffff,            /* src_mask */                             
-        0xffffffff,            /* dst_mask */                             
+        true,                  /* partial_inplace */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
         false),                /* pcrel_offset */
 
   /* IMAGE_REL_PPC_IMGLUE 0x000E */
   /*   symbol is glue code; virtual address is TOC restore instruction */
   /* Unused: */
-  HOWTO (IMAGE_REL_PPC_IMGLUE,/* type */             
-        0,                     /* rightshift */                           
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        32,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+  HOWTO (IMAGE_REL_PPC_IMGLUE,/* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
-        ppc_imglue_reloc,      /* special_function */                     
+        ppc_imglue_reloc,      /* special_function */
         "IMGLUE",              /* name */
-        false,                 /* partial_inplace */                      
-        0xffffffff,            /* src_mask */                             
-        0xffffffff,            /* dst_mask */                             
+        false,                 /* partial_inplace */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
         false),                 /* pcrel_offset */
 
   /* IMAGE_REL_PPC_SECREL16 0x000F */
   /*   va of containing section (limited to 16 bits) */
   /* Unused: */
-  HOWTO (IMAGE_REL_PPC_SECREL16,/* type */             
-        0,                     /* rightshift */                           
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        16,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+  HOWTO (IMAGE_REL_PPC_SECREL16,/* type */
+        0,                     /* rightshift */
+        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
-        0,                     /* special_function */                     
+        0,                     /* special_function */
         "SECREL16",            /* name */
-        true,                  /* partial_inplace */                      
-        0xffff,                /* src_mask */                             
-        0xffff,                /* dst_mask */                             
+        true,                  /* partial_inplace */
+        0xffff,                /* src_mask */
+        0xffff,                /* dst_mask */
         true),                 /* pcrel_offset */
 
   /* IMAGE_REL_PPC_REFHI             0x0010 */
   /* Unused: */
-  HOWTO (IMAGE_REL_PPC_REFHI,   /* type */             
-        0,                     /* rightshift */                           
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        16,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+  HOWTO (IMAGE_REL_PPC_REFHI,   /* type */
+        0,                     /* rightshift */
+        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
-        ppc_refhi_reloc,       /* special_function */                     
+        ppc_refhi_reloc,       /* special_function */
         "REFHI",               /* name */
-        true,                  /* partial_inplace */                      
-        0xffffffff,            /* src_mask */                             
-        0xffffffff,            /* dst_mask */                             
+        true,                  /* partial_inplace */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
         false),                 /* pcrel_offset */
 
   /* IMAGE_REL_PPC_REFLO             0x0011 */
   /* Unused: */
-  HOWTO (IMAGE_REL_PPC_REFLO,   /* type */             
-        0,                     /* rightshift */                           
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        16,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+  HOWTO (IMAGE_REL_PPC_REFLO,   /* type */
+        0,                     /* rightshift */
+        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
-        ppc_refhi_reloc,       /* special_function */                     
+        ppc_refhi_reloc,       /* special_function */
         "REFLO",               /* name */
-        true,                  /* partial_inplace */                      
-        0xffffffff,            /* src_mask */                             
-        0xffffffff,            /* dst_mask */                             
+        true,                  /* partial_inplace */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
         false),                /* pcrel_offset */
 
   /* IMAGE_REL_PPC_PAIR              0x0012 */
   /* Unused: */
-  HOWTO (IMAGE_REL_PPC_PAIR,    /* type */             
-        0,                     /* rightshift */                           
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        16,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+  HOWTO (IMAGE_REL_PPC_PAIR,    /* type */
+        0,                     /* rightshift */
+        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
-        ppc_pair_reloc,        /* special_function */                     
+        ppc_pair_reloc,        /* special_function */
         "PAIR",                /* name */
-        true,                  /* partial_inplace */                      
-        0xffffffff,            /* src_mask */                             
-        0xffffffff,            /* dst_mask */                             
+        true,                  /* partial_inplace */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
         false),                /* pcrel_offset */
 
   /* IMAGE_REL_PPC_TOCREL16_DEFN 0x0013 */
   /*   16-bit offset from TOC base, without causing a definition */
   /* Used: */
-  HOWTO ( (IMAGE_REL_PPC_TOCREL16 | IMAGE_REL_PPC_TOCDEFN), /* type */ 
-        0,                     /* rightshift */                           
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */ 
-        16,                    /* bitsize */                   
-        false,                 /* pc_relative */                          
-        0,                     /* bitpos */                               
+  HOWTO ( (IMAGE_REL_PPC_TOCREL16 | IMAGE_REL_PPC_TOCDEFN), /* type */
+        0,                     /* rightshift */
+        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
-        0,                     /* special_function */                     
+        0,                     /* special_function */
         "TOCREL16, TOCDEFN",   /* name */
-        false,                 /* partial_inplace */                      
-        0xffff,                /* src_mask */                             
-        0xffff,                /* dst_mask */                             
+        false,                 /* partial_inplace */
+        0xffff,                /* src_mask */
+        0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
 };
-
-
 \f
-
 /* Some really cheezy macros that can be turned on to test stderr :-) */
 
 #ifdef DEBUG_RELOC
@@ -749,19 +776,19 @@ static reloc_howto_type ppc_coff_howto_table[] =
    if (i == 0)                                               \
      {                                                       \
        i = 1;                                                \
-       fprintf(stderr,"Unimplemented Relocation -- %s\n",x); \
+       fprintf (stderr,_("Unimplemented Relocation -- %s\n"),x); \
      }                                                       \
 }
 
 #define DUMP_RELOC(n,r)                              \
 {                                                    \
-   fprintf(stderr,"%s sym %d, addr %d, addend %d\n", \
+   fprintf (stderr,"%s sym %d, addr %d, addend %d\n", \
           n, (*(r->sym_ptr_ptr))->name,             \
           r->address, r->addend);                   \
 }
 
-/* Given a reloc name, n, and a pointer to an internal_reloc, 
-   dump out interesting information on the contents 
+/* Given a reloc name, n, and a pointer to an internal_reloc,
+   dump out interesting information on the contents
 
 #define n_name         _n._n_name
 #define n_zeroes       _n._n_n._n_zeroes
@@ -771,7 +798,7 @@ static reloc_howto_type ppc_coff_howto_table[] =
 
 #define DUMP_RELOC2(n,r)                     \
 {                                            \
-   fprintf(stderr,"%s sym %d, r_vaddr %d %s\n", \
+   fprintf (stderr,"%s sym %d, r_vaddr %d %s\n", \
           n, r->r_symndx, r->r_vaddr,\
           (((r->r_type) & IMAGE_REL_PPC_TOCDEFN) == 0) \
           ?" ":" TOCDEFN"  );      \
@@ -782,10 +809,12 @@ static reloc_howto_type ppc_coff_howto_table[] =
 #define DUMP_RELOC(n,r)
 #define DUMP_RELOC2(n,r)
 #endif
-
-
 \f
 /* toc construction and management routines */
+
+/* This file is compiled twice, and these variables are defined in one
+   of the compilations.  FIXME: This is confusing and weird.  Also,
+   BFD should not use global variables.  */
 extern bfd* bfd_of_toc_owner;
 extern long int global_toc_size;
 
@@ -804,7 +833,7 @@ enum ref_category
 {
   priv,
   pub,
-  data
+  tocdata
 };
 
 struct list_ele
@@ -819,16 +848,20 @@ struct list_ele
 extern struct list_ele *head;
 extern struct list_ele *tail;
 
+static void record_toc
+  PARAMS ((asection *, bfd_signed_vma, enum ref_category, const char *));
+
 static void
-record_toc(toc_section, our_toc_offset, cat, name)
+record_toc (toc_section, our_toc_offset, cat, name)
      asection *toc_section;
-     int our_toc_offset;
+     bfd_signed_vma our_toc_offset;
      enum ref_category cat;
      const char *name;
 {
   /* add this entry to our toc addr-offset-name list */
-  struct list_ele *t;
-  t = bfd_malloc (sizeof (struct list_ele));
+  bfd_size_type amt = sizeof (struct list_ele);
+  struct list_ele *t = (struct list_ele *) bfd_malloc (amt);
+
   if (t == NULL)
     abort ();
   t->next = 0;
@@ -851,17 +884,21 @@ record_toc(toc_section, our_toc_offset, cat, name)
 
 #ifdef COFF_IMAGE_WITH_PE
 
+static boolean ppc_record_toc_entry
+  PARAMS ((bfd *, struct bfd_link_info *, asection *, int, enum toc_type));
+static void ppc_mark_symbol_as_glue
+  PARAMS ((bfd *, int, struct internal_reloc *));
+
 /* record a toc offset against a symbol */
-static int
+static boolean
 ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
      bfd *abfd;
-     struct bfd_link_info *info;
-     asection *sec;
+     struct bfd_link_info *info ATTRIBUTE_UNUSED;
+     asection *sec ATTRIBUTE_UNUSED;
      int sym;
-     enum toc_type toc_kind;
+     enum toc_type toc_kind ATTRIBUTE_UNUSED;
 {
   struct ppc_coff_link_hash_entry *h;
-  int ret_val;
   const char *name;
 
   int *local_syms;
@@ -871,56 +908,40 @@ ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
   h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
   if (h != 0)
     {
-      CHECK_EYE(h->eye_catcher);
+      HASH_CHECK(h);
     }
 
-  if (h == 0) 
-    { 
+  if (h == 0)
+    {
       local_syms = obj_coff_local_toc_table(abfd);
       if (local_syms == 0)
        {
-         int i;
+         unsigned int i;
+         bfd_size_type amt;
          /* allocate a table */
-         local_syms = 
-           (int *) bfd_zalloc (abfd, 
-                               obj_raw_syment_count(abfd) * sizeof(int));
+         amt = (bfd_size_type) obj_raw_syment_count (abfd) * sizeof (int);
+         local_syms = (int *) bfd_zalloc (abfd, amt);
          if (local_syms == 0)
            return false;
-         obj_coff_local_toc_table(abfd) = local_syms;
-         for (i = 0; i < obj_raw_syment_count(abfd); ++i)
+         obj_coff_local_toc_table (abfd) = local_syms;
+         for (i = 0; i < obj_raw_syment_count (abfd); ++i)
            {
-             SET_UNALLOCATED(local_syms[i]);
+             SET_UNALLOCATED (local_syms[i]);
            }
        }
 
-      if (IS_UNALLOCATED(local_syms[sym])) 
+      if (IS_UNALLOCATED(local_syms[sym]))
        {
          local_syms[sym] = global_toc_size;
-         ret_val = global_toc_size;
          global_toc_size += 4;
 
          /* The size must fit in a 16bit displacment */
-         if (global_toc_size >= 65535)
+         if (global_toc_size > 65535)
            {
-             fprintf(stderr,
-                     "Exceeded toc size of 65535\n");
-             abort();
+             (*_bfd_error_handler) (_("TOC overflow"));
+             bfd_set_error (bfd_error_file_too_big);
+             return false;
            }
-
-#ifdef TOC_DEBUG
-         fprintf(stderr,
-                 "Setting toc_offset for local sym %d to %d\n",
-                 sym, ret_val);
-#endif
-       }
-      else
-       {
-         ret_val = local_syms[sym];
-#ifdef TOC_DEBUG
-         fprintf(stderr,
-                 "toc_offset already set for local sym %d to %d\n",
-                 sym, ret_val);
-#endif
        }
     }
   else
@@ -932,155 +953,21 @@ ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
       if (IS_UNALLOCATED(h->toc_offset))
        {
          h->toc_offset = global_toc_size;
-         ret_val = global_toc_size;
          global_toc_size += 4;
 
          /* The size must fit in a 16bit displacment */
          if (global_toc_size >= 65535)
            {
-             fprintf(stderr,
-                     "Exceeded toc size of 65535\n");
-             abort();
-           }
-
-#ifdef TOC_DEBUG
-         fprintf(stderr,
-                 "Setting toc_offset for sym %d (%s) [h=%p] to %d\n",
-                 sym, name, h, ret_val);
-#endif
-       }
-      else
-       {
-         ret_val = h->toc_offset;
-#ifdef TOC_DEBUG
-         fprintf(stderr,
-                 "toc_offset already set for sym %d (%s) [h=%p] to %d\n",
-                 sym, name, h, ret_val);
-#endif
-       }
-    }
-
-  return ret_val;
-}
-
-#endif /* COFF_IMAGE_WITH_PE */
-
-#if 0
-
-/* FIXME: record a toc offset against a data-in-toc symbol */
-/* Now, there is currenly some confusion on what this means. In some 
-   compilers one sees the moral equivalent of:
-      .tocd
-      define some data
-      .text
-      refer to the data with a [tocv] qualifier
-   In general, one sees something to indicate that a tocd has been
-   seen, and that would trigger the allocation of data in toc. The IBM
-   docs seem to suggest that anything with the TOCDEFN qualifier should
-   never trigger storage allocation. However, in the kernel32.lib that 
-   we've been using for our test bed, there are a couple of variables
-   referenced that fail that test.
-
-   So it can't work that way.
-*/
-static int
-ppc_record_data_in_toc_entry(abfd, info, sec, sym, toc_kind)
-     bfd *abfd;
-     struct bfd_link_info *info;
-     asection *sec;
-     int sym;
-     enum toc_type toc_kind;
-{
-  struct ppc_coff_link_hash_entry *h = 0;
-  int ret_val;
-  const char *name;
-
-  int *local_syms;
-
-  h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
-
-  if (h == 0) 
-    { 
-      local_syms = obj_coff_local_toc_table(abfd);
-      if (local_syms == 0)
-       {
-         int i;
-         /* allocate a table */
-         local_syms = 
-           (int *) bfd_zalloc (abfd, 
-                               obj_raw_syment_count(abfd) * sizeof(int));
-         if (local_syms == 0)
-           return false;
-         obj_coff_local_toc_table(abfd) = local_syms;
-         for (i = 0; i < obj_raw_syment_count(abfd); ++i)
-           {
-             SET_UNALLOCATED(local_syms[i]);
+             (*_bfd_error_handler) (_("TOC overflow"));
+             bfd_set_error (bfd_error_file_too_big);
+             return false;
            }
        }
-
-      if (IS_UNALLOCATED(local_syms[sym])) 
-       {
-         local_syms[sym] = global_toc_size;
-         ret_val = global_toc_size;
-         global_toc_size += 4;
-#ifdef TOC_DEBUG
-         fprintf(stderr,
-                 "Setting data_in_toc_offset for local sym %d to %d\n",
-                 sym, ret_val);
-#endif
-       }
-      else
-       {
-         ret_val = local_syms[sym];
-#ifdef TOC_DEBUG
-         fprintf(stderr,
-                 "data_in_toc_offset already set for local sym %d to %d\n",
-                 sym, ret_val);
-#endif
-       }
     }
-  else
-    {
-      CHECK_EYE(h->eye_catcher);
 
-      name = h->root.root.root.string;
-
-      /* check to see if there's a toc slot allocated. If not, do it
-        here. It will be used in relocate_section */
-      if (IS_UNALLOCATED(h->toc_offset))
-       {
-#if 0
-         h->toc_offset = global_toc_size;
-#endif
-         ret_val = global_toc_size;
-         /* We're allocating a chunk of the toc, as opposed to a slot */
-         /* FIXME: alignment? */
-         
-         global_toc_size += 4;
-#ifdef TOC_DEBUG
-         fprintf(stderr,
-                 "Setting data_in_toc_offset for sym %d (%s) [h=%p] to %d\n",
-                 sym, name, h, ret_val);
-#endif
-       }
-      else
-       {
-         ret_val = h->toc_offset;
-#ifdef TOC_DEBUG
-         fprintf(stderr,
-                 "data_in_toc_offset already set for sym %d (%s) [h=%p] to %d\n",
-                 sym, name, h, ret_val);
-#endif
-       }
-    }
-
-  return ret_val;
+  return true;
 }
 
-#endif /* 0 */
-
-#ifdef COFF_IMAGE_WITH_PE
-
 /* record a toc offset against a symbol */
 static void
 ppc_mark_symbol_as_glue(abfd, sym, rel)
@@ -1092,7 +979,7 @@ ppc_mark_symbol_as_glue(abfd, sym, rel)
 
   h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
 
-  CHECK_EYE(h->eye_catcher);
+  HASH_CHECK(h);
 
   h->symbol_is_glue = 1;
   h->glue_insn = bfd_get_32 (abfd, (bfd_byte *) &rel->r_vaddr);
@@ -1102,46 +989,19 @@ ppc_mark_symbol_as_glue(abfd, sym, rel)
 
 #endif /* COFF_IMAGE_WITH_PE */
 \f
-#if 0
-
-/* Provided the symbol, returns the value reffed */
-static long get_symbol_value PARAMS ((asymbol *));
-
-static long
-get_symbol_value (symbol)       
-     asymbol *symbol;
-{                                             
-  long relocation = 0;
-
-  if (bfd_is_com_section (symbol->section))
-    {
-      relocation = 0;                           
-    }
-  else 
-    {                                      
-      relocation = symbol->value +
-       symbol->section->output_section->vma +
-         symbol->section->output_offset;
-    }                                           
-
-  return(relocation);
-}
-
-#endif /* 0 */
-
 /* Return true if this relocation should
-   appear in the output .reloc section. */
+   appear in the output .reloc section.  */
 
 static boolean in_reloc_p(abfd, howto)
-     bfd * abfd;
+     bfd * abfd ATTRIBUTE_UNUSED;
      reloc_howto_type *howto;
 {
-  return 
-    (! howto->pc_relative) 
+  return
+    (! howto->pc_relative)
       && (howto->type != IMAGE_REL_PPC_ADDR32NB)
       && (howto->type != IMAGE_REL_PPC_TOCREL16)
       && (howto->type != IMAGE_REL_PPC_IMGLUE)
-      && (howto->type != IMAGE_REL_PPC_IFGLUE) 
+      && (howto->type != IMAGE_REL_PPC_IFGLUE)
       && (howto->type != IMAGE_REL_PPC_SECREL)
       && (howto->type != IMAGE_REL_PPC_SECTION)
       && (howto->type != IMAGE_REL_PPC_SECREL16)
@@ -1149,7 +1009,7 @@ static boolean in_reloc_p(abfd, howto)
       && (howto->type != IMAGE_REL_PPC_REFLO)
       && (howto->type != IMAGE_REL_PPC_PAIR)
       && (howto->type != IMAGE_REL_PPC_TOCREL16_DEFN) ;
-}     
+}
 
 #if 0
 
@@ -1176,41 +1036,38 @@ pe_ppc_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
   unsigned long sym_value;
   unsigned short r_type;
   unsigned long addr = reloc_entry->address ; /*+ input_section->vma*/
-       
-  fprintf(stderr, "pe_ppc_reloc (%s)\n", TARGET_LITTLE_NAME);
 
   r_type = reloc_entry->howto->type;
 
-  if (output_bfd) 
+  if (output_bfd)
     {
       /* Partial linking - do nothing */
       reloc_entry->address += input_section->output_offset;
-      return bfd_reloc_ok; 
+      return bfd_reloc_ok;
     }
 
   if (symbol_in != NULL
       && bfd_is_und_section (symbol_in->section))
     {
       /* Keep the state machine happy in case we're called again */
-      if (r_type == IMAGE_REL_PPC_REFHI) 
+      if (r_type == IMAGE_REL_PPC_REFHI)
        {
          part1_consth_active = true;
          part1_consth_value  = 0;
        }
       return(bfd_reloc_undefined);
     }
-  
-  if ((part1_consth_active) && (r_type != IMAGE_REL_PPC_PAIR)) 
+
+  if ((part1_consth_active) && (r_type != IMAGE_REL_PPC_PAIR))
     {
       part1_consth_active = false;
-      *error_message = (char *) "Missing PAIR";
+      *error_message = (char *) _("Missing PAIR");
       return(bfd_reloc_dangerous);
     }
 
-
   sym_value = get_symbol_value(symbol_in);
-  
-  return(bfd_reloc_ok);        
+
+  return(bfd_reloc_ok);
 }
 
 #endif /* 0 */
@@ -1236,22 +1093,13 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
   asection *toc_section = 0;
   bfd_vma relocation;
   reloc_howto_type *howto = 0;
-  
-#ifdef DEBUG_RELOC
-  fprintf(stderr, 
-         "pe_ppc_relocate_section (%s) for %s in bfd %s\n", 
-         TARGET_LITTLE_NAME,
-         input_section->name,
-         input_bfd->filename);
-  
-#endif  
 
   /* If we are performing a relocateable link, we don't need to do a
      thing.  The caller will take care of adjusting the reloc
      addresses and symbol indices.  */
   if (info->relocateable)
     return true;
-  
+
   hihalf = false;
   hihalf_val = 0;
 
@@ -1270,23 +1118,6 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
 
       unsigned short r_type  = EXTRACT_TYPE (rel->r_type);
       unsigned short r_flags = EXTRACT_FLAGS(rel->r_type);
-  
-#ifdef DEBUG_RELOC
-      /* now examine flags */
-      if (r_flags != 0) 
-       {
-         fprintf (stderr, "Reloc with flags found!");
-         if ( r_flags & IMAGE_REL_PPC_NEG ) 
-           fprintf (stderr, " NEG");
-         if ( r_flags & IMAGE_REL_PPC_BRTAKEN )
-           fprintf (stderr, " BRTAKEN");
-         if ( r_flags & IMAGE_REL_PPC_BRNTAKEN )
-           fprintf (stderr, " BRNTAKEN");
-         if ( r_flags & IMAGE_REL_PPC_TOCDEFN )
-           fprintf (stderr, " TOCDEFN");
-         fprintf(stderr, "\n");
-       }
-#endif
 
       symndx = rel->r_symndx;
       loc = contents + rel->r_vaddr - input_section->vma;
@@ -1301,16 +1132,22 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
        }
       else
        {
-         h = (struct ppc_coff_link_hash_entry *) 
+         h = (struct ppc_coff_link_hash_entry *)
            (obj_coff_sym_hashes (input_bfd)[symndx]);
-         if (h != 0) 
+         if (h != 0)
            {
-             CHECK_EYE(h->eye_catcher);
+             HASH_CHECK(h);
            }
 
          sym = syms + symndx;
        }
 
+      if (r_type == IMAGE_REL_PPC_IMGLUE && h == 0)
+       {
+         /* An IMGLUE reloc must have a name. Something is very wrong.  */
+         abort ();
+       }
+
       sec = NULL;
       val = 0;
 
@@ -1324,13 +1161,14 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
              sec = sections[symndx];
              val = (sec->output_section->vma
                     + sec->output_offset
-                    + sym->n_value
-                    - sec->vma);
+                    + sym->n_value);
+             if (! obj_pe (output_bfd))
+               val -= sec->vma;
            }
        }
       else
        {
-         CHECK_EYE(h->eye_catcher);
+         HASH_CHECK(h);
 
          if (h->root.root.type == bfd_link_hash_defined
              || h->root.root.type == bfd_link_hash_defweak)
@@ -1342,54 +1180,44 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
            }
          else
            {
-fprintf(stderr,
-       "missing %s\n",h->root.root.root.string);
              if (! ((*info->callbacks->undefined_symbol)
                     (info, h->root.root.root.string, input_bfd, input_section,
-                     rel->r_vaddr - input_section->vma)))
+                     rel->r_vaddr - input_section->vma, true)))
                return false;
            }
        }
 
       rstat = bfd_reloc_ok;
-      
+
       /* Each case must do its own relocation, setting rstat appropriately */
       switch (r_type)
        {
        default:
-         fprintf( stderr, 
-                 "ERROR: during reloc processing -- unsupported reloc %s\n", 
-                 howto->name);
+         (*_bfd_error_handler)
+           (_("%s: unsupported relocation type 0x%02x"),
+            bfd_archive_filename (input_bfd), r_type);
          bfd_set_error (bfd_error_bad_value);
-         abort();
          return false;
        case IMAGE_REL_PPC_TOCREL16:
          {
-           bfd_vma our_toc_offset;
+           bfd_signed_vma our_toc_offset;
            int fixit;
 
            DUMP_RELOC2(howto->name, rel);
 
-           if (toc_section == 0) 
+           if (toc_section == 0)
              {
-               toc_section = bfd_get_section_by_name (bfd_of_toc_owner, 
+               toc_section = bfd_get_section_by_name (bfd_of_toc_owner,
                                                       TOC_SECTION_NAME);
-#ifdef TOC_DEBUG
 
-               fprintf(stderr,
-                       "BFD of toc owner %p (%s), section addr of %s %p\n",
-                        bfd_of_toc_owner, bfd_of_toc_owner->filename, 
-                       TOC_SECTION_NAME, toc_section);
-#endif
-
-               if ( toc_section == NULL ) 
+               if ( toc_section == NULL )
                  {
-                   fprintf(stderr, "No Toc section!\n");
-                   abort();
+                   /* There is no toc section. Something is very wrong.  */
+                   abort ();
                  }
              }
 
-           /* 
+           /*
             *  Amazing bit tricks present. As we may have seen earlier, we
             *  use the 1 bit to tell us whether or not a toc offset has been
             *  allocated. Now that they've all been allocated, we will use
@@ -1410,35 +1238,19 @@ fprintf(stderr,
 
                if (IS_WRITTEN(our_toc_offset))
                  {
-                   /* if it has been written out, it is marked with the 
+                   /* if it has been written out, it is marked with the
                       1 bit. Fix up our offset, but do not write it out
                       again.
                     */
                    MAKE_ADDR_AGAIN(our_toc_offset);
-#ifdef TOC_DEBUG
-
-                   fprintf(stderr,
-                           "Not writing out toc_offset of %d for %s\n", 
-                           our_toc_offset, name);
-#endif
                  }
                else
                  {
                    /* write out the toc entry */
-                   record_toc(toc_section, our_toc_offset, priv, strdup(name));
-#ifdef TOC_DEBUG
-                   fprintf(stderr,
-                           "Writing out toc_offset "
-                           "toc_section (%p,%p)+%d val %d for %s\n", 
-                           toc_section,
-                           toc_section->contents,
-                           our_toc_offset, 
-                           val,
-                           name);
-#endif
+                   record_toc (toc_section, our_toc_offset, priv,
+                               strdup (name));
 
-                   bfd_put_32(output_bfd,
-                              val,
+                   bfd_put_32 (output_bfd, val,
                               toc_section->contents + our_toc_offset);
 
                    MARK_AS_WRITTEN(local_toc_table[symndx]);
@@ -1450,86 +1262,56 @@ fprintf(stderr,
                const char *name = h->root.root.root.string;
                our_toc_offset = h->toc_offset;
 
-               if ((r_flags & IMAGE_REL_PPC_TOCDEFN) 
+               if ((r_flags & IMAGE_REL_PPC_TOCDEFN)
                    == IMAGE_REL_PPC_TOCDEFN )
-#if 0
-                 /* This is wrong. If tocdefn is on, we must unconditionally
-                    assume the following path */
-                   && IS_UNALLOCATED(our_toc_offset))
-#endif
                  {
-                   /* This is unbelievable cheese. Some knowledgable asm 
-                      hacker has decided to use r2 as a base for loading 
-                      a value. He/She does this by setting the tocdefn bit, 
-                      and not supplying a toc definition. The behaviour is 
-                      then to use the difference between the value of the 
-                      symbol and the actual location of the toc as the toc 
-                      index. 
+                   /* This is unbelievable cheese. Some knowledgable asm
+                      hacker has decided to use r2 as a base for loading
+                      a value. He/She does this by setting the tocdefn bit,
+                      and not supplying a toc definition. The behaviour is
+                      then to use the difference between the value of the
+                      symbol and the actual location of the toc as the toc
+                      index.
 
                       In fact, what is usually happening is, because the
                       Import Address Table is mapped immediately following
                       the toc, some trippy library code trying for speed on
-                      dll linkage, takes advantage of that and considers 
+                      dll linkage, takes advantage of that and considers
                       the IAT to be part of the toc, thus saving a load.
                    */
-#ifdef DEBUG_RELOC
-                   fprintf(stderr,
-                           "TOCDEFN is on, (%s) (%p) our_toc_offset = %x\n", 
-                           name, h, our_toc_offset);
-#endif
 
-                   our_toc_offset = val - 
-                     (toc_section->output_section->vma + 
-                      toc_section->output_offset);
-
-#ifdef DEBUG_RELOC
-                   fprintf(stderr,
-                           "               our_toc_offset set to %x\n", our_toc_offset);
-#endif
+                   our_toc_offset = val - (toc_section->output_section->vma
+                                           + toc_section->output_offset);
 
                    /* The size must still fit in a 16bit displacment */
-                   if (our_toc_offset >= 65535)
+                   if ((bfd_vma) our_toc_offset >= 65535)
                      {
-                       fprintf(stderr,
-                               "TOCDEFN Relocation exceeded "
-                               "displacment of 65535\n");
-                       abort();
+                       (*_bfd_error_handler)
+                         (_("%s: Relocation for %s of %lx exceeds Toc size limit"),
+                          bfd_archive_filename (input_bfd), name,
+                          (unsigned long) our_toc_offset);
+                       bfd_set_error (bfd_error_bad_value);
+                       return false;
                      }
 
-                   record_toc(toc_section, our_toc_offset, pub, strdup(name));
+                   record_toc (toc_section, our_toc_offset, pub,
+                               strdup (name));
                  }
                else if (IS_WRITTEN(our_toc_offset))
                  {
-                   /* if it has been written out, it is marked with the 
+                   /* if it has been written out, it is marked with the
                       1 bit. Fix up our offset, but do not write it out
                       again.
                     */
                    MAKE_ADDR_AGAIN(our_toc_offset);
-#ifdef TOC_DEBUG
-                   fprintf(stderr,
-                           "Not writing out toc_offset of %d for %s\n", 
-                           our_toc_offset, name);
-#endif
                  }
                else
                  {
-                   record_toc(toc_section, our_toc_offset, pub, strdup(name));
-
-#ifdef TOC_DEBUG
-                   /* write out the toc entry */
-                   fprintf(stderr,
-                           "Writing out toc_offset "
-                           "toc_section (%p,%p)+%d val %d for %s\n", 
-                           toc_section,
-                           toc_section->contents,
-                           our_toc_offset, 
-                           val,
-                           name);
-#endif
+                   record_toc(toc_section, our_toc_offset, pub,
+                              strdup (name));
 
                    /* write out the toc entry */
-                   bfd_put_32(output_bfd,
-                              val,
+                   bfd_put_32 (output_bfd, val,
                               toc_section->contents + our_toc_offset);
 
                    MARK_AS_WRITTEN(h->toc_offset);
@@ -1539,53 +1321,48 @@ fprintf(stderr,
                  }
              }
 
-           if (fixit && info->base_file) 
+           if (fixit && info->base_file)
              {
                /* So if this is non pcrelative, and is referenced
                   to a section or a common symbol, then it needs a reloc */
 
                /* relocation to a symbol in a section which
-                  isn't absolute - we output the address here 
+                  isn't absolute - we output the address here
                   to a file */
 
-               bfd_vma addr =  toc_section->output_section->vma
-                 + toc_section->output_offset + our_toc_offset;
-                   
+               bfd_vma addr = (toc_section->output_section->vma
+                               + toc_section->output_offset + our_toc_offset);
+
                if (coff_data(output_bfd)->pe)
                  addr -= pe_data(output_bfd)->pe_opthdr.ImageBase;
 
-#ifdef DEBUG_RELOC
-               fprintf(stderr,
-                       "  Toc Section .reloc candidate addr = %x\n", addr);
-#endif
                fwrite (&addr, 1,4, (FILE *) info->base_file);
              }
 
-
            /* FIXME: this test is conservative */
-           if ( (r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN &&
-               our_toc_offset > toc_section->_raw_size)
+           if ((r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN
+               && (bfd_vma) our_toc_offset > toc_section->_raw_size)
              {
-               fprintf(stderr,
-                       "reloc offset is bigger than the toc size!\n");
-               abort();
+               (*_bfd_error_handler)
+                 (_("%s: Relocation exceeds allocated TOC (%lx)"),
+                  bfd_archive_filename (input_bfd),
+                  (unsigned long) toc_section->_raw_size);
+               bfd_set_error (bfd_error_bad_value);
+               return false;
              }
 
            /* Now we know the relocation for this toc reference */
            relocation =  our_toc_offset + TOC_LOAD_ADJUSTMENT;
-           rstat = _bfd_relocate_contents (howto,
-                                           input_bfd, 
-                                           relocation, 
-                                           loc);
+           rstat = _bfd_relocate_contents (howto, input_bfd, relocation, loc);
          }
          break;
        case IMAGE_REL_PPC_IFGLUE:
          {
            /* To solve this, we need to know whether or not the symbol */
-           /* appearing on the call instruction is a glue function or not. */
+           /* appearing on the call instruction is a glue function or not.  */
            /* A glue function must announce itself via a IMGLUE reloc, and */
            /* the reloc contains the required toc restore instruction */
-         
+
            bfd_vma x;
            const char *my_name;
            DUMP_RELOC2(howto->name, rel);
@@ -1593,18 +1370,18 @@ fprintf(stderr,
            if (h != 0)
              {
                my_name = h->root.root.root.string;
-               if (h->symbol_is_glue == 1) 
+               if (h->symbol_is_glue == 1)
                  {
-                   x = bfd_get_32(input_bfd, loc);
-                   bfd_put_32(input_bfd, h->glue_insn, loc);
+                   x = bfd_get_32 (input_bfd, loc);
+                   bfd_put_32 (input_bfd, (bfd_vma) h->glue_insn, loc);
                  }
              }
          }
          break;
        case IMAGE_REL_PPC_SECREL:
          /* Unimplemented: codeview debugging information */
-         /* For fast access to the header of the section 
-            containing the item. */
+         /* For fast access to the header of the section
+            containing the item.  */
          break;
        case IMAGE_REL_PPC_SECTION:
          /* Unimplemented: codeview debugging information */
@@ -1622,15 +1399,15 @@ fprintf(stderr,
                my_name = h->root.root.root.string;
              }
 
-           fprintf(stderr, 
-                   "Warning: unsupported reloc %s <file %s, section %s>\n", 
+           fprintf (stderr,
+                   _("Warning: unsupported reloc %s <file %s, section %s>\n"),
                    howto->name,
-                   bfd_get_filename(input_bfd),
+                   bfd_archive_filename(input_bfd),
                    input_section->name);
 
-           fprintf(stderr,"sym %ld (%s), r_vaddr %ld (%lx)\n", 
+           fprintf (stderr,"sym %ld (%s), r_vaddr %ld (%lx)\n",
                    rel->r_symndx, my_name, (long) rel->r_vaddr,
-                   (unsigned long) rel->r_vaddr);  
+                   (unsigned long) rel->r_vaddr);
          }
          break;
        case IMAGE_REL_PPC_IMGLUE:
@@ -1638,22 +1415,19 @@ fprintf(stderr,
            /* There is nothing to do now. This reloc was noted in the first
               pass over the relocs, and the glue instruction extracted */
            const char *my_name;
-           if (h->symbol_is_glue == 1) 
+           if (h->symbol_is_glue == 1)
              break;
            my_name = h->root.root.root.string;
-           fprintf(stderr, 
-                   "Warning: previously missed IMGLUE reloc %s <file %s, section %s>\n", 
-                   howto->name,
-                   bfd_get_filename(input_bfd),
-                   input_section->name);
-           break;
 
+           (*_bfd_error_handler)
+             (_("%s: Out of order IMGLUE reloc for %s"),
+              bfd_archive_filename (input_bfd), my_name);
+           bfd_set_error (bfd_error_bad_value);
+           return false;
          }
-         break;
 
        case IMAGE_REL_PPC_ADDR32NB:
          {
-           struct coff_link_hash_entry *myh = 0;
            const char *name = 0;
            DUMP_RELOC2(howto->name, rel);
 
@@ -1661,31 +1435,25 @@ fprintf(stderr,
              {
                /* set magic values */
                int idata5offset;
-               struct coff_link_hash_entry *myh = 0;
+               struct coff_link_hash_entry *myh;
                myh = coff_link_hash_lookup (coff_hash_table (info),
                                             "__idata5_magic__",
                                             false, false, true);
-               first_thunk_address = myh->root.u.def.value + 
-                 sec->output_section->vma + 
-                   sec->output_offset - 
+               first_thunk_address = myh->root.u.def.value +
+                 sec->output_section->vma +
+                   sec->output_offset -
                      pe_data(output_bfd)->pe_opthdr.ImageBase;
-               
+
                idata5offset = myh->root.u.def.value;
                myh = coff_link_hash_lookup (coff_hash_table (info),
                                             "__idata6_magic__",
                                             false, false, true);
-               
+
                thunk_size = myh->root.u.def.value - idata5offset;
                myh = coff_link_hash_lookup (coff_hash_table (info),
                                             "__idata4_magic__",
                                             false, false, true);
                import_table_size = myh->root.u.def.value;
-#ifdef DEBUG_RELOC
-               fprintf(stderr,
-                       "first computation triggered fta %x, ts %d(%x), its %d(%x)\n",
-                       first_thunk_address, thunk_size, thunk_size, import_table_size,
-                       import_table_size);
-#endif
              }
 
            if (h == 0)
@@ -1707,19 +1475,18 @@ fprintf(stderr,
 
                if (target != 0)
                  {
-                   myh = 0;
+                   struct coff_link_hash_entry *myh;
 
                    myh = coff_link_hash_lookup (coff_hash_table (info),
                                                 target,
                                                 false, false, true);
-                   if (myh == 0) 
+                   if (myh == 0)
                      {
-                       fprintf(stderr, "Missing idata magic cookies, "
-                               "this cannot work anyway...\n");
-                       abort();
+                       /* Missing magic cookies. Something is very wrong.  */
+                       abort ();
                      }
-                   
-                   val = myh->root.u.def.value + 
+
+                   val = myh->root.u.def.value +
                      sec->output_section->vma + sec->output_offset;
                    if (first_thunk_address == 0)
                      {
@@ -1727,35 +1494,28 @@ fprintf(stderr,
                        myh = coff_link_hash_lookup (coff_hash_table (info),
                                                     "__idata5_magic__",
                                                     false, false, true);
-                       first_thunk_address = myh->root.u.def.value + 
-                         sec->output_section->vma + 
-                           sec->output_offset - 
+                       first_thunk_address = myh->root.u.def.value +
+                         sec->output_section->vma +
+                           sec->output_offset -
                              pe_data(output_bfd)->pe_opthdr.ImageBase;
-                       
+
                        idata5offset = myh->root.u.def.value;
                        myh = coff_link_hash_lookup (coff_hash_table (info),
                                                     "__idata6_magic__",
                                                     false, false, true);
-                       
+
                        thunk_size = myh->root.u.def.value - idata5offset;
                        myh = coff_link_hash_lookup (coff_hash_table (info),
                                                     "__idata4_magic__",
                                                     false, false, true);
                        import_table_size = myh->root.u.def.value;
-#ifdef DEBUG_RELOC
-
-                       fprintf(stderr,
-                               "second computation triggered fta %x, ts %d(%x), its %d(%x)\n",
-                               first_thunk_address, thunk_size, thunk_size, import_table_size,
-                               import_table_size);
-#endif
                      }
                  }
              }
 
            rstat = _bfd_relocate_contents (howto,
-                             input_bfd, 
-                             val - 
+                             input_bfd,
+                             val -
                              pe_data(output_bfd)->pe_opthdr.ImageBase,
                              loc);
          }
@@ -1767,8 +1527,8 @@ fprintf(stderr,
                  + input_section->output_offset);
 
          rstat = _bfd_relocate_contents (howto,
-                                         input_bfd, 
-                                         val, 
+                                         input_bfd,
+                                         val,
                                          loc);
          break;
        case IMAGE_REL_PPC_ADDR16:
@@ -1776,8 +1536,8 @@ fprintf(stderr,
        case IMAGE_REL_PPC_ADDR32:
          DUMP_RELOC2(howto->name, rel);
          rstat = _bfd_relocate_contents (howto,
-                                         input_bfd, 
-                                         val, 
+                                         input_bfd,
+                                         val,
                                          loc);
          break;
        }
@@ -1789,28 +1549,17 @@ fprintf(stderr,
          if (sym && pe_data(output_bfd)->in_reloc_p(output_bfd, howto))
            {
              /* relocation to a symbol in a section which
-                isn't absolute - we output the address here 
+                isn't absolute - we output the address here
                 to a file */
-             bfd_vma addr = rel->r_vaddr 
-               - input_section->vma 
-               + input_section->output_offset 
+             bfd_vma addr = rel->r_vaddr
+               - input_section->vma
+               + input_section->output_offset
                  + input_section->output_section->vma;
 
              if (coff_data(output_bfd)->pe)
                {
-#ifdef DEBUG_RELOC
-                 bfd_vma before_addr = addr;
-#endif
                  addr -= pe_data(output_bfd)->pe_opthdr.ImageBase;
-#ifdef DEBUG_RELOC
-                 fprintf(stderr,
-                         " adjusted down from %x to %x", before_addr, addr);
-#endif
                }
-#ifdef DEBUG_RELOC
-             fprintf(stderr, "\n");
-#endif
-
              fwrite (&addr, 1,4, (FILE *) info->base_file);
            }
        }
@@ -1841,50 +1590,28 @@ fprintf(stderr,
                buf[SYMNMLEN] = '\0';
                name = buf;
              }
-#if 0
-           else
-             {
-               name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
-               if (name == NULL)
-                 return false;
-             }
-#endif
 
            if (! ((*info->callbacks->reloc_overflow)
-                  (info, name, howto->name, 
+                  (info, name, howto->name,
                    (bfd_vma) 0, input_bfd,
                    input_section, rel->r_vaddr - input_section->vma)))
              {
-#ifdef DEBUG_RELOC
-               fprintf(stderr, 
-                       "pe_ppc_relocate_section (%s) for %s in bfd %s RETURNING TRUE\n", 
-                       TARGET_LITTLE_NAME,
-                       input_section->name,
-                       input_bfd->filename);
-  
-#endif  
                return false;
              }
          }
        }
 
-    }     
-
-#ifdef DEBUG_RELOC
-  fprintf(stderr, 
-         "pe_ppc_relocate_section (%s) for %s in bfd %s RETURNING TRUE\n", 
-         TARGET_LITTLE_NAME,
-         input_section->name,
-         input_bfd->filename);
-  
-#endif  
+    }
 
   return true;
 }
 
-
 #ifdef COFF_IMAGE_WITH_PE
 
+/* FIXME: BFD should not use global variables.  This file is compiled
+   twice, and these variables are shared.  This is confusing and
+   weird.  */
+
 long int global_toc_size = 4;
 
 bfd* bfd_of_toc_owner = 0;
@@ -1897,64 +1624,66 @@ struct list_ele *head;
 struct list_ele *tail;
 
 static char *
-h1 = "\n\t\t\tTOC MAPPING\n\n";
+h1 = N_("\n\t\t\tTOC MAPPING\n\n");
 static char *
-h2 = " TOC    disassembly  Comments       Name\n";
+h2 = N_(" TOC    disassembly  Comments       Name\n");
 static char *
-h3 = " Offset  spelling                   (if present)\n";
+h3 = N_(" Offset  spelling                   (if present)\n");
 
 void
-dump_toc(vfile)
-     void *vfile;
+dump_toc (vfile)
+     PTR vfile;
 {
-  FILE *file = vfile;
+  FILE *file = (FILE *) vfile;
   struct list_ele *t;
 
-  fprintf(file, h1);
-  fprintf(file, h2);
-  fprintf(file, h3);
+  fprintf (file, _(h1));
+  fprintf (file, _(h2));
+  fprintf (file, _(h3));
 
-  for(t = head; t != 0; t=t->next)
+  for (t = head; t != 0; t=t->next)
     {
-      char *cat;
+      const char *cat = "";
 
       if (t->cat == priv)
-       cat = "private       ";
+       cat = _("private       ");
       else if (t->cat == pub)
-       cat = "public        ";
-      else if (t->cat == data)
-       cat = "data-in-toc   ";
+       cat = _("public        ");
+      else if (t->cat == tocdata)
+       cat = _("data-in-toc   ");
 
       if (t->offset > global_toc_size)
        {
          if (t->offset <= global_toc_size + thunk_size)
-           cat = "IAT reference ";
+           cat = _("IAT reference ");
          else
            {
-             fprintf(file,
-                     "**** global_toc_size %ld(%lx), thunk_size %ld(%lx)\n",
-                     global_toc_size, global_toc_size, thunk_size, thunk_size);
-             cat = "Out of bounds!";
+             fprintf (file,
+                     _("**** global_toc_size %ld(%lx), thunk_size %ld(%lx)\n"),
+                      global_toc_size, global_toc_size,
+                      thunk_size, thunk_size);
+             cat = _("Out of bounds!");
            }
        }
 
-      fprintf(file,
+      fprintf (file,
              " %04lx    (%d)", (unsigned long) t->offset, t->offset - 32768);
-      fprintf(file,
+      fprintf (file,
              "    %s %s\n",
              cat, t->name);
 
     }
 
-  fprintf(file, "\n");
+  fprintf (file, "\n");
 }
 
 boolean
-ppc_allocate_toc_section (info) 
-     struct bfd_link_info *info;
+ppc_allocate_toc_section (info)
+     struct bfd_link_info *info ATTRIBUTE_UNUSED;
 {
   asection *s;
   bfd_byte *foo;
+  bfd_size_type amt;
   static char test_char = '1';
 
   if ( global_toc_size == 0 ) /* FIXME: does this get me in trouble? */
@@ -1962,20 +1691,20 @@ ppc_allocate_toc_section (info)
 
   if (bfd_of_toc_owner == 0)
     {
-      fprintf(stderr,
-             "There is no bfd that owns the toc section!\n");
-      abort();
+      /* No toc owner? Something is very wrong.  */
+      abort ();
     }
 
   s = bfd_get_section_by_name ( bfd_of_toc_owner , TOC_SECTION_NAME);
-  if (s == NULL) 
+  if (s == NULL)
     {
-      fprintf(stderr, "No Toc section!\n");
-      abort();
+      /* No toc section? Something is very wrong.  */
+      abort ();
     }
 
-  foo = bfd_alloc(bfd_of_toc_owner, global_toc_size);
-  memset(foo, test_char, global_toc_size);
+  amt = global_toc_size;
+  foo = (bfd_byte *) bfd_alloc (bfd_of_toc_owner, amt);
+  memset(foo, test_char, (size_t) global_toc_size);
 
   s->_raw_size = s->_cooked_size = global_toc_size;
   s->contents = foo;
@@ -1991,14 +1720,8 @@ ppc_process_before_allocation (abfd, info)
   asection *sec;
   struct internal_reloc *i, *rel;
 
-#ifdef DEBUG_RELOC
-  fprintf(stderr, 
-         "ppc_process_before_allocation: BFD %s\n", 
-         bfd_get_filename(abfd));
-#endif
-
   /* here we have a bfd that is to be included on the link. We have a hook
-     to do reloc rummaging, before section sizes are nailed down. */
+     to do reloc rummaging, before section sizes are nailed down.  */
 
   _bfd_coff_get_external_symbols(abfd);
 
@@ -2012,69 +1735,34 @@ ppc_process_before_allocation (abfd, info)
 
   for (; sec != 0; sec = sec->next)
   {
-    int toc_offset;
-
-#ifdef DEBUG_RELOC
-    fprintf(stderr, 
-           "  section %s reloc count %d\n", 
-           sec->name, 
-           sec->reloc_count);
-#endif
-
-    if (sec->reloc_count == 0) 
+    if (sec->reloc_count == 0)
       continue;
 
     /* load the relocs */
     /* FIXME: there may be a storage leak here */
     i=_bfd_coff_read_internal_relocs(abfd,sec,1,0,0,0);
-    
+
     if (i == 0)
-      abort();
+      abort ();
 
-    for (rel=i;rel<i+sec->reloc_count;++rel) 
+    for (rel=i;rel<i+sec->reloc_count;++rel)
       {
        unsigned short r_type  = EXTRACT_TYPE (rel->r_type);
        unsigned short r_flags = EXTRACT_FLAGS(rel->r_type);
+       boolean ok = true;
 
-#ifdef DEBUG_RELOC
-       /* now examine flags */
-       if (r_flags != 0) 
-         {
-           fprintf (stderr, "Reloc with flags found!");
-           if ( r_flags & IMAGE_REL_PPC_NEG ) 
-             fprintf (stderr, " NEG");
-           if ( r_flags & IMAGE_REL_PPC_BRTAKEN )
-             fprintf (stderr, " BRTAKEN");
-           if ( r_flags & IMAGE_REL_PPC_BRNTAKEN )
-             fprintf (stderr, " BRNTAKEN");
-           if ( r_flags & IMAGE_REL_PPC_TOCDEFN )
-               fprintf (stderr, " TOCDEFN");
-           fprintf(stderr, "\n");
-         }
-#endif
-       
        DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
 
-       switch(r_type) 
+       switch(r_type)
          {
          case IMAGE_REL_PPC_TOCREL16:
-#if 0
-           /* FIXME:
-              This remains unimplemented for now, as it currently adds
-              un-necessary elements to the toc. All we need to do today
-              is not do anything if TOCDEFN is on.
-           */
-           if ( r_flags & IMAGE_REL_PPC_TOCDEFN )
-             toc_offset = ppc_record_data_in_toc_entry(abfd, info, sec, 
-                                                       rel->r_symndx, 
-                                                       default_toc);
-           else
-             toc_offset = ppc_record_toc_entry(abfd, info, sec, 
-                                               rel->r_symndx, default_toc);
-#endif
+           /* if TOCDEFN is on, ignore as someone else has allocated the
+              toc entry */
            if ( (r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN )
-             toc_offset = ppc_record_toc_entry(abfd, info, sec, 
-                                               rel->r_symndx, default_toc);
+             ok = ppc_record_toc_entry(abfd, info, sec,
+                                       rel->r_symndx, default_toc);
+           if (!ok)
+             return false;
            break;
          case IMAGE_REL_PPC_IMGLUE:
            ppc_mark_symbol_as_glue(abfd, rel->r_symndx, rel);
@@ -2090,7 +1778,6 @@ ppc_process_before_allocation (abfd, info)
 
 #endif
 
-
 static bfd_reloc_status_type
 ppc_refhi_reloc (abfd,
                 reloc_entry,
@@ -2099,13 +1786,13 @@ ppc_refhi_reloc (abfd,
                 input_section,
                 output_bfd,
                 error_message)
-     bfd *abfd;
-     arelent *reloc_entry;
-     asymbol *symbol;
-     PTR data;
-     asection *input_section;
+     bfd *abfd ATTRIBUTE_UNUSED;
+     arelent *reloc_entry ATTRIBUTE_UNUSED;
+     asymbol *symbol ATTRIBUTE_UNUSED;
+     PTR data ATTRIBUTE_UNUSED;
+     asection *input_section ATTRIBUTE_UNUSED;
      bfd *output_bfd;
-     char **error_message;
+     char **error_message ATTRIBUTE_UNUSED;
 {
   UN_IMPL("REFHI");
   DUMP_RELOC("REFHI",reloc_entry);
@@ -2153,13 +1840,13 @@ ppc_pair_reloc (abfd,
                input_section,
                output_bfd,
                error_message)
-     bfd *abfd;
-     arelent *reloc_entry;
-     asymbol *symbol;
-     PTR data;
-     asection *input_section;
+     bfd *abfd ATTRIBUTE_UNUSED;
+     arelent *reloc_entry ATTRIBUTE_UNUSED;
+     asymbol *symbol ATTRIBUTE_UNUSED;
+     PTR data ATTRIBUTE_UNUSED;
+     asection *input_section ATTRIBUTE_UNUSED;
      bfd *output_bfd;
-     char **error_message;
+     char **error_message ATTRIBUTE_UNUSED;
 {
   UN_IMPL("PAIR");
   DUMP_RELOC("PAIR",reloc_entry);
@@ -2169,7 +1856,6 @@ ppc_pair_reloc (abfd,
 
   return bfd_reloc_undefined;
 }
-
 \f
 static bfd_reloc_status_type
 ppc_toc16_reloc (abfd,
@@ -2179,13 +1865,13 @@ ppc_toc16_reloc (abfd,
                 input_section,
                 output_bfd,
                 error_message)
-     bfd *abfd;
-     arelent *reloc_entry;
-     asymbol *symbol;
-     PTR data;
-     asection *input_section;
+     bfd *abfd ATTRIBUTE_UNUSED;
+     arelent *reloc_entry ATTRIBUTE_UNUSED;
+     asymbol *symbol ATTRIBUTE_UNUSED;
+     PTR data ATTRIBUTE_UNUSED;
+     asection *input_section ATTRIBUTE_UNUSED;
      bfd *output_bfd;
-     char **error_message;
+     char **error_message ATTRIBUTE_UNUSED;
 {
   UN_IMPL("TOCREL16");
   DUMP_RELOC("TOCREL16",reloc_entry);
@@ -2238,13 +1924,13 @@ ppc_secrel_reloc (abfd,
                  input_section,
                  output_bfd,
                  error_message)
-     bfd *abfd;
-     arelent *reloc_entry;
-     asymbol *symbol;
-     PTR data;
-     asection *input_section;
+     bfd *abfd ATTRIBUTE_UNUSED;
+     arelent *reloc_entry ATTRIBUTE_UNUSED;
+     asymbol *symbol ATTRIBUTE_UNUSED;
+     PTR data ATTRIBUTE_UNUSED;
+     asection *input_section ATTRIBUTE_UNUSED;
      bfd *output_bfd;
-     char **error_message;
+     char **error_message ATTRIBUTE_UNUSED;
 {
   UN_IMPL("SECREL");
   DUMP_RELOC("SECREL",reloc_entry);
@@ -2263,13 +1949,13 @@ ppc_section_reloc (abfd,
                   input_section,
                   output_bfd,
                   error_message)
-     bfd *abfd;
-     arelent *reloc_entry;
-     asymbol *symbol;
-     PTR data;
-     asection *input_section;
+     bfd *abfd ATTRIBUTE_UNUSED;
+     arelent *reloc_entry ATTRIBUTE_UNUSED;
+     asymbol *symbol ATTRIBUTE_UNUSED;
+     PTR data ATTRIBUTE_UNUSED;
+     asection *input_section ATTRIBUTE_UNUSED;
      bfd *output_bfd;
-     char **error_message;
+     char **error_message ATTRIBUTE_UNUSED;
 {
   UN_IMPL("SECTION");
   DUMP_RELOC("SECTION",reloc_entry);
@@ -2288,13 +1974,13 @@ ppc_imglue_reloc (abfd,
                  input_section,
                  output_bfd,
                  error_message)
-     bfd *abfd;
-     arelent *reloc_entry;
-     asymbol *symbol;
-     PTR data;
-     asection *input_section;
+     bfd *abfd ATTRIBUTE_UNUSED;
+     arelent *reloc_entry ATTRIBUTE_UNUSED;
+     asymbol *symbol ATTRIBUTE_UNUSED;
+     PTR data ATTRIBUTE_UNUSED;
+     asection *input_section ATTRIBUTE_UNUSED;
      bfd *output_bfd;
-     char **error_message;
+     char **error_message ATTRIBUTE_UNUSED;
 {
   UN_IMPL("IMGLUE");
   DUMP_RELOC("IMGLUE",reloc_entry);
@@ -2304,15 +1990,12 @@ ppc_imglue_reloc (abfd,
 
   return bfd_reloc_ok;
 }
-
 \f
-
 #define MAX_RELOC_INDEX  \
-      (sizeof(ppc_coff_howto_table) / sizeof(ppc_coff_howto_table[0]) - 1)
-
+      (sizeof (ppc_coff_howto_table) / sizeof (ppc_coff_howto_table[0]) - 1)
 
 /* FIXME: There is a possiblity that when we read in a reloc from a file,
-          that there are some bits encoded in the upper portion of the 
+          that there are some bits encoded in the upper portion of the
          type field. Not yet implemented.
 */
 static void ppc_coff_rtype2howto PARAMS ((arelent *relent,
@@ -2322,7 +2005,7 @@ static void
 ppc_coff_rtype2howto (relent, internal)
      arelent *relent;
      struct internal_reloc *internal;
-{  
+{
 
   /* We can encode one of three things in the type field, aside from the
      type:
@@ -2339,42 +2022,15 @@ ppc_coff_rtype2howto (relent, internal)
   unsigned short r_flags = EXTRACT_FLAGS(internal->r_type);
   unsigned short junk    = EXTRACT_JUNK (internal->r_type);
 
-  /* the masking process only slices off the bottom byte for r_type. */
-  if ( r_type > MAX_RELOC_INDEX ) 
-    {
-      fprintf(stderr, 
-             "ppc_coff_rtype2howto: reloc index %d out of range [%d, %ld]\n",
-             internal->r_type, 0, (long) MAX_RELOC_INDEX);
-      abort();
-    }
+  /* the masking process only slices off the bottom byte for r_type.  */
+  if ( r_type > MAX_RELOC_INDEX )
+    abort ();
 
   /* check for absolute crap */
   if ( junk != 0 )
-    {
-      fprintf(stderr, 
-             "ppc_coff_rtype2howto: reloc index %d contains junk %d\n",
-             internal->r_type, junk);
-      abort();
-    }
-
-#ifdef DEBUG_RELOC
-  /* now examine flags */
-  if (r_flags != 0) 
-    {
-      fprintf (stderr, "Reloc with flags found!");
-      if ( r_flags & IMAGE_REL_PPC_NEG ) 
-       fprintf (stderr, " NEG");
-      if ( r_flags & IMAGE_REL_PPC_BRTAKEN )
-       fprintf (stderr, " BRTAKEN");
-      if ( r_flags & IMAGE_REL_PPC_BRNTAKEN )
-       fprintf (stderr, " BRNTAKEN");
-      if ( r_flags & IMAGE_REL_PPC_TOCDEFN )
-       fprintf (stderr, " TOCDEFN");
-      fprintf(stderr, "\n");
-    }
-#endif
+    abort ();
 
-  switch(r_type) 
+  switch(r_type)
     {
     case IMAGE_REL_PPC_ADDR16:
     case IMAGE_REL_PPC_REL24:
@@ -2399,25 +2055,25 @@ ppc_coff_rtype2howto (relent, internal)
        howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16;
       break;
     default:
-      fprintf(stderr, 
-             "Warning: Unsupported reloc %s [%d] used -- it may not work.\n",
+      fprintf (stderr,
+             _("Warning: Unsupported reloc %s [%d] used -- it may not work.\n"),
              ppc_coff_howto_table[r_type].name,
              r_type);
-      howto = ppc_coff_howto_table + r_type;      
+      howto = ppc_coff_howto_table + r_type;
       break;
     }
-  
+
   relent->howto = howto;
-  
+
 }
 
 static reloc_howto_type *
 coff_ppc_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
-     bfd *abfd;
+     bfd *abfd ATTRIBUTE_UNUSED;
      asection *sec;
      struct internal_reloc *rel;
-     struct coff_link_hash_entry *h;
-     struct internal_syment *sym;
+     struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
+     struct internal_syment *sym ATTRIBUTE_UNUSED;
      bfd_vma *addendp;
 {
   reloc_howto_type *howto;
@@ -2437,42 +2093,15 @@ coff_ppc_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
   unsigned short r_flags = EXTRACT_FLAGS(rel->r_type);
   unsigned short junk    = EXTRACT_JUNK (rel->r_type);
 
-  /* the masking process only slices off the bottom byte for r_type. */
-  if ( r_type > MAX_RELOC_INDEX ) 
-    {
-      fprintf(stderr, 
-             "coff_ppc_rtype_to_howto: index %d out of range [%d, %ld]\n",
-             r_type, 0, (long) MAX_RELOC_INDEX);
-      abort();
-    }
-  
+  /* the masking process only slices off the bottom byte for r_type.  */
+  if ( r_type > MAX_RELOC_INDEX )
+    abort ();
+
   /* check for absolute crap */
   if ( junk != 0 )
-    {
-      fprintf(stderr, 
-             "coff_ppc_rtype_to_howto: reloc index %d contains junk %d\n",
-             rel->r_type, junk);
-      abort();
-    }
-  
-#ifdef DEBUG_RELOC
-  /* now examine flags */
-  if (r_flags != 0) 
-    {
-      fprintf (stderr, "Reloc with flags found!");
-      if ( r_flags & IMAGE_REL_PPC_NEG ) 
-       fprintf (stderr, " NEG");
-      if ( r_flags & IMAGE_REL_PPC_BRTAKEN )
-       fprintf (stderr, " BRTAKEN");
-      if ( r_flags & IMAGE_REL_PPC_BRNTAKEN )
-       fprintf (stderr, " BRNTAKEN");
-      if ( r_flags & IMAGE_REL_PPC_TOCDEFN )
-       fprintf (stderr, " TOCDEFN");
-      fprintf(stderr, "\n");
-    }
-#endif
-  
-  switch(r_type) 
+    abort ();
+
+  switch(r_type)
     {
     case IMAGE_REL_PPC_ADDR32NB:
       DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
@@ -2501,18 +2130,17 @@ coff_ppc_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
       howto = ppc_coff_howto_table + r_type;
       break;
     default:
-      fprintf(stderr, 
-             "Warning: Unsupported reloc %s [%d] used -- it may not work.\n",
+      fprintf (stderr,
+             _("Warning: Unsupported reloc %s [%d] used -- it may not work.\n"),
              ppc_coff_howto_table[r_type].name,
              r_type);
       howto = ppc_coff_howto_table + r_type;
       break;
     }
-  
+
   return howto;
 }
 
-
 /* a cheesy little macro to make the code a little more readable */
 #define HOW2MAP(bfd_rtype,ppc_rtype)  \
  case bfd_rtype: return &ppc_coff_howto_table[ppc_rtype]
@@ -2522,15 +2150,9 @@ PARAMS ((bfd *, bfd_reloc_code_real_type));
 
 static reloc_howto_type *
 ppc_coff_reloc_type_lookup (abfd, code)
-     bfd *abfd;
+     bfd *abfd ATTRIBUTE_UNUSED;
      bfd_reloc_code_real_type code;
 {
-  
-#ifdef DEBUG_RELOC
-  fprintf(stderr, "ppc_coff_reloc_type_lookup for %s\n",
-         bfd_get_reloc_code_name(code));
-#endif
-
   switch (code)
     {
       HOW2MAP(BFD_RELOC_32_GOTOFF,    IMAGE_REL_PPC_IMGLUE);
@@ -2542,49 +2164,62 @@ ppc_coff_reloc_type_lookup (abfd, code)
       HOW2MAP(BFD_RELOC_16_GOTOFF,    IMAGE_REL_PPC_TOCREL16_DEFN);
       HOW2MAP(BFD_RELOC_32,           IMAGE_REL_PPC_ADDR32);
       HOW2MAP(BFD_RELOC_RVA,          IMAGE_REL_PPC_ADDR32NB);
-    default: 
+    default:
       return NULL;
     }
-  
-  return NULL;
+  /*NOTREACHED*/
 }
 
 #undef HOW2MAP
-
 \f
-/* Tailor coffcode.h -- macro heaven. */
+/* Tailor coffcode.h -- macro heaven.  */
 
 #define RTYPE2HOWTO(cache_ptr, dst)  ppc_coff_rtype2howto (cache_ptr, dst)
 
-#ifndef COFF_IMAGE_WITH_PE
-static void
-ppc_coff_swap_sym_in_hook ();
-#endif
-
 /* We use the special COFF backend linker, with our own special touch.  */
 
 #define coff_bfd_reloc_type_lookup   ppc_coff_reloc_type_lookup
 #define coff_rtype_to_howto          coff_ppc_rtype_to_howto
 #define coff_relocate_section        coff_ppc_relocate_section
-#define coff_bfd_final_link          ppc_bfd_coff_final_link 
+#define coff_bfd_final_link          ppc_bfd_coff_final_link
 
 #ifndef COFF_IMAGE_WITH_PE
+/* FIXME: This no longer works.  */
+#if 0
 #define coff_swap_sym_in_hook        ppc_coff_swap_sym_in_hook
 #endif
+#endif
 
 #define SELECT_RELOC(internal, howto) {internal.r_type=howto->type;}
 
 #define COFF_PAGE_SIZE                       0x1000
 
+/* FIXME: This controls some code that used to be in peicode.h and is
+   now in peigen.c.  It will not control the code in peigen.c.  If
+   anybody wants to get this working, you will need to fix that.  */
 #define POWERPC_LE_PE
 
-#include "coffcode.h"
+#define COFF_SECTION_ALIGNMENT_ENTRIES \
+{ COFF_SECTION_NAME_EXACT_MATCH (".idata$2"), \
+  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
+{ COFF_SECTION_NAME_EXACT_MATCH (".idata$3"), \
+  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
+{ COFF_SECTION_NAME_EXACT_MATCH (".idata$4"), \
+  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
+{ COFF_SECTION_NAME_EXACT_MATCH (".idata$5"), \
+  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
+{ COFF_SECTION_NAME_EXACT_MATCH (".idata$6"), \
+  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 1 }, \
+{ COFF_SECTION_NAME_EXACT_MATCH (".reloc"), \
+  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 1 }
 
+#include "coffcode.h"
 \f
-
 #ifndef COFF_IMAGE_WITH_PE
+/* FIXME: This no longer works.  */
+#if 0
 /* FIXME:
-   What we're trying to do here is allocate a toc section (early), and attach 
+   What we're trying to do here is allocate a toc section (early), and attach
    it to the last bfd to be processed. This avoids the problem of having a toc
    written out before all files have been processed. This code allocates
    a toc section for every file, and records the last one seen. There are
@@ -2596,11 +2231,12 @@ ppc_coff_swap_sym_in_hook ();
    3. Doing it on a "swap in" hook depends on when the "swap in" is called,
       and how often, etc. It's not clear to me that there isn't a hole here.
 */
+static void ppc_coff_swap_sym_in_hook PARAMS ((bfd *, PTR, PTR));
 
 static void
 ppc_coff_swap_sym_in_hook (abfd, ext1, in1)
      bfd            *abfd;
-     PTR ext1;
+     PTR ext1 ATTRIBUTE_UNUSED;
      PTR in1;
 {
   struct internal_syment      *in = (struct internal_syment *)in1;
@@ -2614,28 +2250,21 @@ ppc_coff_swap_sym_in_hook (abfd, ext1, in1)
       register asection *s;
 
       s = bfd_get_section_by_name ( abfd , TOC_SECTION_NAME);
-      if (s != NULL) 
+      if (s != NULL)
        {
          return;
        }
 
       flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY ;
 
-#ifdef TOC_DEBUG
-      fprintf(stderr,
-             "ppc_coff_swap_sym_in_hook: about to create the %s section\n",
-             TOC_SECTION_NAME);
-#endif
-
       s = bfd_make_section (abfd, TOC_SECTION_NAME);
 
       if (s == NULL
          || !bfd_set_section_flags (abfd, s, flags)
          || !bfd_set_section_alignment (abfd, s, 2))
        {
-         fprintf(stderr,
-                 "toc section allocation failed!\n");
-         abort();
+         /* FIXME: set appropriate bfd error */
+         abort ();
        }
 
       /* save the bfd for later allocation */
@@ -2645,14 +2274,15 @@ ppc_coff_swap_sym_in_hook (abfd, ext1, in1)
   return;
 }
 #endif
-
-boolean
-ppc_bfd_coff_final_link ();
+#endif
 
 #ifndef COFF_IMAGE_WITH_PE
 
+static boolean ppc_do_last PARAMS ((bfd *));
+static bfd *ppc_get_last PARAMS ((void));
+
 static boolean
-ppc_do_last(abfd)
+ppc_do_last (abfd)
      bfd *abfd;
 {
   if (abfd == bfd_of_toc_owner)
@@ -2668,18 +2298,16 @@ ppc_get_last()
 }
 
 /* this piece of machinery exists only to guarantee that the bfd that holds
-   the toc section is written last. 
+   the toc section is written last.
 
    This does depend on bfd_make_section attaching a new section to the
-   end of the section list for the bfd. 
+   end of the section list for the bfd.
 
-   This is otherwise intended to be functionally the same as 
-   cofflink.c:_bfd_coff_final_link(). It is specifically different only 
-   where the POWERPC_LE_PE macro modifies the code. It is left in as a 
+   This is otherwise intended to be functionally the same as
+   cofflink.c:_bfd_coff_final_link(). It is specifically different only
+   where the POWERPC_LE_PE macro modifies the code. It is left in as a
    precise form of comment. krk@cygnus.com
 */
-#define POWERPC_LE_PE
-
 
 /* Do the final link step.  */
 
@@ -2693,11 +2321,11 @@ ppc_bfd_coff_final_link (abfd, info)
   boolean debug_merge_allocated;
   asection *o;
   struct bfd_link_order *p;
-  size_t max_sym_count;
-  size_t max_lineno_count;
-  size_t max_reloc_count;
-  size_t max_output_reloc_count;
-  size_t max_contents_size;
+  bfd_size_type max_sym_count;
+  bfd_size_type max_lineno_count;
+  bfd_size_type max_reloc_count;
+  bfd_size_type max_output_reloc_count;
+  bfd_size_type max_contents_size;
   file_ptr rel_filepos;
   unsigned int relsz;
   file_ptr line_filepos;
@@ -2705,6 +2333,7 @@ ppc_bfd_coff_final_link (abfd, info)
   bfd *sub;
   bfd_byte *external_relocs = NULL;
   char strbuf[STRING_SIZE_SIZE];
+  bfd_size_type amt;
 
   symesz = bfd_coff_symesz (abfd);
 
@@ -2713,6 +2342,7 @@ ppc_bfd_coff_final_link (abfd, info)
   finfo.strtab = NULL;
   finfo.section_info = NULL;
   finfo.last_file_index = -1;
+  finfo.last_bf_index = -1;
   finfo.internal_syms = NULL;
   finfo.sec_ptrs = NULL;
   finfo.sym_indices = NULL;
@@ -2735,7 +2365,10 @@ ppc_bfd_coff_final_link (abfd, info)
 
   /* Compute the file positions for all the sections.  */
   if (! abfd->output_has_begun)
-    bfd_coff_compute_section_file_positions (abfd);
+    {
+      if (! bfd_coff_compute_section_file_positions (abfd))
+       return false;
+    }
 
   /* Count the line numbers and relocation entries required for the
      output file.  Set the file positions for the relocs.  */
@@ -2801,10 +2434,9 @@ ppc_bfd_coff_final_link (abfd, info)
 
       /* We use section_count + 1, rather than section_count, because
          the target_index fields are 1 based.  */
-      finfo.section_info =
-       ((struct coff_link_section_info *)
-        bfd_malloc ((abfd->section_count + 1)
-                    * sizeof (struct coff_link_section_info)));
+      amt = abfd->section_count + 1;
+      amt *= sizeof (struct coff_link_section_info);
+      finfo.section_info = (struct coff_link_section_info *) bfd_malloc (amt);
       if (finfo.section_info == NULL)
        goto error_return;
       for (i = 0; i <= abfd->section_count; i++)
@@ -2845,13 +2477,14 @@ ppc_bfd_coff_final_link (abfd, info)
             but only when doing a relocateable link, which is not the
             common case.  */
          BFD_ASSERT (info->relocateable);
+         amt = o->reloc_count;
+         amt *= sizeof (struct internal_reloc);
          finfo.section_info[o->target_index].relocs =
-           ((struct internal_reloc *)
-            bfd_malloc (o->reloc_count * sizeof (struct internal_reloc)));
+           (struct internal_reloc *) bfd_malloc (amt);
+         amt = o->reloc_count;
+         amt *= sizeof (struct coff_link_hash_entry *);
          finfo.section_info[o->target_index].rel_hashes =
-           ((struct coff_link_hash_entry **)
-            bfd_malloc (o->reloc_count
-                    * sizeof (struct coff_link_hash_entry *)));
+           (struct coff_link_hash_entry **) bfd_malloc (amt);
          if (finfo.section_info[o->target_index].relocs == NULL
              || finfo.section_info[o->target_index].rel_hashes == NULL)
            goto error_return;
@@ -2874,7 +2507,7 @@ ppc_bfd_coff_final_link (abfd, info)
   max_sym_count = 0;
   for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
     {
-      size_t sz;
+      bfd_size_type sz;
 
       sub->output_has_begun = false;
       sz = obj_raw_syment_count (sub);
@@ -2883,22 +2516,23 @@ ppc_bfd_coff_final_link (abfd, info)
     }
 
   /* Allocate some buffers used while linking.  */
-  finfo.internal_syms = ((struct internal_syment *)
-                        bfd_malloc (max_sym_count
-                                    * sizeof (struct internal_syment)));
-  finfo.sec_ptrs = (asection **) bfd_malloc (max_sym_count
-                                            * sizeof (asection *));
-  finfo.sym_indices = (long *) bfd_malloc (max_sym_count * sizeof (long));
-  finfo.outsyms = ((bfd_byte *)
-                  bfd_malloc ((size_t) ((max_sym_count + 1) * symesz)));
-  finfo.linenos = (bfd_byte *) bfd_malloc (max_lineno_count
-                                      * bfd_coff_linesz (abfd));
+  amt = max_sym_count * sizeof (struct internal_syment);
+  finfo.internal_syms = (struct internal_syment *) bfd_malloc (amt);
+  amt = max_sym_count * sizeof (asection *);
+  finfo.sec_ptrs = (asection **) bfd_malloc (amt);
+  amt = max_sym_count * sizeof (long);
+  finfo.sym_indices = (long *) bfd_malloc (amt);
+  amt = (max_sym_count + 1) * symesz;
+  finfo.outsyms = (bfd_byte *) bfd_malloc (amt);
+  amt = max_lineno_count * bfd_coff_linesz (abfd);
+  finfo.linenos = (bfd_byte *) bfd_malloc (amt);
   finfo.contents = (bfd_byte *) bfd_malloc (max_contents_size);
   finfo.external_relocs = (bfd_byte *) bfd_malloc (max_reloc_count * relsz);
   if (! info->relocateable)
-    finfo.internal_relocs = ((struct internal_reloc *)
-                            bfd_malloc (max_reloc_count
-                                        * sizeof (struct internal_reloc)));
+    {
+      amt = max_reloc_count * sizeof (struct internal_reloc);
+      finfo.internal_relocs = (struct internal_reloc *) bfd_malloc (amt);
+    }
   if ((finfo.internal_syms == NULL && max_sym_count > 0)
       || (finfo.sec_ptrs == NULL && max_sym_count > 0)
       || (finfo.sym_indices == NULL && max_sym_count > 0)
@@ -2960,7 +2594,6 @@ ppc_bfd_coff_final_link (abfd, info)
 
 #ifdef POWERPC_LE_PE
   {
-    extern bfd* ppc_get_last();
     bfd* last_one = ppc_get_last();
     if (last_one)
       {
@@ -3018,14 +2651,14 @@ ppc_bfd_coff_final_link (abfd, info)
   if (finfo.last_file_index != -1
       && (unsigned int) finfo.last_file.n_value != obj_raw_syment_count (abfd))
     {
+      file_ptr pos;
+
       finfo.last_file.n_value = obj_raw_syment_count (abfd);
       bfd_coff_swap_sym_out (abfd, (PTR) &finfo.last_file,
                             (PTR) finfo.outsyms);
-      if (bfd_seek (abfd,
-                   (obj_sym_filepos (abfd)
-                    + finfo.last_file_index * symesz),
-                   SEEK_SET) != 0
-         || bfd_write (finfo.outsyms, symesz, 1, abfd) != symesz)
+      pos = obj_sym_filepos (abfd) + finfo.last_file_index * symesz;
+      if (bfd_seek (abfd, pos, SEEK_SET) != 0
+         || bfd_bwrite (finfo.outsyms, symesz, abfd) != symesz)
        return false;
     }
 
@@ -3048,8 +2681,8 @@ ppc_bfd_coff_final_link (abfd, info)
       /* Now that we have written out all the global symbols, we know
         the symbol indices to use for relocs against them, and we can
         finally write out the relocs.  */
-      external_relocs = ((bfd_byte *)
-                        bfd_malloc (max_output_reloc_count * relsz));
+      amt = max_output_reloc_count * relsz;
+      external_relocs = (bfd_byte *) bfd_malloc (amt);
       if (external_relocs == NULL)
        goto error_return;
 
@@ -3077,9 +2710,9 @@ ppc_bfd_coff_final_link (abfd, info)
              bfd_coff_swap_reloc_out (abfd, (PTR) irel, (PTR) erel);
            }
 
+         amt = relsz * o->reloc_count;
          if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0
-             || bfd_write ((PTR) external_relocs, relsz, o->reloc_count,
-                           abfd) != relsz * o->reloc_count)
+             || bfd_bwrite ((PTR) external_relocs, amt, abfd) != amt)
            goto error_return;
        }
 
@@ -3103,24 +2736,32 @@ ppc_bfd_coff_final_link (abfd, info)
       finfo.section_info = NULL;
     }
 
+  /* If we have optimized stabs strings, output them.  */
+  if (coff_hash_table (info)->stab_info != NULL)
+    {
+      if (! _bfd_write_stab_strings (abfd, &coff_hash_table (info)->stab_info))
+       return false;
+    }
+
   /* Write out the string table.  */
   if (obj_raw_syment_count (abfd) != 0)
     {
-      if (bfd_seek (abfd,
-                   (obj_sym_filepos (abfd)
-                    + obj_raw_syment_count (abfd) * symesz),
-                   SEEK_SET) != 0)
+      file_ptr pos;
+
+      pos = obj_sym_filepos (abfd) + obj_raw_syment_count (abfd) * symesz;
+      if (bfd_seek (abfd, pos, SEEK_SET) != 0)
        return false;
 
 #if STRING_SIZE_SIZE == 4
-      bfd_h_put_32 (abfd,
-                   _bfd_stringtab_size (finfo.strtab) + STRING_SIZE_SIZE,
-                   (bfd_byte *) strbuf);
+      H_PUT_32 (abfd,
+               _bfd_stringtab_size (finfo.strtab) + STRING_SIZE_SIZE,
+               strbuf);
 #else
- #error Change bfd_h_put_32
+ #error Change H_PUT_32 above
 #endif
 
-      if (bfd_write (strbuf, 1, STRING_SIZE_SIZE, abfd) != STRING_SIZE_SIZE)
+      if (bfd_bwrite (strbuf, (bfd_size_type) STRING_SIZE_SIZE, abfd)
+         != STRING_SIZE_SIZE)
        return false;
 
       if (! _bfd_stringtab_emit (abfd, finfo.strtab))
@@ -3175,12 +2816,15 @@ ppc_bfd_coff_final_link (abfd, info)
 }
 #endif
 \f
+/* Forward declaration for use by alternative_target field.  */
+#ifdef TARGET_BIG_SYM
+extern const bfd_target TARGET_BIG_SYM;
+#endif
 
-/* The transfer vectors that lead the outside world to all of the above. */
+/* The transfer vectors that lead the outside world to all of the above.  */
 
 #ifdef TARGET_LITTLE_SYM
-const bfd_target
-TARGET_LITTLE_SYM =
+const bfd_target TARGET_LITTLE_SYM =
 {
   TARGET_LITTLE_NAME,          /* name or coff-arm-little */
   bfd_target_coff_flavour,
@@ -3189,9 +2833,15 @@ TARGET_LITTLE_SYM =
 
   (HAS_RELOC | EXEC_P |                /* FIXME: object flags */
    HAS_LINENO | HAS_DEBUG |
-   HAS_SYMS | HAS_LOCALS | WP_TEXT),
-  
+   HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
+
+#ifndef COFF_WITH_PE
   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
+#else
+  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* section flags */
+   | SEC_LINK_ONCE | SEC_LINK_DUPLICATES),
+#endif
+
   0,                           /* leading char */
   '/',                         /* ar_pad_char */
   15,                          /* ar_max_namelen??? FIXMEmgo */
@@ -3203,14 +2853,14 @@ TARGET_LITTLE_SYM =
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
   bfd_getl32, bfd_getl_signed_32, bfd_putl32,
   bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
-  
+
   {_bfd_dummy_target, coff_object_p,   /* bfd_check_format */
      bfd_generic_archive_p, /* _bfd_dummy_target */ coff_object_p },
   {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
      bfd_false},
   {bfd_false, coff_write_object_contents,      /* bfd_write_contents */
      _bfd_write_archive_contents, bfd_false},
-  
+
   BFD_JUMP_TABLE_GENERIC (coff),
   BFD_JUMP_TABLE_COPY (coff),
   BFD_JUMP_TABLE_CORE (_bfd_nocore),
@@ -3220,25 +2870,37 @@ TARGET_LITTLE_SYM =
   BFD_JUMP_TABLE_WRITE (coff),
   BFD_JUMP_TABLE_LINK (coff),
   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
-  
-  COFF_SWAP_TABLE,
+
+  /* Alternative_target.  */
+#ifdef TARGET_BIG_SYM
+  & TARGET_BIG_SYM,
+#else
+  NULL,
+#endif
+
+  COFF_SWAP_TABLE
 };
 #endif
 
 #ifdef TARGET_BIG_SYM
-const bfd_target
-TARGET_BIG_SYM =
+const bfd_target TARGET_BIG_SYM =
 {
   TARGET_BIG_NAME,
-  bfd_target_coff_flavour,     
+  bfd_target_coff_flavour,
   BFD_ENDIAN_BIG,              /* data byte order is big */
   BFD_ENDIAN_BIG,              /* header byte order is big */
 
   (HAS_RELOC | EXEC_P |                /* FIXME: object flags */
    HAS_LINENO | HAS_DEBUG |
-   HAS_SYMS | HAS_LOCALS | WP_TEXT),
+   HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
 
+#ifndef COFF_WITH_PE
   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
+#else
+  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* section flags */
+   | SEC_LINK_ONCE | SEC_LINK_DUPLICATES),
+#endif
+
   0,                           /* leading char */
   '/',                         /* ar_pad_char */
   15,                          /* ar_max_namelen??? FIXMEmgo */
@@ -3268,7 +2930,14 @@ TARGET_BIG_SYM =
   BFD_JUMP_TABLE_LINK (coff),
   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
 
-  COFF_SWAP_TABLE,
+  /* Alternative_target.  */
+#ifdef TARGET_LITTLE_SYM
+  & TARGET_LITTLE_SYM,
+#else
+  NULL,
+#endif
+
+  COFF_SWAP_TABLE
 };
 
 #endif
This page took 0.068475 seconds and 4 git commands to generate.