PR binutils/716
[deliverable/binutils-gdb.git] / bfd / elf32-i370.c
index 4a43496d29d43f44c2a9e0d39fceb7e449738ff6..f4cd9c15c8f28e6dc21e72816fe0a9b447b0fd21 100644 (file)
@@ -1,5 +1,5 @@
 /* i370-specific support for 32-bit ELF
 /* i370-specific support for 32-bit ELF
-   Copyright 1994, 1995, 1996, 1997, 1998, 2000, 2001
+   Copyright 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004
    Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
    Hacked by Linas Vepstas for i370 linas@linas.org
    Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
    Hacked by Linas Vepstas for i370 linas@linas.org
@@ -34,32 +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[] =
@@ -69,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
@@ -223,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
@@ -240,25 +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_howto_init
+  PARAMS ((void));
 static reloc_howto_type *i370_elf_reloc_type_lookup
   PARAMS ((bfd *, bfd_reloc_code_real_type));
 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,
-                                           Elf32_Internal_Rela *dst));
-static boolean i370_elf_set_private_flags PARAMS ((bfd *, flagword));
+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.  */
 
@@ -301,48 +276,31 @@ 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 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 void i370_elf_post_process_headers
   PARAMS ((bfd *, struct bfd_link_info *));
-
-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_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.  */
 
 /* The name of the dynamic interpreter.  This is put in the .interp
     section.  */
@@ -355,7 +313,7 @@ static void
 i370_elf_info_to_howto (abfd, cache_ptr, dst)
      bfd *abfd ATTRIBUTE_UNUSED;
      arelent *cache_ptr;
 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 ();
@@ -368,7 +326,7 @@ i370_elf_info_to_howto (abfd, cache_ptr, dst)
  * why are we bothering with them ???
  */
 /* Function to set whether a module needs the -mrelocatable bit set.  */
  * why are we bothering with them ???
  */
 /* Function to set whether a module needs the -mrelocatable bit set.  */
-static boolean
+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;
@@ -377,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;
@@ -411,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;
     }
 
@@ -427,14 +367,14 @@ i370_elf_merge_private_bfd_data (ibfd, obfd)
   else                                 /* Incompatible flags */
     {
       (*_bfd_error_handler)
   else                                 /* Incompatible flags */
     {
       (*_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);
+       ("%B: uses different e_flags (0x%lx) fields than previous modules (0x%lx)",
+        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
 }
 \f
 /* Handle an i370 specific section when reading an object file.  This
@@ -444,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);
@@ -465,7 +405,7 @@ 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.  */
 }
 \f
 /* Set up any other section flags and such that may be necessary.  */
@@ -474,10 +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)
@@ -486,86 +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
@@ -575,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;
@@ -584,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);
@@ -592,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)
     {
@@ -600,7 +462,7 @@ 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 ...  */
@@ -608,8 +470,8 @@ 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 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
@@ -622,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;
@@ -638,29 +500,26 @@ i370_elf_adjust_dynamic_symbol (info, h)
 
   /* Make sure we know what is going on here.  */
   BFD_ASSERT (dynobj != NULL
 
   /* Make sure we know what is going on here.  */
   BFD_ASSERT (dynobj != NULL
-             && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
-                 || h->weakdef != NULL
-                 || ((h->elf_link_hash_flags
-                      & ELF_LINK_HASH_DEF_DYNAMIC) != 0
-                     && (h->elf_link_hash_flags
-                         & ELF_LINK_HASH_REF_REGULAR) != 0
-                     && (h->elf_link_hash_flags
-                         & ELF_LINK_HASH_DEF_REGULAR) == 0)));
+             && (h->needs_plt
+                 || h->u.weakdef != NULL
+                 || (h->def_dynamic
+                     && h->ref_regular
+                     && !h->def_regular)));
 
   s = bfd_get_section_by_name (dynobj, ".rela.text");
   BFD_ASSERT (s != NULL);
 
   s = bfd_get_section_by_name (dynobj, ".rela.text");
   BFD_ASSERT (s != NULL);
