2004-02-09 Andrew Cagney <cagney@redhat.com>
[deliverable/binutils-gdb.git] / bfd / elf32-i370.c
index 0715d86d08117cf2ba93171ee176a3db509eac66..80c45f6fd1fac93ff6783f42a6f83aac7f959ee8 100644 (file)
@@ -1,5 +1,6 @@
 /* i370-specific support for 32-bit ELF
 /* i370-specific support for 32-bit ELF
-   Copyright 1994, 95, 96, 97, 98, 2000 Free Software Foundation, Inc.
+   Copyright 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003
+   Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
    Hacked by Linas Vepstas for i370 linas@linas.org
 
    Written by Ian Lance Taylor, Cygnus Support.
    Hacked by Linas Vepstas for i370 linas@linas.org
 
@@ -19,8 +20,6 @@ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
-
-
 /* This file is based on a preliminary PowerPC ELF ABI.
    But its been hacked on for the IBM 360/370 architectures.
    Basically, the 31bit relocation works, and just about everything
 /* This file is based on a preliminary PowerPC ELF ABI.
    But its been hacked on for the IBM 360/370 architectures.
    Basically, the 31bit relocation works, and just about everything
@@ -28,7 +27,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
    dynamic loading to work ...  its never been tested ...
 */
 
    dynamic loading to work ...  its never been tested ...
 */
 
-
 #include "bfd.h"
 #include "sysdep.h"
 #include "bfdlink.h"
 #include "bfd.h"
 #include "sysdep.h"
 #include "bfdlink.h"
@@ -36,33 +34,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "elf-bfd.h"
 #include "elf/i370.h"
 
 #include "elf-bfd.h"
 #include "elf/i370.h"
 
-#define USE_RELA               /* we want RELA relocations, not REL */
-
-/* i370 relocations */
-/* Note that there is really just one relocation that we currently
- * support (and only one that we seem to need, at the moment), and
- * that is the 31-bit address relocation.  Note that the 370/390
- * only supports a 31-bit (2GB) address space.
- */
-enum i370_reloc_type
-{
-  R_I370_NONE          =   0,
-  R_I370_ADDR31                =   1,
-  R_I370_ADDR32                =   2,
-  R_I370_ADDR16                =   3,
-  R_I370_REL31         =   4,
-  R_I370_REL32         =   5,
-  R_I370_ADDR12                =   6,
-  R_I370_REL12         =   7,
-  R_I370_ADDR8         =   8,
-  R_I370_REL8          =   9,
-  R_I370_COPY          =  10,
-  R_I370_RELATIVE      =  11,
-
-  R_I370_max
-};
-
-\f
 static reloc_howto_type *i370_elf_howto_table[ (int)R_I370_max ];
 
 static reloc_howto_type i370_elf_howto_raw[] =
 static reloc_howto_type *i370_elf_howto_table[ (int)R_I370_max ];
 
 static reloc_howto_type i370_elf_howto_raw[] =
