daily update
[deliverable/binutils-gdb.git] / bfd / elf32-frv.c
index f97e0b754687158b8322bc11912cee81564726de..3a3124347b5d4cdaeaac7f58e179866652529d78 100644 (file)
@@ -1,5 +1,5 @@
 /* FRV-specific support for 32-bit ELF.
-   Copyright 2002, 2003, 2004  Free Software Foundation, Inc.
+   Copyright 2002, 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
 
 This file is part of BFD, the Binary File Descriptor library.
 
@@ -15,7 +15,7 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 #include "bfd.h"
 #include "sysdep.h"
@@ -57,12 +57,6 @@ static bfd_boolean elf32_frv_add_symbol_hook
 static bfd_reloc_status_type frv_final_link_relocate
   PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *,
           Elf_Internal_Rela *, bfd_vma));
-static bfd_boolean elf32_frv_gc_sweep_hook
-  PARAMS ((bfd *, struct bfd_link_info *, asection *, const
-          Elf_Internal_Rela *));
-static asection * elf32_frv_gc_mark_hook
-  PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *,
-          struct elf_link_hash_entry *, Elf_Internal_Sym *));
 static bfd_boolean elf32_frv_check_relocs
   PARAMS ((bfd *, struct bfd_link_info *, asection *,
           const Elf_Internal_Rela *));
@@ -78,6 +72,10 @@ static bfd_boolean frv_elf_merge_private_bfd_data
   PARAMS ((bfd *, bfd *));
 static bfd_boolean frv_elf_print_private_bfd_data
   PARAMS ((bfd *, PTR));
+static bfd_boolean elf32_frv_grok_prstatus (bfd * abfd,
+                                           Elf_Internal_Note * note);
+static bfd_boolean elf32_frv_grok_psinfo (bfd * abfd,
+                                         Elf_Internal_Note * note);
 
 static reloc_howto_type elf32_frv_howto_table [] =
 {
@@ -112,7 +110,7 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE),                /* pcrel_offset */
 
   /* A 16 bit pc-relative relocation.  */
-  HOWTO (R_FRV_LABEL16,                /* type */
+  HOWTO (R_FRV_LABEL16,                /* type */
         2,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -124,10 +122,10 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        TRUE),                 /* pcrel_offset */
+        TRUE),                 /* pcrel_offset */
 
   /* A 24-bit pc-relative relocation.  */
-  HOWTO (R_FRV_LABEL24,        /* type */
+  HOWTO (R_FRV_LABEL24,                /* type */
         2,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         26,                    /* bitsize */
@@ -139,9 +137,9 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0x7e03ffff,            /* src_mask */
         0x7e03ffff,            /* dst_mask */
-        TRUE),                 /* pcrel_offset */
+        TRUE),                 /* pcrel_offset */
 