-  s->_raw_size += sizeof (Elf32_External_Rela);
+  s->size += sizeof (Elf32_External_Rela);
 
   /* If this is a weak symbol, and there is a real definition, the
      processor independent code will have arranged for us to see the
      real definition first, and we can just use the same value.  */
 
   /* If this is a weak symbol, and there is a real definition, the
      processor independent code will have arranged for us to see the
      real definition first, and we can just use the same value.  */
-  if (h->weakdef != NULL)
+  if (h->u.weakdef != NULL)
     {
     {
-      BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
-                 || 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;
+      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
+                 || h->u.weakdef->root.type == bfd_link_hash_defweak);
+      h->root.u.def.section = h->u.weakdef->root.u.def.section;
+      h->root.u.def.value = h->u.weakdef->root.u.def.value;
+      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
@@ -671,7 +530,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
@@ -706,8 +565,8 @@ i370_elf_adjust_dynamic_symbol (info, h)
       else
        srel = bfd_get_section_by_name (dynobj, ".rela.bss");
       BFD_ASSERT (srel != NULL);
       else
        srel = bfd_get_section_by_name (dynobj, ".rela.bss");
       BFD_ASSERT (srel != NULL);
-      srel->_raw_size += sizeof (Elf32_External_Rela);
-      h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
+      srel->size += sizeof (Elf32_External_Rela);
+      h->needs_copy = 1;
     }
 
   /* We need to figure out the alignment required for this symbol.  I
     }
 
   /* We need to figure out the alignment required for this symbol.  I
@@ -717,22 +576,21 @@ i370_elf_adjust_dynamic_symbol (info, h)
     power_of_two = 4;
 
   /* Apply the required alignment.  */
     power_of_two = 4;
 
   /* Apply the required alignment.  */
-  s->_raw_size = BFD_ALIGN (s->_raw_size,
-                           (bfd_size_type) (1 << power_of_two));
+  s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
   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.  */
   h->root.u.def.section = s;
     }
 
   /* Define the symbol as being at this point in the section.  */
   h->root.u.def.section = s;
-  h->root.u.def.value = s->_raw_size;
+  h->root.u.def.value = s->size;
 
   /* Increment the section size to make room for the symbol.  */
 
   /* Increment the section size to make room for the symbol.  */
-  s->_raw_size += h->size;
+  s->size += h->size;
 
 
-  return true;
+  return TRUE;
 }
 \f
 /* Increment the index of a dynamic symbol by a given amount.  Called
 }
 \f
 /* Increment the index of a dynamic symbol by a given amount.  Called
@@ -742,7 +600,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;
@@ -755,10 +613,13 @@ 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.  */
 }
 \f
 /* Set the sizes of the dynamic sections.  */
@@ -767,16 +628,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");
@@ -788,11 +649,11 @@ 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);
-         s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
+         s->size = sizeof ELF_DYNAMIC_INTERPRETER;
          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
        }
     }
          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
        }
     }
@@ -812,20 +673,20 @@ i370_elf_size_dynamic_sections (output_bfd, info)
        {
          s = bfd_get_section_by_name (dynobj, *p);
          if (s != NULL)
        {
          s = bfd_get_section_by_name (dynobj, *p);
          if (s != NULL)
-           s->_raw_size = 0;
+           s->size = 0;
        }
     }
 
   /* 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;
@@ -833,25 +694,25 @@ 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)
        {
-         if (s->_raw_size == 0)
+         if (s->size == 0)
            {
              /* 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)
        {
-         if (s->_raw_size == 0)
+         if (s->size == 0)
            {
              /* If we don't need this section, strip it from the
                 output file.  This is mostly to handle .rela.bss and
            {
              /* If we don't need this section, strip it from the
                 output file.  This is mostly to handle .rela.bss and
@@ -862,7 +723,7 @@ 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
            {
            }
          else
            {
@@ -870,7 +731,7 @@ i370_elf_size_dynamic_sections (output_bfd, info)
              const char *outname;
 
              /* Remember whether there are any relocation sections.  */
              const char *outname;
 
              /* Remember whether there are any relocation sections.  */
-             relocs = true;
+             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.  */
@@ -880,7 +741,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.  */
@@ -900,18 +761,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.  */
          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;