@@ -72,150 +43,150 @@ static reloc_howto_type i370_elf_howto_raw[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        false,                 /* pc_relative */
+        FALSE,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_NONE",         /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_NONE",         /* name */
-        false,                 /* partial_inplace */
+        FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* A standard 31 bit relocation.  */
   HOWTO (R_I370_ADDR31,                /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         31,                    /* bitsize */
 
   /* A standard 31 bit relocation.  */
   HOWTO (R_I370_ADDR31,                /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         31,                    /* bitsize */
-        false,                 /* pc_relative */
+        FALSE,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_ADDR31",       /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_ADDR31",       /* name */
-        false,                 /* partial_inplace */
+        FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0x7fffffff,            /* dst_mask */
         0,                     /* src_mask */
         0x7fffffff,            /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* A standard 32 bit relocation.  */
   HOWTO (R_I370_ADDR32,                /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
 
   /* A standard 32 bit relocation.  */
   HOWTO (R_I370_ADDR32,                /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        false,                 /* pc_relative */
+        FALSE,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_ADDR32",       /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_ADDR32",       /* name */
-        false,                 /* partial_inplace */
+        FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* A standard 16 bit relocation.  */
   HOWTO (R_I370_ADDR16,                /* type */
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
 
   /* A standard 16 bit relocation.  */
   HOWTO (R_I370_ADDR16,                /* type */
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        false,                 /* pc_relative */
+        FALSE,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_ADDR16",       /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_ADDR16",       /* name */
-        false,                 /* partial_inplace */
+        FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0xffff,                /* dst_mask */
         0,                     /* src_mask */
         0xffff,                /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* 31-bit PC relative */
   HOWTO (R_I370_REL31,         /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         31,                    /* bitsize */
 
   /* 31-bit PC relative */
   HOWTO (R_I370_REL31,         /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         31,                    /* bitsize */
-        true,                  /* pc_relative */
+        TRUE,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_REL31",        /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_REL31",        /* name */
-        false,                 /* partial_inplace */
+        FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0x7fffffff,            /* dst_mask */
         0,                     /* src_mask */
         0x7fffffff,            /* dst_mask */
-        true),                 /* pcrel_offset */
+        TRUE),                 /* pcrel_offset */
 
   /* 32-bit PC relative */
   HOWTO (R_I370_REL32,         /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
 
   /* 32-bit PC relative */
   HOWTO (R_I370_REL32,         /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        true,                  /* pc_relative */
+        TRUE,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_REL32",        /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_REL32",        /* name */
-        false,                 /* partial_inplace */
+        FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
-        true),                 /* pcrel_offset */
+        TRUE),                 /* pcrel_offset */
 
   /* A standard 12 bit relocation.  */
   HOWTO (R_I370_ADDR12,                /* type */
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         12,                    /* bitsize */
 
   /* A standard 12 bit relocation.  */
   HOWTO (R_I370_ADDR12,                /* type */
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         12,                    /* bitsize */
-        false,                 /* pc_relative */
+        FALSE,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_ADDR12",       /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_ADDR12",       /* name */
-        false,                 /* partial_inplace */
+        FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0xfff,                 /* dst_mask */
         0,                     /* src_mask */
         0xfff,                 /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* 12-bit PC relative */
   HOWTO (R_I370_REL12,         /* type */
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         12,                    /* bitsize */
 
   /* 12-bit PC relative */
   HOWTO (R_I370_REL12,         /* type */
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         12,                    /* bitsize */
-        true,                  /* pc_relative */
+        TRUE,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_REL12",        /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_REL12",        /* name */
-        false,                 /* partial_inplace */
+        FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0xfff,                 /* dst_mask */
         0,                     /* src_mask */
         0xfff,                 /* dst_mask */
-        true),                 /* pcrel_offset */
+        TRUE),                 /* pcrel_offset */
 
   /* A standard 8 bit relocation.  */
   HOWTO (R_I370_ADDR8,         /* type */
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         8,                     /* bitsize */
 
   /* A standard 8 bit relocation.  */
   HOWTO (R_I370_ADDR8,         /* type */
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         8,                     /* bitsize */
-        false,                 /* pc_relative */
+        FALSE,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_ADDR8",        /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_ADDR8",        /* name */
-        false,                 /* partial_inplace */
+        FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0xff,                  /* dst_mask */
         0,                     /* src_mask */
         0xff,                  /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* 8-bit PC relative */
   HOWTO (R_I370_REL8,          /* type */
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         8,                     /* bitsize */
 
   /* 8-bit PC relative */
   HOWTO (R_I370_REL8,          /* type */
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         8,                     /* bitsize */
-        true,                  /* pc_relative */
+        TRUE,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_REL8",         /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_I370_REL8",         /* name */
-        false,                 /* partial_inplace */
+        FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0xff,                  /* dst_mask */
         0,                     /* src_mask */
         0xff,                  /* dst_mask */
-        true),                 /* pcrel_offset */
+        TRUE),                 /* pcrel_offset */
 
   /* This is used only by the dynamic linker.  The symbol should exist
      both in the object being run and in some shared library.  The
 
   /* This is used only by the dynamic linker.  The symbol should exist
      both in the object being run and in some shared library.  The
@@ -226,15 +197,15 @@ static reloc_howto_type i370_elf_howto_raw[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        false,                 /* pc_relative */
+        FALSE,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc,  /* special_function */
         "R_I370_COPY",         /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc,  /* special_function */
         "R_I370_COPY",         /* name */
-        false,                 /* partial_inplace */
+        FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* Used only by the dynamic linker.  When the object is run, this
      longword is set to the load address of the object, plus the
 
   /* Used only by the dynamic linker.  When the object is run, this
      longword is set to the load address of the object, plus the
@@ -243,24 +214,26 @@ static reloc_howto_type i370_elf_howto_raw[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        false,                 /* pc_relative */
+        FALSE,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc,  /* special_function */
         "R_I370_RELATIVE",     /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc,  /* special_function */
         "R_I370_RELATIVE",     /* name */
-        false,                 /* partial_inplace */
+        FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
 };
 
 };
-
 \f
 \f
-static void i370_elf_howto_init PARAMS ((void));
-static void i370_elf_info_to_howto PARAMS ((bfd *abfd, arelent *cache_ptr,
-                                           Elf32_Internal_Rela *dst));
-static boolean i370_elf_set_private_flags PARAMS ((bfd *, flagword));
-
+static void i370_elf_howto_init
+  PARAMS ((void));
+static reloc_howto_type *i370_elf_reloc_type_lookup
+  PARAMS ((bfd *, bfd_reloc_code_real_type));
+static void i370_elf_info_to_howto
+  PARAMS ((bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst));
+static bfd_boolean i370_elf_set_private_flags
+  PARAMS ((bfd *, flagword));
 \f
 /* Initialize the i370_elf_howto_table, so that linear accesses can be done.  */
 
 \f
 /* Initialize the i370_elf_howto_table, so that linear accesses can be done.  */
 
@@ -272,11 +245,10 @@ i370_elf_howto_init ()
   for (i = 0; i < sizeof (i370_elf_howto_raw) / sizeof (i370_elf_howto_raw[0]); i++)
     {
       type = i370_elf_howto_raw[i].type;
   for (i = 0; i < sizeof (i370_elf_howto_raw) / sizeof (i370_elf_howto_raw[0]); i++)
     {
       type = i370_elf_howto_raw[i].type;
-      BFD_ASSERT (type < sizeof(i370_elf_howto_table) / sizeof(i370_elf_howto_table[0]));
+      BFD_ASSERT (type < sizeof (i370_elf_howto_table) / sizeof (i370_elf_howto_table[0]));
       i370_elf_howto_table[type] = &i370_elf_howto_raw[i];
     }
 }
       i370_elf_howto_table[type] = &i370_elf_howto_raw[i];
     }
 }
-
 \f
 static reloc_howto_type *
 i370_elf_reloc_type_lookup (abfd, code)
 \f
 static reloc_howto_type *
 i370_elf_reloc_type_lookup (abfd, code)
@@ -304,60 +276,44 @@ i370_elf_reloc_type_lookup (abfd, code)
   return i370_elf_howto_table[ (int)i370_reloc ];
 };
 
   return i370_elf_howto_table[ (int)i370_reloc ];
 };
 
-static boolean i370_elf_copy_private_bfd_data PARAMS ((bfd *, bfd *));
-static boolean i370_elf_merge_private_bfd_data PARAMS ((bfd *, bfd *));
-
-static boolean i370_elf_relocate_section PARAMS ((bfd *,
-                                                 struct bfd_link_info *info,
-                                                 bfd *,
-                                                 asection *,
-                                                 bfd_byte *,
-                                                 Elf_Internal_Rela *relocs,
-                                                 Elf_Internal_Sym *local_syms,
-                                                 asection **));
-
-static boolean i370_elf_create_dynamic_sections PARAMS ((bfd *,
-                                                        struct bfd_link_info *));
-
-static boolean i370_elf_section_from_shdr PARAMS ((bfd *,
-                                                  Elf32_Internal_Shdr *,
-                                                  char *));
-static boolean i370_elf_fake_sections PARAMS ((bfd *,
-                                              Elf32_Internal_Shdr *,
-                                              asection *));
-#if 0
-static elf_linker_section_t *i370_elf_create_linker_section
-  PARAMS ((bfd *abfd,
-          struct bfd_link_info *info,
-          enum elf_linker_section_enum));
-#endif
-static boolean i370_elf_check_relocs PARAMS ((bfd *,
-                                            struct bfd_link_info *,
-                                            asection *,
-                                            const Elf_Internal_Rela *));
-
-static boolean i370_elf_adjust_dynamic_symbol PARAMS ((struct bfd_link_info *,
-                                                     struct elf_link_hash_entry *));
-
-static boolean i370_elf_adjust_dynindx PARAMS ((struct elf_link_hash_entry *, PTR));
-
-static boolean i370_elf_size_dynamic_sections PARAMS ((bfd *, struct bfd_link_info *));
-
-static boolean i370_elf_finish_dynamic_sections PARAMS ((bfd *, struct bfd_link_info *));
+static bfd_boolean i370_elf_merge_private_bfd_data
+  PARAMS ((bfd *, bfd *));
+static bfd_boolean i370_elf_relocate_section
+  PARAMS ((bfd *, struct bfd_link_info *info, bfd *, asection *, bfd_byte *,
+          Elf_Internal_Rela *relocs, Elf_Internal_Sym *local_syms,
+          asection **));
+static void i370_elf_post_process_headers
+  PARAMS ((bfd *, struct bfd_link_info *));
+static bfd_boolean i370_elf_create_dynamic_sections
+  PARAMS ((bfd *, struct bfd_link_info *));
+static bfd_boolean i370_elf_section_from_shdr
+  PARAMS ((bfd *, Elf_Internal_Shdr *, const char *));
+static bfd_boolean i370_elf_fake_sections
+  PARAMS ((bfd *, Elf_Internal_Shdr *, asection *));
+static bfd_boolean i370_elf_check_relocs
+  PARAMS ((bfd *, struct bfd_link_info *, asection *,
+          const Elf_Internal_Rela *));
+static bfd_boolean i370_elf_adjust_dynamic_symbol
+  PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
+static bfd_boolean i370_elf_adjust_dynindx
+  PARAMS ((struct elf_link_hash_entry *, PTR));
+static bfd_boolean i370_elf_size_dynamic_sections
+  PARAMS ((bfd *, struct bfd_link_info *));
+static bfd_boolean i370_elf_finish_dynamic_sections
+  PARAMS ((bfd *, struct bfd_link_info *));
 
 /* The name of the dynamic interpreter.  This is put in the .interp
     section.  */
 
 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so"
 
 
 /* The name of the dynamic interpreter.  This is put in the .interp
     section.  */
 
 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so"
 
-
 /* Set the howto pointer for an i370 ELF reloc.  */
 
 static void
 i370_elf_info_to_howto (abfd, cache_ptr, dst)
      bfd *abfd ATTRIBUTE_UNUSED;
      arelent *cache_ptr;
 /* Set the howto pointer for an i370 ELF reloc.  */
 
 static void
 i370_elf_info_to_howto (abfd, cache_ptr, dst)
      bfd *abfd ATTRIBUTE_UNUSED;
      arelent *cache_ptr;
-     Elf32_Internal_Rela *dst;
+     Elf_Internal_Rela *dst;
 {
   if (!i370_elf_howto_table[ R_I370_ADDR31 ])  /* Initialize howto table */
     i370_elf_howto_init ();
 {
   if (!i370_elf_howto_table[ R_I370_ADDR31 ])  /* Initialize howto table */
     i370_elf_howto_init ();
@@ -369,8 +325,8 @@ i370_elf_info_to_howto (abfd, cache_ptr, dst)
 /* hack alert --  the following several routines look generic to me ...
  * why are we bothering with them ???
  */
 /* hack alert --  the following several routines look generic to me ...
  * why are we bothering with them ???
  */
-/* Function to set whether a module needs the -mrelocatable bit set. */
-static boolean
+/* Function to set whether a module needs the -mrelocatable bit set.  */
+static bfd_boolean
 i370_elf_set_private_flags (abfd, flags)
      bfd *abfd;
      flagword flags;
 i370_elf_set_private_flags (abfd, flags)
      bfd *abfd;
      flagword flags;
@@ -379,31 +335,13 @@ i370_elf_set_private_flags (abfd, flags)
              || elf_elfheader (abfd)->e_flags == flags);
 
   elf_elfheader (abfd)->e_flags = flags;
              || elf_elfheader (abfd)->e_flags == flags);
 
   elf_elfheader (abfd)->e_flags = flags;
-  elf_flags_init (abfd) = true;
-  return true;
-}
-
-/* Copy backend specific data from one object module to another */
-static boolean
-i370_elf_copy_private_bfd_data (ibfd, obfd)
-     bfd *ibfd;
-     bfd *obfd;
-{
-  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
-      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
-    return true;
-
-  BFD_ASSERT (!elf_flags_init (obfd)
-             || elf_elfheader (obfd)->e_flags == elf_elfheader (ibfd)->e_flags);
-
-  elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
-  elf_flags_init (obfd) = true;
-  return true;
+  elf_flags_init (abfd) = TRUE;
+  return TRUE;
 }
 
 /* Merge backend specific data from an object file to the output
    object file when linking */
 }
 
 /* Merge backend specific data from an object file to the output
    object file when linking */
-static boolean
+static bfd_boolean
 i370_elf_merge_private_bfd_data (ibfd, obfd)
      bfd *ibfd;
      bfd *obfd;
 i370_elf_merge_private_bfd_data (ibfd, obfd)
      bfd *ibfd;
      bfd *obfd;
@@ -413,13 +351,13 @@ i370_elf_merge_private_bfd_data (ibfd, obfd)
 
   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
 
   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
-    return true;
+    return TRUE;
 
   new_flags = elf_elfheader (ibfd)->e_flags;
   old_flags = elf_elfheader (obfd)->e_flags;
   if (!elf_flags_init (obfd))  /* First call, no flags set */
     {
 
   new_flags = elf_elfheader (ibfd)->e_flags;
   old_flags = elf_elfheader (obfd)->e_flags;
   if (!elf_flags_init (obfd))  /* First call, no flags set */
     {
-      elf_flags_init (obfd) = true;
+      elf_flags_init (obfd) = TRUE;
       elf_elfheader (obfd)->e_flags = new_flags;
     }
 
       elf_elfheader (obfd)->e_flags = new_flags;
     }
 
@@ -430,15 +368,14 @@ i370_elf_merge_private_bfd_data (ibfd, obfd)
     {
       (*_bfd_error_handler)
        ("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)",
     {
       (*_bfd_error_handler)
        ("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)",
-        bfd_get_filename (ibfd), (long)new_flags, (long)old_flags);
+        bfd_archive_filename (ibfd), (long) new_flags, (long) old_flags);
 
       bfd_set_error (bfd_error_bad_value);
 
       bfd_set_error (bfd_error_bad_value);
-      return false;
+      return FALSE;
     }
 
     }
 
-  return true;
+  return TRUE;
 }
 }
-
 \f
 /* Handle an i370 specific section when reading an object file.  This
    is called when elfcode.h finds a section with an unknown type.  */
 \f
 /* Handle an i370 specific section when reading an object file.  This
    is called when elfcode.h finds a section with an unknown type.  */
@@ -447,17 +384,17 @@ i370_elf_merge_private_bfd_data (ibfd, obfd)
  * just enough to allow glibc-2.1 ld.so to compile & link.
  */
 
  * just enough to allow glibc-2.1 ld.so to compile & link.
  */
 
-static boolean
+static bfd_boolean
 i370_elf_section_from_shdr (abfd, hdr, name)
      bfd *abfd;
 i370_elf_section_from_shdr (abfd, hdr, name)
      bfd *abfd;
-     Elf32_Internal_Shdr *hdr;
-     char *name;
+     Elf_Internal_Shdr *hdr;
+     const char *name;
 {
   asection *newsect;
   flagword flags;
 
   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
 {
   asection *newsect;
   flagword flags;
 
   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
-    return false;
+    return FALSE;
 
   newsect = hdr->bfd_section;
   flags = bfd_get_section_flags (abfd, newsect);
 
   newsect = hdr->bfd_section;
   flags = bfd_get_section_flags (abfd, newsect);
@@ -468,10 +405,8 @@ i370_elf_section_from_shdr (abfd, hdr, name)
     flags |= SEC_SORT_ENTRIES;
 
   bfd_set_section_flags (abfd, newsect, flags);
     flags |= SEC_SORT_ENTRIES;
 
   bfd_set_section_flags (abfd, newsect, flags);
-  return true;
+  return TRUE;
 }
 }
-
-
 \f
 /* Set up any other section flags and such that may be necessary.  */
 /* XXX hack alert bogus This routine is mostly all junk and almost
 \f
 /* Set up any other section flags and such that may be necessary.  */
 /* XXX hack alert bogus This routine is mostly all junk and almost
@@ -479,11 +414,10 @@ i370_elf_section_from_shdr (abfd, hdr, name)
  * just enough to allow glibc-2.1 ld.so to compile & link.
  */
 
  * just enough to allow glibc-2.1 ld.so to compile & link.
  */
 
-
-static boolean
+static bfd_boolean
 i370_elf_fake_sections (abfd, shdr, asect)
      bfd *abfd ATTRIBUTE_UNUSED;
 i370_elf_fake_sections (abfd, shdr, asect)
      bfd *abfd ATTRIBUTE_UNUSED;
-     Elf32_Internal_Shdr *shdr;
+     Elf_Internal_Shdr *shdr;
      asection *asect;
 {
   if ((asect->flags & SEC_EXCLUDE) != 0)
      asection *asect;
 {
   if ((asect->flags & SEC_EXCLUDE) != 0)
@@ -492,87 +426,8 @@ i370_elf_fake_sections (abfd, shdr, asect)
   if ((asect->flags & SEC_SORT_ENTRIES) != 0)
     shdr->sh_type = SHT_ORDERED;
 
   if ((asect->flags & SEC_SORT_ENTRIES) != 0)
     shdr->sh_type = SHT_ORDERED;
 
-  return true;
-}
-
-\f
-#if 0
-/* Create a special linker section */
-/* XXX hack alert bogus This routine is mostly all junk and almost
- * certainly does the wrong thing.  Its here simply because it does
- * just enough to allow glibc-2.1 ld.so to compile & link.
- */
-
-static elf_linker_section_t *
-i370_elf_create_linker_section (abfd, info, which)
-     bfd *abfd;
-     struct bfd_link_info *info;
-     enum elf_linker_section_enum which;
-{
-  bfd *dynobj = elf_hash_table (info)->dynobj;
-  elf_linker_section_t *lsect;
-
-  /* Record the first bfd section that needs the special section */
-  if (!dynobj)
-    dynobj = elf_hash_table (info)->dynobj = abfd;
-
-  /* If this is the first time, create the section */
-  lsect = elf_linker_section (dynobj, which);
-  if (!lsect)
-    {
-      elf_linker_section_t defaults;
-      static elf_linker_section_t zero_section;
-
-      defaults = zero_section;
-      defaults.which = which;
-      defaults.hole_written_p = false;
-      defaults.alignment = 2;
-
-      /* Both of these sections are (technically) created by the user
-        putting data in them, so they shouldn't be marked
-        SEC_LINKER_CREATED.
-
-        The linker creates them so it has somewhere to attach their
-        respective symbols. In fact, if they were empty it would
-        be OK to leave the symbol set to 0 (or any random number), because
-        the appropriate register should never be used.  */
-      defaults.flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
-                       | SEC_IN_MEMORY);
-
-      switch (which)
-       {
-       default:
-         (*_bfd_error_handler) ("%s: Unknown special linker type %d",
-                                bfd_get_filename (abfd),
-                                (int)which);
-
-         bfd_set_error (bfd_error_bad_value);
-         return (elf_linker_section_t *)0;
-
-       case LINKER_SECTION_SDATA:      /* .sdata/.sbss section */
-         defaults.name           = ".sdata";
-         defaults.rel_name       = ".rela.sdata";
-         defaults.bss_name       = ".sbss";
-         defaults.sym_name       = "_SDA_BASE_";
-         defaults.sym_offset     = 32768;
-         break;
-
-       case LINKER_SECTION_SDATA2:     /* .sdata2/.sbss2 section */
-         defaults.name           = ".sdata2";
-         defaults.rel_name       = ".rela.sdata2";
-         defaults.bss_name       = ".sbss2";
-         defaults.sym_name       = "_SDA2_BASE_";
-         defaults.sym_offset     = 32768;
-         defaults.flags         |= SEC_READONLY;
-         break;
-       }
-
-      lsect = _bfd_elf_create_linker_section (abfd, info, which, &defaults);
-    }
-
-  return lsect;
+  return TRUE;
 }
 }