-  HOWTO (R_FRV_LO16,           /* type */
+  HOWTO (R_FRV_LO16,           /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -153,9 +151,9 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
-  HOWTO (R_FRV_HI16,           /* type */
+  HOWTO (R_FRV_HI16,           /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -167,9 +165,9 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
-  HOWTO (R_FRV_GPREL12,                /* type */
+  HOWTO (R_FRV_GPREL12,                /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         12,                    /* bitsize */
@@ -177,13 +175,13 @@ static reloc_howto_type elf32_frv_howto_table [] =
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
-        "R_FRV_GPREL12",       /* name */
+        "R_FRV_GPREL12",       /* name */
         FALSE,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
-        0xfff,                 /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        0xfff,                 /* src_mask */
+        0xfff,                 /* dst_mask */
+        FALSE),                /* pcrel_offset */
 
-  HOWTO (R_FRV_GPRELU12,        /* type */
+  HOWTO (R_FRV_GPRELU12,       /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         12,                    /* bitsize */
@@ -191,13 +189,13 @@ static reloc_howto_type elf32_frv_howto_table [] =
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
-        "R_FRV_GPRELU12",      /* name */
+        "R_FRV_GPRELU12",      /* name */
         FALSE,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
-        0x3f03f,               /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        0xfff,                 /* src_mask */
+        0x3f03f,               /* dst_mask */
+        FALSE),                /* pcrel_offset */
 
-  HOWTO (R_FRV_GPREL32,         /* type */
+  HOWTO (R_FRV_GPREL32,                /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
@@ -207,11 +205,11 @@ static reloc_howto_type elf32_frv_howto_table [] =
         bfd_elf_generic_reloc, /* special_function */
         "R_FRV_GPREL32",       /* name */
         FALSE,                 /* partial_inplace */
-        0xffffffff,            /* src_mask */
+        0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
-  HOWTO (R_FRV_GPRELHI,                /* type */
+  HOWTO (R_FRV_GPRELHI,                /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -221,11 +219,11 @@ static reloc_howto_type elf32_frv_howto_table [] =
         bfd_elf_generic_reloc, /* special_function */
         "R_FRV_GPRELHI",       /* name */
         FALSE,                 /* partial_inplace */
-        0xffff,                        /* src_mask */
+        0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
-  HOWTO (R_FRV_GPRELLO,                /* type */
+  HOWTO (R_FRV_GPRELLO,                /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -235,13 +233,13 @@ static reloc_howto_type elf32_frv_howto_table [] =
         bfd_elf_generic_reloc, /* special_function */
         "R_FRV_GPRELLO",       /* name */
         FALSE,                 /* partial_inplace */
-        0xffff,                        /* src_mask */
+        0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* A 12-bit signed operand with the GOT offset for the address of
      the symbol.  */
-  HOWTO (R_FRV_GOT12,          /* type */
+  HOWTO (R_FRV_GOT12,          /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         12,                    /* bitsize */
@@ -251,13 +249,13 @@ static reloc_howto_type elf32_frv_howto_table [] =
         bfd_elf_generic_reloc, /* special_function */
         "R_FRV_GOT12",         /* name */
         FALSE,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
-        0xfff,                 /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        0xfff,                 /* src_mask */
+        0xfff,                 /* dst_mask */
+        FALSE),                /* pcrel_offset */
 
   /* The upper 16 bits of the GOT offset for the address of the
      symbol.  */
-  HOWTO (R_FRV_GOTHI,          /* type */
+  HOWTO (R_FRV_GOTHI,          /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -267,13 +265,13 @@ static reloc_howto_type elf32_frv_howto_table [] =
         bfd_elf_generic_reloc, /* special_function */
         "R_FRV_GOTHI",         /* name */
         FALSE,                 /* partial_inplace */
-        0xffff,                        /* src_mask */
+        0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* The lower 16 bits of the GOT offset for the address of the
      symbol.  */
-  HOWTO (R_FRV_GOTLO,          /* type */
+  HOWTO (R_FRV_GOTLO,          /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -285,7 +283,7 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* The 32-bit address of the canonical descriptor of a function.  */
   HOWTO (R_FRV_FUNCDESC,       /* type */
@@ -314,9 +312,9 @@ static reloc_howto_type elf32_frv_howto_table [] =
         bfd_elf_generic_reloc, /* special_function */
         "R_FRV_FUNCDESC_GOT12", /* name */
         FALSE,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
-        0xfff,                 /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        0xfff,                 /* src_mask */
+        0xfff,                 /* dst_mask */
+        FALSE),                /* pcrel_offset */
 
   /* The upper 16 bits of the GOT offset for the address of the
      canonical descriptor of a function.  */
@@ -332,7 +330,7 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* The lower 16 bits of the GOT offset for the address of the
      canonical descriptor of a function.  */
@@ -348,7 +346,7 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* The 64-bit descriptor of a function.  */
   HOWTO (R_FRV_FUNCDESC_VALUE, /* type */
@@ -377,9 +375,9 @@ static reloc_howto_type elf32_frv_howto_table [] =
         bfd_elf_generic_reloc, /* special_function */
         "R_FRV_FUNCDESC_GOTOFF12", /* name */
         FALSE,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
-        0xfff,                 /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        0xfff,                 /* src_mask */
+        0xfff,                 /* dst_mask */
+        FALSE),                /* pcrel_offset */
 
   /* The upper 16 bits of the GOT offset for the address of the
      canonical descriptor of a function.  */
@@ -395,7 +393,7 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* The lower 16 bits of the GOT offset for the address of the
      canonical descriptor of a function.  */
@@ -411,11 +409,11 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* A 12-bit signed operand with the GOT offset for the address of
      the symbol.  */
-  HOWTO (R_FRV_GOTOFF12,        /* type */
+  HOWTO (R_FRV_GOTOFF12,       /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         12,                    /* bitsize */
@@ -425,13 +423,13 @@ static reloc_howto_type elf32_frv_howto_table [] =
         bfd_elf_generic_reloc, /* special_function */
         "R_FRV_GOTOFF12",      /* name */
         FALSE,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
-        0xfff,                 /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        0xfff,                 /* src_mask */
+        0xfff,                 /* dst_mask */
+        FALSE),                /* pcrel_offset */
 
   /* The upper 16 bits of the GOT offset for the address of the
      symbol.  */
-  HOWTO (R_FRV_GOTOFFHI,        /* type */
+  HOWTO (R_FRV_GOTOFFHI,       /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -443,7 +441,7 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* The lower 16 bits of the GOT offset for the address of the
      symbol.  */
@@ -459,7 +457,7 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* A 24-bit pc-relative relocation referencing the TLS PLT entry for
      a thread-local symbol.  If the symbol number is 0, it refers to
@@ -476,7 +474,7 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0x7e03ffff,            /* src_mask */
         0x7e03ffff,            /* dst_mask */
-        TRUE),                 /* pcrel_offset */
+        TRUE),                 /* pcrel_offset */
 
   /* A 64-bit TLS descriptor for a symbol.  This relocation is only
      valid as a REL, dynamic relocation.  */
@@ -496,7 +494,7 @@ static reloc_howto_type elf32_frv_howto_table [] =
 
   /* A 12-bit signed operand with the GOT offset for the TLS
      descriptor of the symbol.  */
-  HOWTO (R_FRV_GOTTLSDESC12,    /* type */
+  HOWTO (R_FRV_GOTTLSDESC12,   /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         12,                    /* bitsize */
@@ -506,13 +504,13 @@ static reloc_howto_type elf32_frv_howto_table [] =
         bfd_elf_generic_reloc, /* special_function */
         "R_FRV_GOTTLSDESC12",  /* name */
         FALSE,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
-        0xfff,                 /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        0xfff,                 /* src_mask */
+        0xfff,                 /* dst_mask */
+        FALSE),                /* pcrel_offset */
 
   /* The upper 16 bits of the GOT offset for the TLS descriptor of the
      symbol.  */
-  HOWTO (R_FRV_GOTTLSDESCHI,    /* type */
+  HOWTO (R_FRV_GOTTLSDESCHI,   /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -524,7 +522,7 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* The lower 16 bits of the GOT offset for the TLS descriptor of the
      symbol.  */
@@ -540,11 +538,11 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* A 12-bit signed operand with the offset from the module base
      address to the thread-local symbol address.  */
-  HOWTO (R_FRV_TLSMOFF12,        /* type */
+  HOWTO (R_FRV_TLSMOFF12,       /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         12,                    /* bitsize */
@@ -554,13 +552,13 @@ static reloc_howto_type elf32_frv_howto_table [] =
         bfd_elf_generic_reloc, /* special_function */
         "R_FRV_TLSMOFF12",     /* name */
         FALSE,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
-        0xfff,                 /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        0xfff,                 /* src_mask */
+        0xfff,                 /* dst_mask */
+        FALSE),                /* pcrel_offset */
 
   /* The upper 16 bits of the offset from the module base address to
      the thread-local symbol address.  */
-  HOWTO (R_FRV_TLSMOFFHI,        /* type */
+  HOWTO (R_FRV_TLSMOFFHI,      /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -572,7 +570,7 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* The lower 16 bits of the offset from the module base address to
      the thread-local symbol address.  */
@@ -588,11 +586,11 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* A 12-bit signed operand with the GOT offset for the TLSOFF entry
      for a symbol.  */
-  HOWTO (R_FRV_GOTTLSOFF12,        /* type */
+  HOWTO (R_FRV_GOTTLSOFF12,    /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         12,                    /* bitsize */
@@ -602,13 +600,13 @@ static reloc_howto_type elf32_frv_howto_table [] =
         bfd_elf_generic_reloc, /* special_function */
         "R_FRV_GOTTLSOFF12",   /* name */
         FALSE,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
-        0xfff,                 /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        0xfff,                 /* src_mask */
+        0xfff,                 /* dst_mask */
+        FALSE),                /* pcrel_offset */
 
   /* The upper 16 bits of the GOT offset for the TLSOFF entry for a
      symbol.  */
-  HOWTO (R_FRV_GOTTLSOFFHI,        /* type */
+  HOWTO (R_FRV_GOTTLSOFFHI,    /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -620,7 +618,7 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* The lower 16 bits of the GOT offset for the TLSOFF entry for a
      symbol.  */
@@ -636,7 +634,7 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* The 32-bit offset from the thread pointer (not the module base
      address) to a thread-local symbol.  */
@@ -707,7 +705,7 @@ static reloc_howto_type elf32_frv_howto_table [] =
 
   /* A 32-bit offset from the module base address to
      the thread-local symbol address.  */
-  HOWTO (R_FRV_TLSMOFF,        /* type */
+  HOWTO (R_FRV_TLSMOFF,                /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
@@ -719,40 +717,40 @@ static reloc_howto_type elf32_frv_howto_table [] =
         FALSE,                 /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 };
 
 /* GNU extension to record C++ vtable hierarchy.  */
 static reloc_howto_type elf32_frv_vtinherit_howto =
-  HOWTO (R_FRV_GNU_VTINHERIT,   /* type */
-         0,                     /* rightshift */
-         2,                     /* size (0 = byte, 1 = short, 2 = long) */
-         0,                     /* bitsize */
-         FALSE,                 /* pc_relative */
-         0,                     /* bitpos */
-         complain_overflow_dont, /* complain_on_overflow */
-         NULL,                  /* special_function */
-         "R_FRV_GNU_VTINHERIT", /* name */
-         FALSE,                 /* partial_inplace */
-         0,                     /* src_mask */
-         0,                     /* dst_mask */
-         FALSE);                /* pcrel_offset */
+  HOWTO (R_FRV_GNU_VTINHERIT,  /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        0,                     /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont, /* complain_on_overflow */
+        NULL,                  /* special_function */
+        "R_FRV_GNU_VTINHERIT", /* name */
+        FALSE,                 /* partial_inplace */
+        0,                     /* src_mask */
+        0,                     /* dst_mask */
+        FALSE);                /* pcrel_offset */
 
   /* GNU extension to record C++ vtable member usage.  */
 static reloc_howto_type elf32_frv_vtentry_howto =
-  HOWTO (R_FRV_GNU_VTENTRY,     /* type */
-         0,                     /* rightshift */
-         2,                     /* size (0 = byte, 1 = short, 2 = long) */
-         0,                     /* bitsize */
-         FALSE,                 /* pc_relative */
-         0,                     /* bitpos */
-         complain_overflow_dont, /* complain_on_overflow */
-         _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
-         "R_FRV_GNU_VTENTRY",   /* name */
-         FALSE,                 /* partial_inplace */
-         0,                     /* src_mask */
-         0,                     /* dst_mask */
-         FALSE);                /* pcrel_offset */
+  HOWTO (R_FRV_GNU_VTENTRY,    /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        0,                     /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont, /* complain_on_overflow */
+        _bfd_elf_rel_vtable_reloc_fn, /* special_function */
+        "R_FRV_GNU_VTENTRY",   /* name */
+        FALSE,                 /* partial_inplace */
+        0,                     /* src_mask */
+        0,                     /* dst_mask */
+        FALSE);                /* pcrel_offset */
 
 /* The following 3 relocations are REL.  The only difference to the
    entries in the table above are that partial_inplace is TRUE.  */
@@ -846,62 +844,6 @@ static reloc_howto_type elf32_frv_rel_tlsoff_howto =
 
 
 \f
-/* Map BFD reloc types to FRV ELF reloc types.  */
-#if 0
-struct frv_reloc_map
-{
-  unsigned int bfd_reloc_val;
-  unsigned int frv_reloc_val;
-};
-
-static const struct frv_reloc_map frv_reloc_map [] =
-{
-  { BFD_RELOC_NONE,           R_FRV_NONE },
-  { BFD_RELOC_32,             R_FRV_32 },
-  { BFD_RELOC_FRV_LABEL16,    R_FRV_LABEL16 },
-  { BFD_RELOC_FRV_LABEL24,    R_FRV_LABEL24 },
-  { BFD_RELOC_FRV_LO16,       R_FRV_LO16 },
-  { BFD_RELOC_FRV_HI16,       R_FRV_HI16 },
-  { BFD_RELOC_FRV_GPREL12,    R_FRV_GPREL12 },
-  { BFD_RELOC_FRV_GPRELU12,   R_FRV_GPRELU12 },
-  { BFD_RELOC_FRV_GPREL32,    R_FRV_GPREL32 },
-  { BFD_RELOC_FRV_GPRELHI,    R_FRV_GPRELHI },
-  { BFD_RELOC_FRV_GPRELLO,    R_FRV_GPRELLO },
-  { BFD_RELOC_FRV_GOT12,      R_FRV_GOT12 },
-  { BFD_RELOC_FRV_GOTHI,      R_FRV_GOTHI },
-  { BFD_RELOC_FRV_GOTLO,      R_FRV_GOTLO },
-  { BFD_RELOC_FRV_FUNCDESC,   R_FRV_FUNCDESC },
-  { BFD_RELOC_FRV_FUNCDESC_GOT12, R_FRV_FUNCDESC_GOT12 },
-  { BFD_RELOC_FRV_FUNCDESC_GOTHI, R_FRV_FUNCDESC_GOTHI },
-  { BFD_RELOC_FRV_FUNCDESC_GOTLO, R_FRV_FUNCDESC_GOTLO },
-  { BFD_RELOC_FRV_FUNCDESC_VALUE, R_FRV_FUNCDESC_VALUE },
-  { BFD_RELOC_FRV_FUNCDESC_GOTOFF12, R_FRV_FUNCDESC_GOTOFF12 },
-  { BFD_RELOC_FRV_FUNCDESC_GOTOFFHI, R_FRV_FUNCDESC_GOTOFFHI },
-  { BFD_RELOC_FRV_FUNCDESC_GOTOFFLO, R_FRV_FUNCDESC_GOTOFFLO },
-  { BFD_RELOC_FRV_GOTOFF12,   R_FRV_GOTOFF12 },
-  { BFD_RELOC_FRV_GOTOFFHI,   R_FRV_GOTOFFHI },
-  { BFD_RELOC_FRV_GOTOFFLO,   R_FRV_GOTOFFLO },
-  { BFD_RELOC_FRV_GETTLSOFF,  R_FRV_GETTLSOFF },
-  { BFD_RELOC_FRV_TLSDESC_VALUE, R_FRV_TLSDESC_VALUE },
-  { BFD_RELOC_FRV_GOTTLSDESC12, R_FRV_GOTTLSDESC12 },
-  { BFD_RELOC_FRV_GOTTLSDESCHI, R_FRV_GOTTLSDESCHI },
-  { BFD_RELOC_FRV_GOTTLSDESCLO, R_FRV_GOTTLSDESCLO },
-  { BFD_RELOC_FRV_TLSMOFF12,  R_FRV_TLSMOFF12 },
-  { BFD_RELOC_FRV_TLSMOFFHI,  R_FRV_TLSMOFFHI },
-  { BFD_RELOC_FRV_TLSMOFFLO,  R_FRV_TLSMOFFLO },
-  { BFD_RELOC_FRV_GOTTLSOFF12, R_FRV_GOTTLSOFF12 },
-  { BFD_RELOC_FRV_GOTTLSOFFHI, R_FRV_GOTTLSOFFHI },
-  { BFD_RELOC_FRV_GOTTLSOFFLO, R_FRV_GOTTLSOFFLO },
-  { BFD_RELOC_FRV_TLSOFF,     R_FRV_TLSOFF },
-  { BFD_RELOC_FRV_TLSDESC_RELAX, R_FRV_TLSDESC_RELAX },
-  { BFD_RELOC_FRV_GETTLSOFF_RELAX, R_FRV_GETTLSOFF_RELAX },
-  { BFD_RELOC_FRV_TLSOFF_RELAX, R_FRV_TLSOFF_RELAX },
-  { BFD_RELOC_FRV_TLSMOFF,    R_FRV_TLSMOFF },
-  { BFD_RELOC_VTABLE_INHERIT, R_FRV_GNU_VTINHERIT },
-  { BFD_RELOC_VTABLE_ENTRY,   R_FRV_GNU_VTENTRY },
-};
-#endif
-
 extern const bfd_target bfd_elf32_frvfdpic_vec;
 #define IS_FDPIC(bfd) ((bfd)->xvec == &bfd_elf32_frvfdpic_vec)
 
@@ -1060,8 +1002,9 @@ frvfdpic_elf_link_hash_table_create (bfd *abfd)
   if (ret == NULL)
     return NULL;
 
-  if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd,
-                                      _bfd_elf_link_hash_newfunc))
+  if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
+                                     _bfd_elf_link_hash_newfunc,
+                                     sizeof (struct elf_link_hash_entry)))
     {
       free (ret);
       return NULL;
@@ -1075,15 +1018,7 @@ frvfdpic_elf_link_hash_table_create (bfd *abfd)
    its function descriptor must be assigned by the dynamic linker.  */
 #define FRVFDPIC_SYM_LOCAL(INFO, H) \
   (_bfd_elf_symbol_refs_local_p ((H), (INFO), 1) \
-   || ! elf_hash_table (INFO)->dynamic_sections_created \
-   /* These two additional alternatives are needed for TLS
-      relocations, that use *ABS*+offset relocations to refer to the
-      TLS section of the local module.  FIXME: At some point during
-      linking, the definition section ceases to be regarded as the
-      absolute section, and starts being regarded as the undefined
-      section.  */ \
-   || bfd_is_abs_section ((H)->root.u.def.section) \
-   || bfd_is_und_section ((H)->root.u.def.section))
+   || ! elf_hash_table (INFO)->dynamic_sections_created)
 #define FRVFDPIC_FUNCDESC_LOCAL(INFO, H) \
   ((H)->dynindx == -1 || ! elf_hash_table (INFO)->dynamic_sections_created)
 
@@ -1208,8 +1143,8 @@ frvfdpic_relocs_info_hash (const void *entry_)
   const struct frvfdpic_relocs_info *entry = entry_;
 
   return (entry->symndx == -1
-         ? (long)entry->d.h->root.root.hash
-         : entry->symndx + entry->d.abfd->id * 257) + entry->addend;
+         ? (long) entry->d.h->root.root.hash
+         : entry->symndx + (long) entry->d.abfd->id * 257) + entry->addend;
 }
 
 /* Test whether the key fields of two frvfdpic_relocs_info entries are
@@ -1322,46 +1257,6 @@ frvfdpic_pic_merge_early_relocs_info (struct frvfdpic_relocs_info *e2,
   e2->gotoff |= e1->gotoff;
   e2->call |= e1->call;
   e2->sym |= e1->sym;
-
-#if 0
-  /* These are set in _frvfdpic_count_got_plt_entries() or later, and this
-     function is only called in _frvfdpic_resolve_final_relocs_info(), that
-     runs just before it, so we don't have to worry about the fields
-     below.  */
-
-  e2->plt |= e1->plt;
-  e2->privfd |= e1->privfd;
-  e2->lazyplt |= e1->lazyplt;
-  e2->done |= e1->done;
-
-  e2->relocs32 += e1->relocs32;
-  e2->relocsfd += e1->relocsfd;
-  e2->relocsfdv += e1->relocsfdv;
-  e2->relocstlsd += e1->relocstlsd;
-  e2->relocstlsoff += e1->relocstlsoff;
-  e2->fixups += e1->fixups;
-  e2->dynrelocs += e1->dynrelocs;
-
-  if (abs (e1->got_entry) < abs (e2->got_entry))
-    e2->got_entry = e1->got_entry;
-  if (abs (e1->fdgot_entry) < abs (e2->fdgot_entry))
-    e2->fdgot_entry = e1->fdgot_entry;
-  if (abs (e1->fd_entry) < abs (e2->fd_entry))
-    e2->fd_entry = e1->fd_entry;
-
-  if (e1->plt_entry < e2->plt_entry)
-    e2->plt_entry = e1->plt_entry;
-  if (e1->lzplt_entry < e2->lzplt_entry)
-    e2->lzplt_entry = e1->lzplt_entry;
-
-  if (abs (e1->tlsoff_entry) < abs (e2->tlsoff_entry))
-    e2->tlsoff_entry = e1->tlsoff_entry;
-  if (abs (e1->tlsdesc_entry) < abs (e2->tlsdesc_entry))
-    e2->tlsdesc_entry = e1->tlsdesc_entry;
-
-  if (e1->tlsplt_entry < e2->tlsplt_entry)
-    t2->tlsplt_entry = t1->tlsplt_entry;
-#endif
 }
 
 /* Every block of 65535 lazy PLT entries shares a single call to the
@@ -1621,7 +1516,14 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry,
              idx = dynindx;
              ad = addend;
              if (ad)
-               return FALSE;
+               {
+                 (*info->callbacks->reloc_dangerous)
+                   (info, _("relocation requires zero addend"),
+                    elf_hash_table (info)->dynobj,
+                    frvfdpic_got_section (info),
+                    entry->fdgot_entry);
+                 return FALSE;
+               }
            }
          else
            {
@@ -1763,7 +1665,14 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry,
       else if (entry->lazyplt)
        {
          if (ad)
-           return FALSE;
+           {
+             (*info->callbacks->reloc_dangerous)
+               (info, _("relocation requires zero addend"),
+                elf_hash_table (info)->dynobj,
+                frvfdpic_got_section (info),
+                entry->fd_entry);
+             return FALSE;
+           }
 
          fd_lazy_rel_offset = ofst;
 
@@ -1940,6 +1849,13 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry,
              && (bfd_is_abs_section (sec)
                  || bfd_is_und_section (sec)))
            {
+             if (! elf_hash_table (info)->tls_sec)
+               {
+                 (*info->callbacks->undefined_symbol)
+                   (info, "TLS section", elf_hash_table (info)->dynobj,
+                    frvfdpic_got_section (info), entry->tlsoff_entry, TRUE);
+                 return FALSE;
+               }
              idx = elf_section_data (elf_hash_table (info)->tls_sec)->dynindx;
              ad += FRVFDPIC_TLS_BIAS;
            }
@@ -1955,7 +1871,7 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry,
                                   ->output_offset,
                                   R_FRV_TLSOFF, idx, ad, entry);
        }
-       
+
       bfd_put_32 (output_bfd, ad,
                  frvfdpic_got_section (info)->contents
                  + frvfdpic_got_initial_offset (info)
@@ -2047,6 +1963,13 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry,
              && (bfd_is_abs_section (sec)
                  || bfd_is_und_section (sec)))
            {
+             if (! elf_hash_table (info)->tls_sec)
+               {
+                 (*info->callbacks->undefined_symbol)
+                   (info, "TLS section", elf_hash_table (info)->dynobj,
+                    frvfdpic_got_section (info), entry->tlsdesc_entry, TRUE);
+                 return FALSE;
+               }
              idx = elf_section_data (elf_hash_table (info)->tls_sec)->dynindx;
              ad += FRVFDPIC_TLS_BIAS;
            }
@@ -2080,7 +2003,7 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry,
     {
       bfd_byte *plt_code = frvfdpic_plt_section (info)->contents
        + entry->tlsplt_entry;
-      
+
       if (info->executable
          && (entry->symndx != -1
              || FRVFDPIC_SYM_LOCAL (info, entry->d.h)))
@@ -2108,7 +2031,7 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry,
              else
                idx = 0;
            }
-         
+
          /* *ABS*+addend is special for TLS relocations, use only the
             addend for the TLS offset, and take the module id as
             0.  */
@@ -2120,7 +2043,7 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry,
             TLS offset to the addend.  */
          else if (sec)
            ad += sec->output_section->vma - tls_biased_base (info);
-         
+
          if ((bfd_signed_vma)ad >= -(1 << (16 - 1))
              && (bfd_signed_vma)ad < (1 << (16 - 1)))
            {
@@ -2974,10 +2897,9 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
                                                      rel->r_addend))
            {
              (*_bfd_error_handler)
-               (_("%B: relocation at `%A+0x%x' references symbol `%s' with nonzero addend"),
-                input_bfd, input_section, rel->r_offset, name);
+               (_("%B(%A+0x%x): relocation to `%s+%x' may have caused the error above"),
+                input_bfd, input_section, rel->r_offset, name, rel->r_addend);
              return FALSE;
-
            }
 
          break;
@@ -3051,7 +2973,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
   (LOCAL_EXEC_P ((info), (picrel)))
 #define RELAX_TLSDESC_INITIAL_EXEC_P(info, picrel) \
   (INITIAL_EXEC_P ((info), (picrel)))
+
 #define RELAX_GOTTLSOFF_LOCAL_EXEC_P(info, picrel, value) \
   (LOCAL_EXEC_P ((info), (picrel)) \
    && TLSMOFF_IN_RANGE_FOR_SETLOS_P((value), (info)))
@@ -3068,7 +2990,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
                   name, input_bfd, input_section, rel->r_offset);
                return FALSE;
              }
-           
+
            if (RELAX_GETTLSOFF_LOCAL_EXEC_P (info, picrel,
                                              relocation + rel->r_addend))
              {
@@ -3205,7 +3127,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
              }
 
            break;
-           
+
          case R_FRV_GOTTLSDESCLO:
            insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
 
@@ -3253,7 +3175,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
              }
 
            break;
-           
+
          case R_FRV_TLSDESC_RELAX:
            insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
 
@@ -3581,14 +3503,16 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
 
            break;
 
-#if 0      /* There's nothing to relax in these.  */
-         case R_FRV_TLSDESC_VALUE:
-         case R_FRV_TLSOFF:
-         case R_FRV_TLSMOFF12:
-         case R_FRV_TLSMOFFHI:
-         case R_FRV_TLSMOFFLO:
-         case R_FRV_TLSMOFF:
-#endif
+           /*
+             There's nothing to relax in these:
+               R_FRV_TLSDESC_VALUE
+               R_FRV_TLSOFF
+               R_FRV_TLSMOFF12
+               R_FRV_TLSMOFFHI
+               R_FRV_TLSMOFFLO
+               R_FRV_TLSMOFF
+           */
+
          default:
            break;
          }
@@ -3980,6 +3904,8 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
              check_segment[1] =
                _frvfdpic_osec_to_segment (output_bfd, sec->output_section);
            }
+         else
+           check_segment[1] = -1;
          break;
 
        case R_FRV_GOTTLSOFF12:
@@ -3994,7 +3920,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
            ? _frvfdpic_osec_to_segment (output_bfd, sec->output_section)
            : tls_segment;
          break;
-         
+
        case R_FRV_TLSDESC_VALUE:
        case R_FRV_TLSOFF:
          /* These shouldn't be present in input object files.  */
@@ -4018,8 +3944,8 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
 
       if (check_segment[0] != check_segment[1] && IS_FDPIC (output_bfd))
        {
-#if 1 /* If you take this out, remove the #error from fdpic-static-6.d
-        in the ld testsuite.  */
+         /* If you take this out, remove the #error from fdpic-static-6.d
+            in the ld testsuite.  */
          /* This helps catch problems in GCC while we can't do more
             than static linking.  The idea is to test whether the
             input file basename is crt0.o only once.  */
@@ -4032,18 +3958,23 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
                             + strlen (input_bfd->filename) - 7,
                             "/crt0.o") == 0)
              ? -1 : 0;
-#endif
          if (!silence_segment_error
              /* We don't want duplicate errors for undefined
                 symbols.  */
              && !(picrel && picrel->symndx == -1
                   && picrel->d.h->root.type == bfd_link_hash_undefined))
-           info->callbacks->warning
-             (info,
-              (info->shared || info->pie)
-              ? _("relocations between different segments are not supported")
-              : _("warning: relocation references a different segment"),
-              name, input_bfd, input_section, rel->r_offset);
+           {
+             if (info->shared || info->pie)
+               (*_bfd_error_handler)
+                 (_("%B(%A+0x%lx): reloc against `%s': %s"),
+                  input_bfd, input_section, (long)rel->r_offset, name,
+                  _("relocation references a different segment"));
+             else
+               info->callbacks->warning
+                 (info,
+                  _("relocation references a different segment"),
+                  name, input_bfd, input_section, rel->r_offset);
+           }
          if (!silence_segment_error && (info->shared || info->pie))
            return FALSE;
          elf_elfheader (output_bfd)->e_flags |= EF_FRV_PIC;
@@ -4189,8 +4120,12 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
            }
 
          if (msg)
-           r = info->callbacks->warning
-             (info, msg, name, input_bfd, input_section, rel->r_offset);
+           {
+             (*_bfd_error_handler)
+               (_("%B(%A+0x%lx): reloc against `%s': %s"),
+                input_bfd, input_section, (long)rel->r_offset, name, msg);
+             return FALSE;
+           }
 
          if (! r)
            return FALSE;
@@ -4204,54 +4139,22 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
    relocation.  */
 
 static asection *
-elf32_frv_gc_mark_hook (sec, info, rel, h, sym)
-     asection *sec;
-     struct bfd_link_info *info ATTRIBUTE_UNUSED;
-     Elf_Internal_Rela *rel;
-     struct elf_link_hash_entry *h;
-     Elf_Internal_Sym *sym;
+elf32_frv_gc_mark_hook (asection *sec,
+                       struct bfd_link_info *info,
+                       Elf_Internal_Rela *rel,
+                       struct elf_link_hash_entry *h,
+                       Elf_Internal_Sym *sym)
 {
   if (h != NULL)
-    {
-      switch (ELF32_R_TYPE (rel->r_info))
-       {
-       case R_FRV_GNU_VTINHERIT:
-       case R_FRV_GNU_VTENTRY:
-         break;
-
-       default:
-         switch (h->root.type)
-           {
-           default:
-             break;
-
-           case bfd_link_hash_defined:
-           case bfd_link_hash_defweak:
-             return h->root.u.def.section;
-
-           case bfd_link_hash_common:
-             return h->root.u.c.p->section;
-           }
-       }
-    }
-  else
-    return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
-
-  return NULL;
-}
-
-/* Update the got entry reference counts for the section being removed.  */
+    switch (ELF32_R_TYPE (rel->r_info))
+      {
+      case R_FRV_GNU_VTINHERIT:
+      case R_FRV_GNU_VTENTRY:
+       return NULL;
+      }
 
-static bfd_boolean
-elf32_frv_gc_sweep_hook (abfd, info, sec, relocs)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     struct bfd_link_info *info ATTRIBUTE_UNUSED;
-     asection *sec ATTRIBUTE_UNUSED;
-     const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
-{
-  return TRUE;
+  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
 }
-
 \f
 /* Hook called by the linker routine which adds symbols from an object
    file.  We use it to put .comm items in .scomm, and not .comm.  */
@@ -4277,11 +4180,11 @@ elf32_frv_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
 
       if (scomm == NULL)
        {
-         scomm = bfd_make_section (abfd, ".scommon");
-         if (scomm == NULL
-             || !bfd_set_section_flags (abfd, scomm, (SEC_ALLOC
-                                                      | SEC_IS_COMMON
-                                                      | SEC_LINKER_CREATED)))
+         scomm = bfd_make_section_with_flags (abfd, ".scommon",
+                                              (SEC_ALLOC
+                                               | SEC_IS_COMMON
+                                               | SEC_LINKER_CREATED));
+         if (scomm == NULL)
            return FALSE;
        }
 
@@ -4346,17 +4249,15 @@ _frv_create_got_section (bfd *abfd, struct bfd_link_info *info)
           | SEC_LINKER_CREATED);
   pltflags = flags;
 
-  s = bfd_make_section (abfd, ".got");
+  s = bfd_make_section_with_flags (abfd, ".got", flags);
   if (s == NULL
-      || !bfd_set_section_flags (abfd, s, flags)
       || !bfd_set_section_alignment (abfd, s, ptralign))
     return FALSE;
 
   if (bed->want_got_plt)
     {
-      s = bfd_make_section (abfd, ".got.plt");
+      s = bfd_make_section_with_flags (abfd, ".got.plt", flags);
       if (s == NULL
-         || !bfd_set_section_flags (abfd, s, flags)
          || !bfd_set_section_alignment (abfd, s, ptralign))
        return FALSE;
     }
@@ -4367,27 +4268,19 @@ _frv_create_got_section (bfd *abfd, struct bfd_link_info *info)
         (or .got.plt) section.  We don't do this in the linker script
         because we don't want to define the symbol if we are not creating
         a global offset table.  */
-      bh = NULL;
-      if (!(_bfd_generic_link_add_one_symbol
-           (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
-            bed->got_symbol_offset, (const char *) NULL, FALSE,
-            bed->collect, &bh)))
+      h = _bfd_elf_define_linkage_sym (abfd, info, s, "_GLOBAL_OFFSET_TABLE_");
+      elf_hash_table (info)->hgot = h;
+      if (h == NULL)
        return FALSE;
-      h = (struct elf_link_hash_entry *) bh;
-      h->def_regular = 1;
-      h->type = STT_OBJECT;
-      /* h->other = STV_HIDDEN; */ /* Should we?  */
 
       /* Machine-specific: we want the symbol for executables as
         well.  */
       if (! bfd_elf_link_record_dynamic_symbol (info, h))
        return FALSE;
-
-      elf_hash_table (info)->hgot = h;
     }
 
   /* The first bit of the global offset table is the header.  */
-  s->size += bed->got_header_size + bed->got_symbol_offset;
+  s->size += bed->got_header_size;
 
   /* This is the machine-specific part.  Create and initialize section
      data for the got.  */
@@ -4401,18 +4294,18 @@ _frv_create_got_section (bfd *abfd, struct bfd_link_info *info)
       if (! frvfdpic_relocs_info (info))
        return FALSE;
 
-      s = bfd_make_section (abfd, ".rel.got");
+      s = bfd_make_section_with_flags (abfd, ".rel.got",
+                                      (flags | SEC_READONLY));
       if (s == NULL
-         || ! bfd_set_section_flags (abfd, s, (flags | SEC_READONLY))
          || ! bfd_set_section_alignment (abfd, s, 2))
        return FALSE;
 
       frvfdpic_gotrel_section (info) = s;
 
       /* Machine-specific.  */
-      s = bfd_make_section (abfd, ".rofixup");
+      s = bfd_make_section_with_flags (abfd, ".rofixup",
+                                      (flags | SEC_READONLY));
       if (s == NULL
-         || ! bfd_set_section_flags (abfd, s, (flags | SEC_READONLY))
          || ! bfd_set_section_alignment (abfd, s, 2))
        return FALSE;
 
@@ -4459,39 +4352,28 @@ _frv_create_got_section (bfd *abfd, struct bfd_link_info *info)
   if (bed->plt_readonly)
     pltflags |= SEC_READONLY;
 
-  s = bfd_make_section (abfd, ".plt");
+  s = bfd_make_section_with_flags (abfd, ".plt", pltflags);
   if (s == NULL
-      || ! bfd_set_section_flags (abfd, s, pltflags)
       || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
     return FALSE;
   /* FRV-specific: remember it.  */
   frvfdpic_plt_section (info) = s;
 
+  /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
+     .plt section.  */
   if (bed->want_plt_sym)
     {
-      /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
-        .plt section.  */
-      struct elf_link_hash_entry *h;
-      struct bfd_link_hash_entry *bh = NULL;
-
-      if (! (_bfd_generic_link_add_one_symbol
-            (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s, 0, NULL,
-             FALSE, get_elf_backend_data (abfd)->collect, &bh)))
-       return FALSE;
-      h = (struct elf_link_hash_entry *) bh;
-      h->def_regular = 1;
-      h->type = STT_OBJECT;
-      /* h->other = STV_HIDDEN; */ /* Should we?  */
-
-      if (! info->executable
-         && ! bfd_elf_link_record_dynamic_symbol (info, h))
+      h = _bfd_elf_define_linkage_sym (abfd, info, s,
+                                      "_PROCEDURE_LINKAGE_TABLE_");
+      elf_hash_table (info)->hplt = h;
+      if (h == NULL)
        return FALSE;
     }
 
   /* FRV-specific: we want rel relocations for the plt.  */
-  s = bfd_make_section (abfd, ".rel.plt");
+  s = bfd_make_section_with_flags (abfd, ".rel.plt",
+                                  flags | SEC_READONLY);
   if (s == NULL
-      || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
       || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
     return FALSE;
   /* FRV-specific: remember it.  */
@@ -4537,9 +4419,9 @@ elf32_frvfdpic_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
         image and use a R_*_COPY reloc to tell the dynamic linker to
         initialize them at run time.  The linker script puts the .dynbss
         section into the .bss section of the final image.  */
-      s = bfd_make_section (abfd, ".dynbss");
-      if (s == NULL
-         || ! bfd_set_section_flags (abfd, s, SEC_ALLOC | SEC_LINKER_CREATED))
+      s = bfd_make_section_with_flags (abfd, ".dynbss",
+                                      SEC_ALLOC | SEC_LINKER_CREATED);
+      if (s == NULL)
        return FALSE;
 
       /* The .rel[a].bss section holds copy relocs.  This section is not
@@ -4555,11 +4437,11 @@ elf32_frvfdpic_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
      copy relocs.  */
       if (! info->shared)
        {
-         s = bfd_make_section (abfd,
-                               (bed->default_use_rela_p
-                                ? ".rela.bss" : ".rel.bss"));
+         s = bfd_make_section_with_flags (abfd,
+                                          (bed->default_use_rela_p
+                                           ? ".rela.bss" : ".rel.bss"),
+                                          flags | SEC_READONLY);
          if (s == NULL
-             || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
              || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
            return FALSE;
        }
@@ -4644,7 +4526,7 @@ _frvfdpic_count_tls_entries (struct frvfdpic_relocs_info *entry,
                             bfd_boolean subtract)
 {
   const int l = subtract ? -1 : 1;
-  
+
   /* Allocate space for a GOT entry with the TLS offset of the
      symbol.  */
   if (entry->tlsoff12)
@@ -4828,7 +4710,7 @@ _frvfdpic_relax_tls_entries (struct frvfdpic_relocs_info *entry,
          _frvfdpic_count_tls_entries (entry, dinfo, TRUE);
          changed = TRUE;
        }
-      
+
       entry->tlsplt =
        entry->tlsoff12 = entry->tlsofflos = entry->tlsoffhilo = 0;
     }
@@ -5226,32 +5108,8 @@ _frvfdpic_assign_plt_entries (void **entryp, void *info_)
   struct frvfdpic_relocs_info *entry = *entryp;
   struct _frvfdpic_dynamic_got_plt_info *dinfo = info_;
 
-#if 1
   if (entry->privfd)
     BFD_ASSERT (entry->fd_entry);
-#else
-  /* If this symbol requires a local function descriptor, allocate
-     one.  */
-  if (entry->privfd && entry->fd_entry == 0)
-    {
-      if (dinfo->got12.fdplt)
-       {
-         entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->got12);
-         dinfo->got12.fdplt -= 8;
-       }
-      else if (dinfo->gotlos.fdplt)
-       {
-         entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->gotlos);
-         dinfo->gotlos.fdplt -= 8;
-       }
-      else
-       {
-         BFD_ASSERT (dinfo->gothilo.fdplt);
-         entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->gothilo);
-         dinfo->gothilo.fdplt -= 8;
-       }
-    }
-#endif
 
   if (entry->plt)
     {
@@ -5336,7 +5194,7 @@ _frvfdpic_assign_plt_entries (void **entryp, void *info_)
          else
            size = 16;
        }
-      
+
       frvfdpic_plt_section (dinfo->g.info)->size += size;
     }
 
@@ -5707,7 +5565,6 @@ elf32_frvfdpic_always_size_sections (bfd *output_bfd,
   if (!info->relocatable)
     {
       struct elf_link_hash_entry *h;
-      asection *sec;
 
       /* Force a PT_GNU_STACK segment to be created.  */
       if (! elf_tdata (output_bfd)->stack_flags)
@@ -5734,13 +5591,6 @@ elf32_frvfdpic_always_size_sections (bfd *output_bfd,
          h->type = STT_OBJECT;
          /* This one must NOT be hidden.  */
        }
-
-      /* Create a stack section, and set its alignment.  */
-      sec = bfd_make_section (output_bfd, ".stack");
-
-      if (sec == NULL
-         || ! bfd_set_section_alignment (output_bfd, sec, 3))
-       return FALSE;
     }
 
   return TRUE;
@@ -5822,48 +5672,45 @@ elf32_frvfdpic_relax_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
 }
 
 static bfd_boolean
-elf32_frvfdpic_modify_segment_map (bfd *output_bfd,
-                                  struct bfd_link_info *info)
+elf32_frvfdpic_modify_program_headers (bfd *output_bfd,
+                                      struct bfd_link_info *info)
 {
+  struct elf_obj_tdata *tdata = elf_tdata (output_bfd);
   struct elf_segment_map *m;
+  Elf_Internal_Phdr *p;
 
   /* objcopy and strip preserve what's already there using
      elf32_frvfdpic_copy_private_bfd_data ().  */
   if (! info)
     return TRUE;
 
-  for (m = elf_tdata (output_bfd)->segment_map; m != NULL; m = m->next)
+  for (p = tdata->phdr, m = tdata->segment_map; m != NULL; m = m->next, p++)
     if (m->p_type == PT_GNU_STACK)
       break;
 
   if (m)
     {
-      asection *sec = bfd_get_section_by_name (output_bfd, ".stack");
       struct elf_link_hash_entry *h;
 
-      if (sec)
+      /* Obtain the pointer to the __stacksize symbol.  */
+      h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
+                               FALSE, FALSE, FALSE);
+      if (h)
        {
-         /* Obtain the pointer to the __stacksize symbol.  */
-         h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
-                                   FALSE, FALSE, FALSE);
          while (h->root.type == bfd_link_hash_indirect
                 || h->root.type == bfd_link_hash_warning)
-           h = (struct elf_link_hash_entry *)h->root.u.i.link;
+           h = (struct elf_link_hash_entry *) h->root.u.i.link;
          BFD_ASSERT (h->root.type == bfd_link_hash_defined);
+       }
 
-         /* Set the section size from the symbol value.  We
-            intentionally ignore the symbol section.  */
-         if (h->root.type == bfd_link_hash_defined)
-           sec->size = h->root.u.def.value;
-         else
-           sec->size = DEFAULT_STACK_SIZE;
+      /* Set the header p_memsz from the symbol value.  We
+        intentionally ignore the symbol section.  */
+      if (h && h->root.type == bfd_link_hash_defined)
+       p->p_memsz = h->root.u.def.value;
+      else
+       p->p_memsz = DEFAULT_STACK_SIZE;
 
-         /* Add the stack section to the PT_GNU_STACK segment,
-            such that its size and alignment requirements make it
-            to the segment.  */
-         m->sections[m->count] = sec;
-         m->count++;
-       }
+      p->p_align = 8;
     }
 
   return TRUE;
@@ -5924,7 +5771,7 @@ elf32_frvfdpic_finish_dynamic_sections (bfd *output_bfd,
              && (hend->type == bfd_link_hash_defined
                  || hend->type == bfd_link_hash_defweak))
            {
-             bfd_vma value = 
+             bfd_vma value =
                frvfdpic_gotfixup_section (info)->output_section->vma
                + frvfdpic_gotfixup_section (info)->output_offset
                + frvfdpic_gotfixup_section (info)->size
@@ -6219,7 +6066,12 @@ elf32_frv_check_relocs (abfd, info, sec, relocs)
       if (r_symndx < symtab_hdr->sh_info)
         h = NULL;
       else
-        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+       {
+         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+         while (h->root.type == bfd_link_hash_indirect
+                || h->root.type == bfd_link_hash_warning)
+           h = (struct elf_link_hash_entry *) h->root.u.i.link;
+       }
 
       switch (ELF32_R_TYPE (rel->r_info))
        {
@@ -6367,7 +6219,7 @@ elf32_frv_check_relocs (abfd, info, sec, relocs)
        case R_FRV_TLSDESC_VALUE:
          picrel->relocstlsd++;
          goto bad_reloc;
-         
+
        case R_FRV_GOTTLSDESC12:
          picrel->tlsdesc12 = 1;
          break;
@@ -6387,13 +6239,13 @@ elf32_frv_check_relocs (abfd, info, sec, relocs)
          picrel->tlsoff12 = 1;
          info->flags |= DF_STATIC_TLS;
          break;
-         
+
        case R_FRV_GOTTLSOFFHI:
        case R_FRV_GOTTLSOFFLO:
          picrel->tlsoffhilo = 1;
          info->flags |= DF_STATIC_TLS;
          break;
-         
+
        case R_FRV_TLSOFF:
          picrel->relocstlsoff++;
          info->flags |= DF_STATIC_TLS;
@@ -6931,6 +6783,86 @@ frv_elf_print_private_bfd_data (abfd, ptr)
 }
 
 \f
+/* Support for core dump NOTE sections.  */
+
+static bfd_boolean
+elf32_frv_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
+{
+  int offset;
+  unsigned int raw_size;
+
+  switch (note->descsz)
+    {
+      default:
+       return FALSE;
+
+      /* The Linux/FRV elf_prstatus struct is 268 bytes long.  The other
+         hardcoded offsets and sizes listed below (and contained within
+        this lexical block) refer to fields in the target's elf_prstatus
+        struct.  */
+      case 268:        
+       /* `pr_cursig' is at offset 12.  */
+       elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
+
+       /* `pr_pid' is at offset 24.  */
+       elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
+
+       /* `pr_reg' is at offset 72.  */
+       offset = 72;
+
+       /* Most grok_prstatus implementations set `raw_size' to the size
+          of the pr_reg field.  For Linux/FRV, we set `raw_size' to be
+          the size of `pr_reg' plus the size of `pr_exec_fdpic_loadmap'
+          and `pr_interp_fdpic_loadmap', both of which (by design)
+          immediately follow `pr_reg'.  This will allow these fields to
+          be viewed by GDB as registers.
+          
+          `pr_reg' is 184 bytes long.  `pr_exec_fdpic_loadmap' and
+          `pr_interp_fdpic_loadmap' are 4 bytes each.  */
+       raw_size = 184 + 4 + 4;
+
+       break;
+    }
+
+  /* Make a ".reg/999" section.  */
+  return _bfd_elfcore_make_pseudosection (abfd, ".reg", raw_size,
+                                         note->descpos + offset);
+}
+
+static bfd_boolean
+elf32_frv_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
+{
+  switch (note->descsz)
+    {
+      default:
+       return FALSE;
+
+      /* The Linux/FRV elf_prpsinfo struct is 124 bytes long.  */
+      case 124:
+
+       /* `pr_fname' is found at offset 28 and is 16 bytes long.  */
+       elf_tdata (abfd)->core_program
+         = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
+
+       /* `pr_psargs' is found at offset 44 and is 80 bytes long.  */
+       elf_tdata (abfd)->core_command
+         = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
+    }
+
+  /* Note that for some reason, a spurious space is tacked
+     onto the end of the args in some (at least one anyway)
+     implementations, so strip it off if it exists.  */
+
+  {
+    char *command = elf_tdata (abfd)->core_command;
+    int n = strlen (command);
+
+    if (0 < n && command[n - 1] == ' ')
+      command[n - 1] = '\0';
+  }
+
+  return TRUE;
+}
 #define ELF_ARCH               bfd_arch_frv
 #define ELF_MACHINE_CODE       EM_CYGNUS_FRV
 #define ELF_MAXPAGESIZE                0x1000
@@ -6941,7 +6873,6 @@ frv_elf_print_private_bfd_data (abfd, ptr)
 #define elf_info_to_howto                      frv_info_to_howto_rela
 #define elf_backend_relocate_section           elf32_frv_relocate_section
 #define elf_backend_gc_mark_hook               elf32_frv_gc_mark_hook
-#define elf_backend_gc_sweep_hook              elf32_frv_gc_sweep_hook
 #define elf_backend_check_relocs                elf32_frv_check_relocs
 #define elf_backend_object_p                   elf32_frv_object_p
 #define elf_backend_add_symbol_hook             elf32_frv_add_symbol_hook
@@ -6965,6 +6896,9 @@ frv_elf_print_private_bfd_data (abfd, ptr)
 #define elf_backend_finish_dynamic_sections \
                elf32_frv_finish_dynamic_sections
 
+#define elf_backend_grok_prstatus      elf32_frv_grok_prstatus
+#define elf_backend_grok_psinfo                elf32_frv_grok_psinfo
+
 #include "elf32-target.h"
 
 #undef ELF_MAXPAGESIZE
@@ -6986,9 +6920,9 @@ frv_elf_print_private_bfd_data (abfd, ptr)
 #undef elf_backend_always_size_sections
 #define elf_backend_always_size_sections \
                elf32_frvfdpic_always_size_sections
-#undef elf_backend_modify_segment_map
-#define elf_backend_modify_segment_map \
-               elf32_frvfdpic_modify_segment_map
+#undef elf_backend_modify_program_headers
+#define elf_backend_modify_program_headers \
+               elf32_frvfdpic_modify_program_headers
 #undef bfd_elf32_bfd_copy_private_bfd_data
 #define bfd_elf32_bfd_copy_private_bfd_data \
                elf32_frvfdpic_copy_private_bfd_data
This page took 0.043606 seconds and 4 git commands to generate.