+      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
+      if (s->contents == NULL && s->size != 0)
+       return FALSE;
     }
 
   if (elf_hash_table (info)->dynamic_sections_created)
     }
 
   if (elf_hash_table (info)->dynamic_sections_created)
@@ -921,37 +786,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_elf_add_dynamic_entry (info, TAG, 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;
        }
     }
          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
@@ -962,7 +830,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;
@@ -990,7 +858,7 @@ 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
 }
 \f
 /* Look through the relocs for a section during the first phase, and
@@ -1001,7 +869,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;
@@ -1016,13 +884,12 @@ 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
 
 #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_error_handler ("i370_elf_check_relocs called for section %A in %B",
+                     sec, abfd);
 #endif
 
   dynobj = elf_hash_table (info)->dynobj;
 #endif
 
   dynobj = elf_hash_table (info)->dynobj;
@@ -1061,7 +928,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);
@@ -1079,11 +946,11 @@ 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;
                }
            }
 
                }
            }
 
-         sreloc->_raw_size += sizeof (Elf32_External_Rela);
+         sreloc->size += sizeof (Elf32_External_Rela);
 
          /* FIXME: We should here do what the m68k and i386
             backends do: if the reloc is pc-relative, record it
 
          /* FIXME: We should here do what the m68k and i386
             backends do: if the reloc is pc-relative, record it
@@ -1094,7 +961,7 @@ i370_elf_check_relocs (abfd, info, sec, relocs)
        }
     }
 
        }
     }
 
-  return true;
+  return TRUE;
 }
 \f
 /* Finish up the dynamic sections.  */
 }
 \f
 /* Finish up the dynamic sections.  */
@@ -1103,7 +970,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;
@@ -1127,21 +994,21 @@ i370_elf_finish_dynamic_sections (output_bfd, info)
       BFD_ASSERT (splt != NULL && sdyn != NULL);
 
       dyncon = (Elf32_External_Dyn *) sdyn->contents;
       BFD_ASSERT (splt != NULL && sdyn != NULL);
 
       dyncon = (Elf32_External_Dyn *) sdyn->contents;
-      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
+      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
       for (; dyncon < dynconend; dyncon++)
        {
          Elf_Internal_Dyn dyn;
          const char *name;
       for (; dyncon < dynconend; dyncon++)
        {
          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)
@@ -1156,12 +1023,7 @@ i370_elf_finish_dynamic_sections (output_bfd, info)
                  if (! size)
                    dyn.d_un.d_ptr = s->vma;
                  else
                  if (! size)
                    dyn.d_un.d_ptr = s->vma;
                  else
-                   {
-                     if (s->_cooked_size != 0)
-                       dyn.d_un.d_val = s->_cooked_size;
-                     else
-                       dyn.d_un.d_val = s->_raw_size;
-                   }
+                   dyn.d_un.d_val = s->size;
                }
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
            }
                }
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
            }
@@ -1174,7 +1036,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);
@@ -1206,6 +1068,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;
 
@@ -1221,10 +1084,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);
            }
        }
 
            }
        }
 