-#endif
 \f
 /* We have to create .dynsbss and .rela.sbss here so that they get mapped
    to output sections (just like _bfd_elf_create_dynamic_sections has
 \f
 /* We have to create .dynsbss and .rela.sbss here so that they get mapped
    to output sections (just like _bfd_elf_create_dynamic_sections has
@@ -582,7 +437,7 @@ i370_elf_create_linker_section (abfd, info, which)
  * just enough to allow glibc-2.1 ld.so to compile & link.
  */
 
  * just enough to allow glibc-2.1 ld.so to compile & link.
  */
 
-static boolean
+static bfd_boolean
 i370_elf_create_dynamic_sections (abfd, info)
      bfd *abfd;
      struct bfd_link_info *info;
 i370_elf_create_dynamic_sections (abfd, info)
      bfd *abfd;
      struct bfd_link_info *info;
@@ -591,7 +446,7 @@ i370_elf_create_dynamic_sections (abfd, info)
   flagword flags;
 
   if (!_bfd_elf_create_dynamic_sections(abfd, info))
   flagword flags;
 
   if (!_bfd_elf_create_dynamic_sections(abfd, info))
-    return false;
+    return FALSE;
 
   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
           | SEC_LINKER_CREATED);
 
   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
           | SEC_LINKER_CREATED);
@@ -599,7 +454,7 @@ i370_elf_create_dynamic_sections (abfd, info)
   s = bfd_make_section (abfd, ".dynsbss");
   if (s == NULL
       || ! bfd_set_section_flags (abfd, s, SEC_ALLOC))
   s = bfd_make_section (abfd, ".dynsbss");
   if (s == NULL
       || ! bfd_set_section_flags (abfd, s, SEC_ALLOC))
-    return false;
+    return FALSE;
 
   if (! info->shared)
     {
 
   if (! info->shared)
     {
@@ -607,16 +462,16 @@ i370_elf_create_dynamic_sections (abfd, info)
       if (s == NULL
          || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
          || ! bfd_set_section_alignment (abfd, s, 2))
       if (s == NULL
          || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
          || ! bfd_set_section_alignment (abfd, s, 2))
-       return false;
+       return FALSE;
     }
 
     }
 
-   /* xxx beats me, seem to need a rela.text ... */
+   /* xxx beats me, seem to need a rela.text ...  */
    s = bfd_make_section (abfd, ".rela.text");
    if (s == NULL
       || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
       || ! bfd_set_section_alignment (abfd, s, 2))
    s = bfd_make_section (abfd, ".rela.text");
    if (s == NULL
       || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
       || ! bfd_set_section_alignment (abfd, s, 2))
-    return false;
-  return true;
+    return FALSE;
+  return TRUE;
 }
 
 /* Adjust a symbol defined by a dynamic object and referenced by a
 }
 
 /* Adjust a symbol defined by a dynamic object and referenced by a
@@ -629,7 +484,7 @@ i370_elf_create_dynamic_sections (abfd, info)
  * just enough to allow glibc-2.1 ld.so to compile & link.
  */
 
  * just enough to allow glibc-2.1 ld.so to compile & link.
  */
 
-static boolean
+static bfd_boolean
 i370_elf_adjust_dynamic_symbol (info, h)
      struct bfd_link_info *info;
      struct elf_link_hash_entry *h;
 i370_elf_adjust_dynamic_symbol (info, h)
      struct bfd_link_info *info;
      struct elf_link_hash_entry *h;
@@ -654,7 +509,6 @@ i370_elf_adjust_dynamic_symbol (info, h)
                      && (h->elf_link_hash_flags
                          & ELF_LINK_HASH_DEF_REGULAR) == 0)));
 
                      && (h->elf_link_hash_flags
                          & ELF_LINK_HASH_DEF_REGULAR) == 0)));
 
-
   s = bfd_get_section_by_name (dynobj, ".rela.text");
   BFD_ASSERT (s != NULL);
   s->_raw_size += sizeof (Elf32_External_Rela);
   s = bfd_get_section_by_name (dynobj, ".rela.text");
   BFD_ASSERT (s != NULL);
   s->_raw_size += sizeof (Elf32_External_Rela);
@@ -668,7 +522,7 @@ i370_elf_adjust_dynamic_symbol (info, h)
                  || h->weakdef->root.type == bfd_link_hash_defweak);
       h->root.u.def.section = h->weakdef->root.u.def.section;
       h->root.u.def.value = h->weakdef->root.u.def.value;
                  || h->weakdef->root.type == bfd_link_hash_defweak);
       h->root.u.def.section = h->weakdef->root.u.def.section;
       h->root.u.def.value = h->weakdef->root.u.def.value;
-      return true;
+      return TRUE;
     }
 
   /* This is a reference to a symbol defined by a dynamic object which
     }
 
   /* This is a reference to a symbol defined by a dynamic object which
@@ -679,7 +533,7 @@ i370_elf_adjust_dynamic_symbol (info, h)
      For such cases we need not do anything here; the relocations will
      be handled correctly by relocate_section.  */
   if (info->shared)
      For such cases we need not do anything here; the relocations will
      be handled correctly by relocate_section.  */
   if (info->shared)
-    return true;
+    return TRUE;
 
   /* We must allocate the symbol in our .dynbss section, which will
      become part of the .bss section of the executable.  There will be
 
   /* We must allocate the symbol in our .dynbss section, which will
      become part of the .bss section of the executable.  There will be
@@ -730,7 +584,7 @@ i370_elf_adjust_dynamic_symbol (info, h)
   if (power_of_two > bfd_get_section_alignment (dynobj, s))
     {
       if (! bfd_set_section_alignment (dynobj, s, power_of_two))
   if (power_of_two > bfd_get_section_alignment (dynobj, s))
     {
       if (! bfd_set_section_alignment (dynobj, s, power_of_two))
-       return false;
+       return FALSE;
     }
 
   /* Define the symbol as being at this point in the section.  */
     }
 
   /* Define the symbol as being at this point in the section.  */
@@ -740,9 +594,8 @@ i370_elf_adjust_dynamic_symbol (info, h)
   /* Increment the section size to make room for the symbol.  */
   s->_raw_size += h->size;
 
   /* Increment the section size to make room for the symbol.  */
   s->_raw_size += h->size;
 
-  return true;
+  return TRUE;
 }
 }
-
 \f
 /* Increment the index of a dynamic symbol by a given amount.  Called
    via elf_link_hash_traverse.  */
 \f
 /* Increment the index of a dynamic symbol by a given amount.  Called
    via elf_link_hash_traverse.  */
@@ -751,7 +604,7 @@ i370_elf_adjust_dynamic_symbol (info, h)
  * just enough to allow glibc-2.1 ld.so to compile & link.
  */
 
  * just enough to allow glibc-2.1 ld.so to compile & link.
  */
 
-static boolean
+static bfd_boolean
 i370_elf_adjust_dynindx (h, cparg)
      struct elf_link_hash_entry *h;
      PTR cparg;
 i370_elf_adjust_dynindx (h, cparg)
      struct elf_link_hash_entry *h;
      PTR cparg;
@@ -764,12 +617,14 @@ i370_elf_adjust_dynindx (h, cparg)
           h->dynindx, *cp);
 #endif
 
           h->dynindx, *cp);
 #endif
 
+  if (h->root.type == bfd_link_hash_warning)
+    h = (struct elf_link_hash_entry *) h->root.u.i.link;
+
   if (h->dynindx != -1)
     h->dynindx += *cp;
 
   if (h->dynindx != -1)
     h->dynindx += *cp;
 
-  return true;
+  return TRUE;
 }
 }
-
 \f
 /* Set the sizes of the dynamic sections.  */
 /* XXX hack alert bogus This routine is mostly all junk and almost
 \f
 /* Set the sizes of the dynamic sections.  */
 /* XXX hack alert bogus This routine is mostly all junk and almost
@@ -777,16 +632,16 @@ i370_elf_adjust_dynindx (h, cparg)
  * just enough to allow glibc-2.1 ld.so to compile & link.
  */
 
  * just enough to allow glibc-2.1 ld.so to compile & link.
  */
 