@@ -1234,7 +1095,7 @@ 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
 }
 \f
 /* The RELOCATE_SECTION function is called by the ELF backend linker
@@ -1246,7 +1107,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
@@ -1260,15 +1121,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;
@@ -1278,21 +1139,23 @@ 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
 
 #ifdef DEBUG
-  fprintf (stderr, "i370_elf_relocate_section called for %s section %s, %ld relocations%s\n",
-          bfd_get_filename (input_bfd),
-          bfd_section_name(input_bfd, input_section),
-          (long)input_section->reloc_count,
-          (info->relocateable) ? " (relocatable)" : "");
+  _bfd_error_handler ("i370_elf_relocate_section called for %B section %A, %ld relocations%s",
+                     input_bfd, input_section,
+                     (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 */
@@ -1318,55 +1181,26 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
       if ((unsigned)r_type >= (unsigned)R_I370_max
          || !i370_elf_howto_table[(int)r_type])
        {
       if ((unsigned)r_type >= (unsigned)R_I370_max
          || !i370_elf_howto_table[(int)r_type])
        {
-         (*_bfd_error_handler) ("%s: unknown relocation type %d",
-                                bfd_get_filename (input_bfd),
-                                (int)r_type);
+         (*_bfd_error_handler) ("%B: unknown relocation type %d",
+                                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
        {
@@ -1381,8 +1215,7 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
              sec = h->root.u.def.section;
              if (info->shared
                  && ((! info->symbolic && h->dynindx != -1)
              sec = h->root.u.def.section;
              if (info->shared
                  && ((! info->symbolic && h->dynindx != -1)
-                     || (h->elf_link_hash_flags
-                         & ELF_LINK_HASH_DEF_REGULAR) == 0)
+                     || !h->def_regular)
                  && (input_section->flags & SEC_ALLOC) != 0
                  && (r_type == R_I370_ADDR31
                      || r_type == R_I370_COPY
                  && (input_section->flags & SEC_ALLOC) != 0
                  && (r_type == R_I370_ADDR31
                      || r_type == R_I370_COPY
@@ -1401,31 +1234,36 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
            }
          else if (h->root.type == bfd_link_hash_undefweak)
            relocation = 0;
            }
          else if (h->root.type == bfd_link_hash_undefweak)
            relocation = 0;
-         else if (info->shared
+         else if (info->unresolved_syms_in_objects == RM_IGNORE
                   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
            relocation = 0;
          else
            {
                   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
            relocation = 0;
          else
            {
-             (*info->callbacks->undefined_symbol) (info,
-                                                   h->root.root.string,
-                                                   input_bfd,
-                                                   input_section,
-                                                   rel->r_offset,
-                                                   true);
-             ret = false;
-             continue;
+             if ((*info->callbacks->undefined_symbol)
+                 (info, h->root.root.string, input_bfd,
+                  input_section, rel->r_offset,
+                  (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
+                   || ELF_ST_VISIBILITY (h->other))))
+               {
+                 ret = FALSE;
+                 continue;
+               }
+             relocation = 0;
            }
        }
 
            }
        }
 
-      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)
+           ("%B: unknown relocation type %d for symbol %s",
+            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
@@ -1440,13 +1278,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,
@@ -1467,7 +1306,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,
@@ -1478,24 +1317,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);
 
@@ -1505,8 +1334,7 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                  become local.  */
              else if (h != NULL
                       && ((! info->symbolic && h->dynindx != -1)
                  become local.  */
              else if (h != NULL
                       && ((! info->symbolic && h->dynindx != -1)
-                          || (h->elf_link_hash_flags
-                              & ELF_LINK_HASH_DEF_REGULAR) == 0))
+                          || !h->def_regular))
                {
                  BFD_ASSERT (h->dynindx != -1);
                  outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
                {
                  BFD_ASSERT (h->dynindx != -1);
                  outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
@@ -1523,21 +1351,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,16 +1380,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;
@@ -1579,13 +1396,14 @@ 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)
+           ("%B: Relocation %s is not yet supported for symbol %s.",
+            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;
        }
 
@@ -1609,7 +1427,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:
@@ -1620,7 +1438,7 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                const char *name;
 
                if (h != NULL)
                const char *name;
 
                if (h != NULL)
-                 name = h->root.root.string;
+                 name = NULL;
                else
                  {
                    name = bfd_elf_string_from_elf_section (input_bfd,
                else
                  {
                    name = bfd_elf_string_from_elf_section (input_bfd,
@@ -1634,6 +1452,7 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                  }
 
                (*info->callbacks->reloc_overflow) (info,
                  }
 
                (*info->callbacks->reloc_overflow) (info,
+                                                   (h ? &h->root : NULL),
                                                    name,
                                                    howto->name,
                                                    (bfd_vma) 0,
                                                    name,
                                                    howto->name,
                                                    (bfd_vma) 0,
@@ -1677,10 +1496,10 @@ i370_elf_post_process_headers (abfd, link_info)
 
 #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
 
@@ -1704,7 +1523,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;
 }
@@ -1712,16 +1534,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 *, 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.048222 seconds and 4 git commands to generate.