-static boolean
+static bfd_boolean
 i370_elf_size_dynamic_sections (output_bfd, info)
      bfd *output_bfd;
      struct bfd_link_info *info;
 {
   bfd *dynobj;
   asection *s;
 i370_elf_size_dynamic_sections (output_bfd, info)
      bfd *output_bfd;
      struct bfd_link_info *info;
 {
   bfd *dynobj;
   asection *s;
-  boolean plt;
-  boolean relocs;
-  boolean reltext;
+  bfd_boolean plt;
+  bfd_boolean relocs;
+  bfd_boolean reltext;
 
 #ifdef DEBUG
   fprintf (stderr, "i370_elf_size_dynamic_sections called\n");
 
 #ifdef DEBUG
   fprintf (stderr, "i370_elf_size_dynamic_sections called\n");
@@ -798,7 +653,7 @@ i370_elf_size_dynamic_sections (output_bfd, info)
   if (elf_hash_table (info)->dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
   if (elf_hash_table (info)->dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
-      if (! info->shared)
+      if (info->executable)
        {
          s = bfd_get_section_by_name (dynobj, ".interp");
          BFD_ASSERT (s != NULL);
        {
          s = bfd_get_section_by_name (dynobj, ".interp");
          BFD_ASSERT (s != NULL);
@@ -829,13 +684,13 @@ i370_elf_size_dynamic_sections (output_bfd, info)
   /* The check_relocs and adjust_dynamic_symbol entry points have
      determined the sizes of the various dynamic sections.  Allocate
      memory for them.  */
   /* The check_relocs and adjust_dynamic_symbol entry points have
      determined the sizes of the various dynamic sections.  Allocate
      memory for them.  */
-  plt = false;
-  relocs = false;
-  reltext = false;
+  plt = FALSE;
+  relocs = FALSE;
+  reltext = FALSE;
   for (s = dynobj->sections; s != NULL; s = s->next)
     {
       const char *name;
   for (s = dynobj->sections; s != NULL; s = s->next)
     {
       const char *name;
-      boolean strip;
+      bfd_boolean strip;
 
       if ((s->flags & SEC_LINKER_CREATED) == 0)
        continue;
 
       if ((s->flags & SEC_LINKER_CREATED) == 0)
        continue;
@@ -843,7 +698,7 @@ i370_elf_size_dynamic_sections (output_bfd, info)
       /* It's OK to base decisions on the section name, because none
         of the dynobj section names depend upon the input files.  */
       name = bfd_get_section_name (dynobj, s);
       /* It's OK to base decisions on the section name, because none
         of the dynobj section names depend upon the input files.  */
       name = bfd_get_section_name (dynobj, s);
-      strip = false;
+      strip = FALSE;
 
       if (strcmp (name, ".plt") == 0)
        {
 
       if (strcmp (name, ".plt") == 0)
        {
@@ -851,12 +706,12 @@ i370_elf_size_dynamic_sections (output_bfd, info)
            {
              /* Strip this section if we don't need it; see the
                  comment below.  */
            {
              /* Strip this section if we don't need it; see the
                  comment below.  */
-             strip = true;
+             strip = TRUE;
            }
          else
            {
              /* Remember whether there is a PLT.  */
            }
          else
            {
              /* Remember whether there is a PLT.  */
-             plt = true;
+             plt = TRUE;
            }
        }
       else if (strncmp (name, ".rela", 5) == 0)
            }
        }
       else if (strncmp (name, ".rela", 5) == 0)
@@ -872,15 +727,15 @@ i370_elf_size_dynamic_sections (output_bfd, info)
                 adjust_dynamic_symbol is called, and it is that
                 function which decides whether anything needs to go
                 into these sections.  */
                 adjust_dynamic_symbol is called, and it is that
                 function which decides whether anything needs to go
                 into these sections.  */
-             strip = true;
+             strip = TRUE;
            }
          else
            {
              asection *target;
              const char *outname;
 
            }
          else
            {
              asection *target;
              const char *outname;
 
-             /* Remember whether there are any relocation sections. */
-             relocs = true;
+             /* Remember whether there are any relocation sections.  */
+             relocs = TRUE;
 
              /* If this relocation section applies to a read only
                 section, then we probably need a DT_TEXTREL entry.  */
 
              /* If this relocation section applies to a read only
                 section, then we probably need a DT_TEXTREL entry.  */
@@ -890,7 +745,7 @@ i370_elf_size_dynamic_sections (output_bfd, info)
              if (target != NULL
                  && (target->flags & SEC_READONLY) != 0
                  && (target->flags & SEC_ALLOC) != 0)
              if (target != NULL
                  && (target->flags & SEC_READONLY) != 0
                  && (target->flags & SEC_ALLOC) != 0)
-               reltext = true;
+               reltext = TRUE;
 
              /* We use the reloc_count field as a counter if we need
                 to copy relocs into the output file.  */
 
              /* We use the reloc_count field as a counter if we need
                 to copy relocs into the output file.  */
@@ -910,18 +765,22 @@ i370_elf_size_dynamic_sections (output_bfd, info)
          asection **spp;
 
          for (spp = &s->output_section->owner->sections;
          asection **spp;
 
          for (spp = &s->output_section->owner->sections;
-              *spp != s->output_section;
+              *spp != NULL;
               spp = &(*spp)->next)
               spp = &(*spp)->next)
-           ;
-         *spp = s->output_section->next;
-         --s->output_section->owner->section_count;
-
+           {
+             if (*spp == s->output_section)
+               {
+                 bfd_section_list_remove (s->output_section->owner, spp);
+                 --s->output_section->owner->section_count;
+                 break;
+               }
+           }
          continue;
        }
       /* Allocate memory for the section contents.  */
       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
       if (s->contents == NULL && s->_raw_size != 0)
          continue;
        }
       /* Allocate memory for the section contents.  */
       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
       if (s->contents == NULL && s->_raw_size != 0)
-       return false;
+       return FALSE;
     }
 
   if (elf_hash_table (info)->dynamic_sections_created)
     }
 
   if (elf_hash_table (info)->dynamic_sections_created)
@@ -931,36 +790,40 @@ i370_elf_size_dynamic_sections (output_bfd, info)
         must add the entries now so that we get the correct size for
         the .dynamic section.  The DT_DEBUG entry is filled in by the
         dynamic linker and used by the debugger.  */
         must add the entries now so that we get the correct size for
         the .dynamic section.  The DT_DEBUG entry is filled in by the
         dynamic linker and used by the debugger.  */
-      if (! info->shared)
+#define add_dynamic_entry(TAG, VAL) \
+  bfd_elf32_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
+
+      if (!info->shared)
        {
        {
-         if (! bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0))
-           return false;
+         if (!add_dynamic_entry (DT_DEBUG, 0))
+           return FALSE;
        }
 
       if (plt)
        {
        }
 
       if (plt)
        {
-         if (! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0)
-             || ! bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0)
-             || ! bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
-             || ! bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0))
-           return false;
+         if (!add_dynamic_entry (DT_PLTGOT, 0)
+             || !add_dynamic_entry (DT_PLTRELSZ, 0)
+             || !add_dynamic_entry (DT_PLTREL, DT_RELA)
+             || !add_dynamic_entry (DT_JMPREL, 0))
+           return FALSE;
        }
 
       if (relocs)
        {
        }
 
       if (relocs)
        {
-         if (! bfd_elf32_add_dynamic_entry (info, DT_RELA, 0)
-             || ! bfd_elf32_add_dynamic_entry (info, DT_RELASZ, 0)
-             || ! bfd_elf32_add_dynamic_entry (info, DT_RELAENT,
-                                               sizeof (Elf32_External_Rela)))
-           return false;
+         if (!add_dynamic_entry (DT_RELA, 0)
+             || !add_dynamic_entry (DT_RELASZ, 0)
+             || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
+           return FALSE;
        }
 
       if (reltext)
        {
        }
 
       if (reltext)
        {
-         if (! bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0))
-           return false;
+         if (!add_dynamic_entry (DT_TEXTREL, 0))
+           return FALSE;
+         info->flags |= DF_TEXTREL;
        }
     }
        }
     }
+#undef add_dynamic_entry
 
   /* If we are generating a shared library, we generate a section
      symbol for each output section.  These are local symbols, which
 
   /* If we are generating a shared library, we generate a section
      symbol for each output section.  These are local symbols, which
@@ -971,7 +834,7 @@ i370_elf_size_dynamic_sections (output_bfd, info)
      FIXME: We assume that there will never be relocations to
      locations in linker-created sections that do not have
      externally-visible names. Instead, we should work out precisely
      FIXME: We assume that there will never be relocations to
      locations in linker-created sections that do not have
      externally-visible names. Instead, we should work out precisely
-     which sections relocations are targetted at.  */
+     which sections relocations are targeted at.  */
   if (info->shared)
     {
       int c;
   if (info->shared)
     {
       int c;
@@ -999,9 +862,8 @@ i370_elf_size_dynamic_sections (output_bfd, info)
       elf_hash_table (info)->dynsymcount += c;
     }
 
       elf_hash_table (info)->dynsymcount += c;
     }
 
-  return true;
+  return TRUE;
 }
 }
-
 \f
 /* Look through the relocs for a section during the first phase, and
    allocate space in the global offset table or procedure linkage
 \f
 /* Look through the relocs for a section during the first phase, and
    allocate space in the global offset table or procedure linkage
@@ -1011,7 +873,7 @@ i370_elf_size_dynamic_sections (output_bfd, info)
  * just enough to allow glibc-2.1 ld.so to compile & link.
  */
 
  * just enough to allow glibc-2.1 ld.so to compile & link.
  */
 
-static boolean
+static bfd_boolean
 i370_elf_check_relocs (abfd, info, sec, relocs)
      bfd *abfd;
      struct bfd_link_info *info;
 i370_elf_check_relocs (abfd, info, sec, relocs)
      bfd *abfd;
      struct bfd_link_info *info;
@@ -1026,13 +888,13 @@ i370_elf_check_relocs (abfd, info, sec, relocs)
   bfd_vma *local_got_offsets;
   asection *sreloc;
 
   bfd_vma *local_got_offsets;
   asection *sreloc;
 
-  if (info->relocateable)
-    return true;
+  if (info->relocatable)
+    return TRUE;
 
 #ifdef DEBUG
   fprintf (stderr, "i370_elf_check_relocs called for section %s in %s\n",
           bfd_get_section_name (abfd, sec),
 
 #ifdef DEBUG
   fprintf (stderr, "i370_elf_check_relocs called for section %s in %s\n",
           bfd_get_section_name (abfd, sec),
-          bfd_get_filename (abfd));
+          bfd_archive_filename (abfd));
 #endif
 
   dynobj = elf_hash_table (info)->dynobj;
 #endif
 
   dynobj = elf_hash_table (info)->dynobj;
@@ -1071,7 +933,7 @@ i370_elf_check_relocs (abfd, info, sec, relocs)
                       elf_elfheader (abfd)->e_shstrndx,
                       elf_section_data (sec)->rel_hdr.sh_name));
              if (name == NULL)
                       elf_elfheader (abfd)->e_shstrndx,
                       elf_section_data (sec)->rel_hdr.sh_name));
              if (name == NULL)
-               return false;
+               return FALSE;
 
              BFD_ASSERT (strncmp (name, ".rela", 5) == 0
                          && strcmp (bfd_get_section_name (abfd, sec), name + 5) == 0);
 
              BFD_ASSERT (strncmp (name, ".rela", 5) == 0
                          && strcmp (bfd_get_section_name (abfd, sec), name + 5) == 0);
@@ -1089,7 +951,7 @@ i370_elf_check_relocs (abfd, info, sec, relocs)
                  if (sreloc == NULL
                      || ! bfd_set_section_flags (dynobj, sreloc, flags)
                      || ! bfd_set_section_alignment (dynobj, sreloc, 2))
                  if (sreloc == NULL
                      || ! bfd_set_section_flags (dynobj, sreloc, flags)
                      || ! bfd_set_section_alignment (dynobj, sreloc, 2))
-                   return false;
+                   return FALSE;
                }
            }
 
                }
            }
 
@@ -1104,9 +966,8 @@ i370_elf_check_relocs (abfd, info, sec, relocs)
        }
     }
 
        }
     }
 
-  return true;
+  return TRUE;
 }
 }
-
 \f
 /* Finish up the dynamic sections.  */
 /* XXX hack alert bogus This routine is mostly all junk and almost
 \f
 /* Finish up the dynamic sections.  */
 /* XXX hack alert bogus This routine is mostly all junk and almost
@@ -1114,7 +975,7 @@ i370_elf_check_relocs (abfd, info, sec, relocs)
  * just enough to allow glibc-2.1 ld.so to compile & link.
  */
 
  * just enough to allow glibc-2.1 ld.so to compile & link.
  */
 
-static boolean
+static bfd_boolean
 i370_elf_finish_dynamic_sections (output_bfd, info)
      bfd *output_bfd;
      struct bfd_link_info *info;
 i370_elf_finish_dynamic_sections (output_bfd, info)
      bfd *output_bfd;
      struct bfd_link_info *info;
@@ -1143,16 +1004,16 @@ i370_elf_finish_dynamic_sections (output_bfd, info)
        {
          Elf_Internal_Dyn dyn;
          const char *name;
        {
          Elf_Internal_Dyn dyn;
          const char *name;
-         boolean size;
+         bfd_boolean size;
 
          bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
 
          switch (dyn.d_tag)
            {
 
          bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
 
          switch (dyn.d_tag)
            {
-           case DT_PLTGOT:   name = ".plt";      size = false; break;
-           case DT_PLTRELSZ: name = ".rela.plt"; size = true;  break;
-           case DT_JMPREL:   name = ".rela.plt"; size = false; break;
-           default:          name = NULL;        size = false; break;
+           case DT_PLTGOT:   name = ".plt";      size = FALSE; break;
+           case DT_PLTRELSZ: name = ".rela.plt"; size = TRUE;  break;
+           case DT_JMPREL:   name = ".rela.plt"; size = FALSE; break;
+           default:          name = NULL;        size = FALSE; break;
            }
 
          if (name != NULL)
            }
 
          if (name != NULL)
@@ -1185,7 +1046,7 @@ i370_elf_finish_dynamic_sections (output_bfd, info)
   if (sgot)
     {
       unsigned char *contents = sgot->contents;
   if (sgot)
     {
       unsigned char *contents = sgot->contents;
-      bfd_put_32 (output_bfd, 0x4e800021 /* blrl */, contents);
+      bfd_put_32 (output_bfd, (bfd_vma) 0x4e800021 /* blrl */, contents);
 
       if (sdyn == NULL)
        bfd_put_32 (output_bfd, (bfd_vma) 0, contents+4);
 
       if (sdyn == NULL)
        bfd_put_32 (output_bfd, (bfd_vma) 0, contents+4);
@@ -1217,6 +1078,7 @@ i370_elf_finish_dynamic_sections (output_bfd, info)
       for (s = output_bfd->sections; s != NULL; s = s->next)
        {
          int indx, dindx;
       for (s = output_bfd->sections; s != NULL; s = s->next)
        {
          int indx, dindx;
+         Elf32_External_Sym *esym;
 
          sym.st_value = s->vma;
 
 
          sym.st_value = s->vma;
 
@@ -1232,10 +1094,8 @@ i370_elf_finish_dynamic_sections (output_bfd, info)
 
              sym.st_shndx = indx;
 
 
              sym.st_shndx = indx;
 
-             bfd_elf32_swap_symbol_out (output_bfd, &sym,
-                                        (PTR) (((Elf32_External_Sym *)
-                                                sdynsym->contents)
-                                               + dindx));
+             esym = (Elf32_External_Sym *) sdynsym->contents + dindx;
+             bfd_elf32_swap_symbol_out (output_bfd, &sym, (PTR) esym, (PTR) 0);
            }
        }
 
            }
        }
 
@@ -1245,9 +1105,8 @@ i370_elf_finish_dynamic_sections (output_bfd, info)
        maxdindx + 1;
     }
 
        maxdindx + 1;
     }
 
-  return true;
+  return TRUE;
 }
 }
-
 \f
 /* The RELOCATE_SECTION function is called by the ELF backend linker
    to handle the relocations for a section.
 \f
 /* The RELOCATE_SECTION function is called by the ELF backend linker
    to handle the relocations for a section.
@@ -1258,7 +1117,7 @@ i370_elf_finish_dynamic_sections (output_bfd, info)
 
    This function is responsible for adjust the section contents as
    necessary, and (if using Rela relocs and generating a
 
    This function is responsible for adjust the section contents as
    necessary, and (if using Rela relocs and generating a
-   relocateable output file) adjusting the reloc addend as
+   relocatable output file) adjusting the reloc addend as
    necessary.
 
    This function does not have to worry about setting the reloc
    necessary.
 
    This function does not have to worry about setting the reloc
@@ -1272,15 +1131,15 @@ i370_elf_finish_dynamic_sections (output_bfd, info)
    The global hash table entry for the global symbols can be found
    via elf_sym_hashes (input_bfd).
 
    The global hash table entry for the global symbols can be found
    via elf_sym_hashes (input_bfd).
 
-   When generating relocateable output, this function must handle
+   When generating relocatable output, this function must handle
    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
    going to be the section symbol corresponding to the output
    section, which means that the addend must be adjusted
    accordingly.  */
 
    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
    going to be the section symbol corresponding to the output
    section, which means that the addend must be adjusted
    accordingly.  */
 
-static boolean
+static bfd_boolean
 i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
 i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
-                         contents, relocs, local_syms, local_sections)
+                          contents, relocs, local_syms, local_sections)
      bfd *output_bfd;
      struct bfd_link_info *info;
      bfd *input_bfd;
      bfd *output_bfd;
      struct bfd_link_info *info;
      bfd *input_bfd;
@@ -1290,21 +1149,24 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
      Elf_Internal_Sym *local_syms;
      asection **local_sections;
 {
      Elf_Internal_Sym *local_syms;
      asection **local_sections;
 {
-  Elf_Internal_Shdr *symtab_hdr                  = &elf_tdata (input_bfd)->symtab_hdr;
+  Elf_Internal_Shdr *symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
   struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
   struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
-  bfd *dynobj                            = elf_hash_table (info)->dynobj;
-  Elf_Internal_Rela *rel                 = relocs;
-  Elf_Internal_Rela *relend              = relocs + input_section->reloc_count;
-  asection *sreloc                       = NULL;
+  bfd *dynobj = elf_hash_table (info)->dynobj;
+  Elf_Internal_Rela *rel = relocs;
+  Elf_Internal_Rela *relend = relocs + input_section->reloc_count;
+  asection *sreloc = NULL;
   bfd_vma *local_got_offsets;
   bfd_vma *local_got_offsets;
-  boolean ret                            = true;
+  bfd_boolean ret = TRUE;
+
+  if (info->relocatable)
+    return TRUE;
 
 #ifdef DEBUG
   fprintf (stderr, "i370_elf_relocate_section called for %s section %s, %ld relocations%s\n",
 
 #ifdef DEBUG
   fprintf (stderr, "i370_elf_relocate_section called for %s section %s, %ld relocations%s\n",
-          bfd_get_filename (input_bfd),
+          bfd_archive_filename (input_bfd),
           bfd_section_name(input_bfd, input_section),
           bfd_section_name(input_bfd, input_section),
-          (long)input_section->reloc_count,
-          (info->relocateable) ? " (relocatable)" : "");
+          (long) input_section->reloc_count,
+          (info->relocatable) ? " (relocatable)" : "");
 #endif
 
   if (!i370_elf_howto_table[ R_I370_ADDR31 ])  /* Initialize howto table if needed */
 #endif
 
   if (!i370_elf_howto_table[ R_I370_ADDR31 ])  /* Initialize howto table if needed */
@@ -1331,54 +1193,25 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
          || !i370_elf_howto_table[(int)r_type])
        {
          (*_bfd_error_handler) ("%s: unknown relocation type %d",
          || !i370_elf_howto_table[(int)r_type])
        {
          (*_bfd_error_handler) ("%s: unknown relocation type %d",
-                                bfd_get_filename (input_bfd),
-                                (int)r_type);
+                                bfd_archive_filename (input_bfd),
+                                (int) r_type);
 
          bfd_set_error (bfd_error_bad_value);
 
          bfd_set_error (bfd_error_bad_value);
-         ret = false;
+         ret = FALSE;
          continue;
        }
 
       howto = i370_elf_howto_table[(int)r_type];
       r_symndx = ELF32_R_SYM (rel->r_info);
 
          continue;
        }
 
       howto = i370_elf_howto_table[(int)r_type];
       r_symndx = ELF32_R_SYM (rel->r_info);
 
-      if (info->relocateable)
-       {
-         /* This is a relocateable link.  We don't have to change
-            anything, unless the reloc is against a section symbol,
-            in which case we have to adjust according to where the
-            section symbol winds up in the output section.  */
-         if (r_symndx < symtab_hdr->sh_info)
-           {
-             sym = local_syms + r_symndx;
-             if ((unsigned)ELF_ST_TYPE (sym->st_info) == STT_SECTION)
-               {
-                 sec = local_sections[r_symndx];
-                 addend = rel->r_addend += sec->output_offset + sym->st_value;
-               }
-           }
-
-#ifdef DEBUG
-         fprintf (stderr, "\ttype = %s (%d), symbol index = %ld, offset = %ld, addend = %ld\n",
-                  howto->name,
-                  (int)r_type,
-                  r_symndx,
-                  (long)offset,
-                  (long)addend);
-#endif
-         continue;
-       }
-
-      /* This is a final link.  */
       if (r_symndx < symtab_hdr->sh_info)
        {
          sym = local_syms + r_symndx;
          sec = local_sections[r_symndx];
          sym_name = "<local symbol>";
 
       if (r_symndx < symtab_hdr->sh_info)
        {
          sym = local_syms + r_symndx;
          sec = local_sections[r_symndx];
          sym_name = "<local symbol>";
 
-         relocation = (sec->output_section->vma
-                       + sec->output_offset
-                       + sym->st_value);
+         relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
+         addend = rel->r_addend;
        }
       else
        {
        }
       else
        {
@@ -1418,26 +1251,30 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
            relocation = 0;
          else
            {
            relocation = 0;
          else
            {
-             (*info->callbacks->undefined_symbol)(info,
-                                                  h->root.root.string,
-                                                  input_bfd,
-                                                  input_section,
-                                                  rel->r_offset,
-                                                  true);
-             ret = false;
+             (*info->callbacks->undefined_symbol) (info,
+                                                   h->root.root.string,
+                                                   input_bfd,
+                                                   input_section,
+                                                   rel->r_offset,
+                                                   TRUE);
+             ret = FALSE;
              continue;
            }
        }
 
              continue;
            }
        }
 
-      switch ((int)r_type)
+      switch ((int) r_type)
        {
        default:
        {
        default:
-         (*_bfd_error_handler) ("%s: unknown relocation type %d for symbol %s",
-                                bfd_get_filename (input_bfd),
-                                (int)r_type, sym_name);
+         (*_bfd_error_handler)
+           ("%s: unknown relocation type %d for symbol %s",
+            bfd_archive_filename (input_bfd),
+            (int) r_type, sym_name);
 
          bfd_set_error (bfd_error_bad_value);
 
          bfd_set_error (bfd_error_bad_value);
-         ret = false;
+         ret = FALSE;
+         continue;
+
+       case (int)R_I370_NONE:
          continue;
 
        /* Relocations that may need to be propagated if this is a shared
          continue;
 
        /* Relocations that may need to be propagated if this is a shared
@@ -1452,13 +1289,14 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
 
        /* Relocations that always need to be propagated if this is a shared
            object.  */
 
        /* Relocations that always need to be propagated if this is a shared
            object.  */
-       case (int)R_I370_NONE:
        case (int)R_I370_ADDR31:
        case (int)R_I370_ADDR16:
        case (int)R_I370_ADDR31:
        case (int)R_I370_ADDR16:
-         if (info->shared)
+         if (info->shared
+             && r_symndx != 0)
            {
              Elf_Internal_Rela outrel;
            {
              Elf_Internal_Rela outrel;
-             boolean skip;
+             bfd_byte *loc;
+             int skip;
 
 #ifdef DEBUG
              fprintf (stderr,
 
 #ifdef DEBUG
              fprintf (stderr,
@@ -1479,7 +1317,7 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                           elf_elfheader (input_bfd)->e_shstrndx,
                           elf_section_data (input_section)->rel_hdr.sh_name));
                  if (name == NULL)
                           elf_elfheader (input_bfd)->e_shstrndx,
                           elf_section_data (input_section)->rel_hdr.sh_name));
                  if (name == NULL)
-                   return false;
+                   return FALSE;
 
                  BFD_ASSERT (strncmp (name, ".rela", 5) == 0
                              && strcmp (bfd_get_section_name (input_bfd,
 
                  BFD_ASSERT (strncmp (name, ".rela", 5) == 0
                              && strcmp (bfd_get_section_name (input_bfd,
@@ -1490,24 +1328,14 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                  BFD_ASSERT (sreloc != NULL);
                }
 
                  BFD_ASSERT (sreloc != NULL);
                }
 
-             skip = false;
-
-             if (elf_section_data (input_section)->stab_info == NULL)
-               outrel.r_offset = rel->r_offset;
-             else
-               {
-                 bfd_vma off;
-
-                 off = (_bfd_stab_section_offset
-                        (output_bfd, &elf_hash_table (info)->stab_info,
-                         input_section,
-                         &elf_section_data (input_section)->stab_info,
-                         rel->r_offset));
-                 if (off == (bfd_vma) -1)
-                   skip = true;
-                 outrel.r_offset = off;
-               }
+             skip = 0;
 
 
+             outrel.r_offset =
+               _bfd_elf_section_offset (output_bfd, info, input_section,
+                                        rel->r_offset);
+             if (outrel.r_offset == (bfd_vma) -1
+                 || outrel.r_offset == (bfd_vma) -2)
+               skip = (int) outrel.r_offset;
              outrel.r_offset += (input_section->output_section->vma
                                  + input_section->output_offset);
 
              outrel.r_offset += (input_section->output_section->vma
                                  + input_section->output_offset);
 
@@ -1535,21 +1363,12 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                    {
                      long indx;
 
                    {
                      long indx;
 
-                     if (h == NULL)
-                       sec = local_sections[r_symndx];
-                     else
-                       {
-                         BFD_ASSERT (h->root.type == bfd_link_hash_defined
-                                     || (h->root.type
-                                         == bfd_link_hash_defweak));
-                         sec = h->root.u.def.section;
-                       }
-                     if (sec != NULL && bfd_is_abs_section (sec))
+                     if (bfd_is_abs_section (sec))
                        indx = 0;
                      else if (sec == NULL || sec->owner == NULL)
                        {
                          bfd_set_error (bfd_error_bad_value);
                        indx = 0;
                      else if (sec == NULL || sec->owner == NULL)
                        {
                          bfd_set_error (bfd_error_bad_value);
-                         return false;
+                         return FALSE;
                        }
                      else
                        {
                        }
                      else
                        {
@@ -1561,9 +1380,9 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
 #ifdef DEBUG
                          if (indx <= 0)
                            {
 #ifdef DEBUG
                          if (indx <= 0)
                            {
-                             printf("indx=%d section=%s flags=%08x name=%s\n",
-                                    indx, osec->name, osec->flags,
-                                    h->root.root.string);
+                             printf ("indx=%d section=%s flags=%08x name=%s\n",
+                                     indx, osec->name, osec->flags,
+                                     h->root.root.string);
                            }
 #endif
                        }
                            }
 #endif
                        }
@@ -1573,16 +1392,14 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                    }
                }
 
                    }
                }
 
-             bfd_elf32_swap_reloca_out (output_bfd, &outrel,
-                                        (((Elf32_External_Rela *)
-                                          sreloc->contents)
-                                         + sreloc->reloc_count));
-             ++sreloc->reloc_count;
+             loc = sreloc->contents;
+             loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
+             bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
 
              /* This reloc will be computed at runtime, so there's no
                  need to do anything now, unless this is a RELATIVE
                  reloc in an unallocated section.  */
 
              /* This reloc will be computed at runtime, so there's no
                  need to do anything now, unless this is a RELATIVE
                  reloc in an unallocated section.  */
-             if (skip
+             if (skip == -1
                  || (input_section->flags & SEC_ALLOC) != 0
                  || ELF32_R_TYPE (outrel.r_info) != R_I370_RELATIVE)
                continue;
                  || (input_section->flags & SEC_ALLOC) != 0
                  || ELF32_R_TYPE (outrel.r_info) != R_I370_RELATIVE)
                continue;
@@ -1591,17 +1408,17 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
 
        case (int)R_I370_COPY:
        case (int)R_I370_RELATIVE:
 
        case (int)R_I370_COPY:
        case (int)R_I370_RELATIVE:
-         (*_bfd_error_handler) ("%s: Relocation %s is not yet supported for symbol %s.",
-                                bfd_get_filename (input_bfd),
-                                i370_elf_howto_table[ (int)r_type ]->name,
-                                sym_name);
+         (*_bfd_error_handler)
+           ("%s: Relocation %s is not yet supported for symbol %s.",
+            bfd_archive_filename (input_bfd),
+            i370_elf_howto_table[(int) r_type]->name,
+            sym_name);
 
          bfd_set_error (bfd_error_invalid_operation);
 
          bfd_set_error (bfd_error_invalid_operation);
-         ret = false;
+         ret = FALSE;
          continue;
        }
 
          continue;
        }
 
-
 #ifdef DEBUG
       fprintf (stderr, "\ttype = %s (%d), name = %s, symbol index = %ld, offset = %ld, addend = %ld\n",
               howto->name,
 #ifdef DEBUG
       fprintf (stderr, "\ttype = %s (%d), name = %s, symbol index = %ld, offset = %ld, addend = %ld\n",
               howto->name,
@@ -1622,7 +1439,7 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
 
       if (r != bfd_reloc_ok)
        {
 
       if (r != bfd_reloc_ok)
        {
-         ret = false;
+         ret = FALSE;
          switch (r)
            {
            default:
          switch (r)
            {
            default:
@@ -1646,13 +1463,13 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                      name = bfd_section_name (input_bfd, sec);
                  }
 
                      name = bfd_section_name (input_bfd, sec);
                  }
 
-               (*info->callbacks->reloc_overflow)(info,
-                                                  name,
-                                                  howto->name,
-                                                  (bfd_vma) 0,
-                                                  input_bfd,
-                                                  input_section,
-                                                  offset);
+               (*info->callbacks->reloc_overflow) (info,
+                                                   name,
+                                                   howto->name,
+                                                   (bfd_vma) 0,
+                                                   input_bfd,
+                                                   input_section,
+                                                   offset);
              }
              break;
 
              }
              break;
 
@@ -1660,7 +1477,6 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
        }
     }
 
        }
     }
 
-
 #ifdef DEBUG
   fprintf (stderr, "\n");
 #endif
 #ifdef DEBUG
   fprintf (stderr, "\n");
 #endif
@@ -1689,14 +1505,12 @@ i370_elf_post_process_headers (abfd, link_info)
 #define ELF_MAXPAGESIZE                0x1000
 #define elf_info_to_howto      i370_elf_info_to_howto
 
 #define ELF_MAXPAGESIZE                0x1000
 #define elf_info_to_howto      i370_elf_info_to_howto
 
-
-
 #define elf_backend_plt_not_loaded 1
 #define elf_backend_got_symbol_offset 4
 #define elf_backend_plt_not_loaded 1
 #define elf_backend_got_symbol_offset 4
+#define elf_backend_rela_normal 1
 
 #define bfd_elf32_bfd_reloc_type_lookup                i370_elf_reloc_type_lookup
 #define bfd_elf32_bfd_set_private_flags                i370_elf_set_private_flags
 
 #define bfd_elf32_bfd_reloc_type_lookup                i370_elf_reloc_type_lookup
 #define bfd_elf32_bfd_set_private_flags                i370_elf_set_private_flags
-#define bfd_elf32_bfd_copy_private_bfd_data    i370_elf_copy_private_bfd_data
 #define bfd_elf32_bfd_merge_private_bfd_data   i370_elf_merge_private_bfd_data
 #define elf_backend_relocate_section           i370_elf_relocate_section
 
 #define bfd_elf32_bfd_merge_private_bfd_data   i370_elf_merge_private_bfd_data
 #define elf_backend_relocate_section           i370_elf_relocate_section
 
@@ -1720,7 +1534,10 @@ i370_elf_post_process_headers (abfd, link_info)
 
 #define elf_backend_post_process_headers       i370_elf_post_process_headers
 
 
 #define elf_backend_post_process_headers       i370_elf_post_process_headers
 
-int i370_noop()
+static int i370_noop
+  PARAMS ((void));
+
+static int i370_noop ()
 {
   return 1;
 }
 {
   return 1;
 }
@@ -1728,16 +1545,16 @@ int i370_noop()
 /* we need to define these at least as no-ops to link glibc ld.so */
 
 #define elf_backend_add_symbol_hook \
 /* we need to define these at least as no-ops to link glibc ld.so */
 
 #define elf_backend_add_symbol_hook \
-  (boolean (*) PARAMS ((bfd *, struct bfd_link_info *, \
-                       const Elf_Internal_Sym *, const char **, flagword *, \
-                       asection **, bfd_vma *)))               i370_noop
+  (bfd_boolean (*) \
+     PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *, \
+             const char **, flagword *, asection **, bfd_vma *))) i370_noop
 #define elf_backend_finish_dynamic_symbol \
 #define elf_backend_finish_dynamic_symbol \
-  (boolean (*) PARAMS ((bfd *, struct bfd_link_info *, \
-                       struct elf_link_hash_entry *, \
-                       Elf_Internal_Sym *)))                   i370_noop
+  (bfd_boolean (*) \
+     PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, \
+             Elf_Internal_Sym *))) i370_noop
 #define elf_backend_additional_program_headers \
 #define elf_backend_additional_program_headers \
-  (int (*) PARAMS ((bfd *)))                                   i370_noop
+  (int (*) PARAMS ((bfd *))) i370_noop
 #define elf_backend_modify_segment_map \
 #define elf_backend_modify_segment_map \
-  (boolean (*) PARAMS ((bfd *)))                               i370_noop
+  (bfd_boolean (*) PARAMS ((bfd *, struct bfd_link_info *))) i370_noop
 
 #include "elf32-target.h"
 
 #include "elf32-target.h"
This page took 0.063168 seconds and 4 git commands to generate.