Handle array- and string-like values in no-op pretty printers
[binutils-gdb.git] / bfd / elf32-metag.c
index 60d47287a37fe47daa0077cde801aaebc23a3099..43b76a9f9743b26762c02f85fab128e1b07fa4d1 100644 (file)
@@ -1,5 +1,5 @@
 /* Meta support for 32-bit ELF
 /* Meta support for 32-bit ELF
-   Copyright (C) 2013-2016 Free Software Foundation, Inc.
+   Copyright (C) 2013-2023 Free Software Foundation, Inc.
    Contributed by Imagination Technologies Ltd.
 
    This file is part of BFD, the Binary File Descriptor library.
    Contributed by Imagination Technologies Ltd.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -73,20 +73,18 @@ static const unsigned int plt_pic_entry[] =
 /* Variable names follow a coding style.
    Please follow this (Apps Hungarian) style:
 
 /* Variable names follow a coding style.
    Please follow this (Apps Hungarian) style:
 
-   Structure/Variable              Prefix
-   elf_link_hash_table             "etab"
-   elf_link_hash_entry             "eh"
+   Structure/Variable             Prefix
+   elf_link_hash_table            "etab"
+   elf_link_hash_entry            "eh"
 
 
-   elf_metag_link_hash_table       "htab"
-   elf_metag_link_hash_entry       "hh"
+   elf_metag_link_hash_table      "htab"
+   elf_metag_link_hash_entry      "hh"
 
 
-   bfd_link_hash_table             "btab"
-   bfd_link_hash_entry             "bh"
+   bfd_link_hash_table            "btab"
+   bfd_link_hash_entry            "bh"
 
    bfd_hash_table containing stubs "bstab"
 
    bfd_hash_table containing stubs "bstab"
-   elf_metag_stub_hash_entry       "hsh"
-
-   elf_metag_dyn_reloc_entry       "hdh"
+   elf_metag_stub_hash_entry      "hsh"
 
    Always remember to use GNU Coding Style.  */
 
 
    Always remember to use GNU Coding Style.  */
 
@@ -97,92 +95,92 @@ static reloc_howto_type elf_metag_howto_table[] =
   /* High order 16 bit absolute.  */
   HOWTO (R_METAG_HIADDR16,     /* type */
         16,                    /* rightshift */
   /* High order 16 bit absolute.  */
   HOWTO (R_METAG_HIADDR16,     /* type */
         16,                    /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         16,                    /* bitsize */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_HIADDR16",    /* name */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_HIADDR16",    /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Low order 16 bit absolute.  */
   HOWTO (R_METAG_LOADDR16,     /* type */
         0,                     /* rightshift */
 
   /* Low order 16 bit absolute.  */
   HOWTO (R_METAG_LOADDR16,     /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         16,                    /* bitsize */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont,/* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_LOADDR16",    /* name */
         3,                     /* bitpos */
         complain_overflow_dont,/* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_LOADDR16",    /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 32 bit absolute.  */
   HOWTO (R_METAG_ADDR32,       /* type */
         0,                     /* rightshift */
 
   /* 32 bit absolute.  */
   HOWTO (R_METAG_ADDR32,       /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_ADDR32",      /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_ADDR32",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0x00000000,            /* src_mask */
         0xffffffff,            /* dst_mask */
         0x00000000,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* No relocation.  */
   HOWTO (R_METAG_NONE,         /* type */
         0,                     /* rightshift */
 
   /* No relocation.  */
   HOWTO (R_METAG_NONE,         /* type */
         0,                     /* rightshift */
-        3,                     /* size (0 = byte, 1 = short, 2 = long) */
+        0,                     /* size */
         0,                     /* bitsize */
         0,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_NONE",        /* name */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_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 */
 
   /* 19 bit pc relative */
   HOWTO (R_METAG_RELBRANCH,    /* type */
         2,                     /* rightshift */
 
   /* 19 bit pc relative */
   HOWTO (R_METAG_RELBRANCH,    /* type */
         2,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         19,                    /* bitsize */
         19,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         5,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_RELBRANCH",   /* name */
         5,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_RELBRANCH",   /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x00ffffe0,            /* dst_mask */
         0,                     /* src_mask */
         0x00ffffe0,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* GET/SET offset */
   HOWTO (R_METAG_GETSETOFF,    /* type */
         0,                     /* rightshift */
 
   /* GET/SET offset */
   HOWTO (R_METAG_GETSETOFF,    /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         12,                    /* bitsize */
         12,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         7,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_GETSETOFF",   /* name */
         7,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_GETSETOFF",   /* 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 */
 
   EMPTY_HOWTO (6),
   EMPTY_HOWTO (7),
 
   EMPTY_HOWTO (6),
   EMPTY_HOWTO (7),
@@ -211,194 +209,194 @@ static reloc_howto_type elf_metag_howto_table[] =
 
   HOWTO (R_METAG_GNU_VTINHERIT, /* type */
         0,                     /* rightshift */
 
   HOWTO (R_METAG_GNU_VTINHERIT, /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         0,                     /* bitsize */
         0,                     /* bitsize */
-        FALSE,         /* pc_relative */
+        false,         /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         NULL,                  /* special_function */
         "R_METAG_GNU_VTINHERIT", /* name */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         NULL,                  /* special_function */
         "R_METAG_GNU_VTINHERIT", /* 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 */
 
   HOWTO (R_METAG_GNU_VTENTRY,  /* type */
         0,                     /* rightshift */
 
   HOWTO (R_METAG_GNU_VTENTRY,  /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         0,                     /* bitsize */
         0,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         _bfd_elf_rel_vtable_reloc_fn, /* special_function */
         "R_METAG_GNU_VTENTRY",  /* name */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         _bfd_elf_rel_vtable_reloc_fn, /* special_function */
         "R_METAG_GNU_VTENTRY",  /* 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 */
 
   /* High order 16 bit GOT offset */
   HOWTO (R_METAG_HI16_GOTOFF,  /* type */
         16,                    /* rightshift */
 
   /* High order 16 bit GOT offset */
   HOWTO (R_METAG_HI16_GOTOFF,  /* type */
         16,                    /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         16,                    /* bitsize */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_HI16_GOTOFF", /* name */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_HI16_GOTOFF", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Low order 16 bit GOT offset */
   HOWTO (R_METAG_LO16_GOTOFF,  /* type */
         0,                     /* rightshift */
 
   /* Low order 16 bit GOT offset */
   HOWTO (R_METAG_LO16_GOTOFF,  /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         16,                    /* bitsize */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_LO16_GOTOFF", /* name */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_LO16_GOTOFF", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* GET/SET GOT offset */
   HOWTO (R_METAG_GETSET_GOTOFF, /* type */
         0,                     /* rightshift */
 
   /* GET/SET GOT offset */
   HOWTO (R_METAG_GETSET_GOTOFF, /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         12,                    /* bitsize */
         12,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         7,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_GETSET_GOTOFF", /* name */
         7,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_GETSET_GOTOFF", /* 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 */
 
   /* GET/SET GOT relative */
   HOWTO (R_METAG_GETSET_GOT,   /* type */
         0,                     /* rightshift */
 
   /* GET/SET GOT relative */
   HOWTO (R_METAG_GETSET_GOT,   /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         12,                    /* bitsize */
         12,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         7,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_GETSET_GOT",  /* name */
         7,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_GETSET_GOT",  /* 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 */
 
   /* High order 16 bit GOT reference */
   HOWTO (R_METAG_HI16_GOTPC,   /* type */
         16,                    /* rightshift */
 
   /* High order 16 bit GOT reference */
   HOWTO (R_METAG_HI16_GOTPC,   /* type */
         16,                    /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         16,                    /* bitsize */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_HI16_GOTPC",  /* name */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_HI16_GOTPC",  /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Low order 16 bit GOT reference */
   HOWTO (R_METAG_LO16_GOTPC,   /* type */
         0,                     /* rightshift */
 
   /* Low order 16 bit GOT reference */
   HOWTO (R_METAG_LO16_GOTPC,   /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         16,                    /* bitsize */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_LO16_GOTPC",  /* name */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_LO16_GOTPC",  /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* High order 16 bit PLT */
   HOWTO (R_METAG_HI16_PLT,     /* type */
         16,                    /* rightshift */
 
   /* High order 16 bit PLT */
   HOWTO (R_METAG_HI16_PLT,     /* type */
         16,                    /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         16,                    /* bitsize */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_HI16_PLT",    /* name */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_HI16_PLT",    /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Low order 16 bit PLT */
   HOWTO (R_METAG_LO16_PLT,     /* type */
         0,                     /* rightshift */
 
   /* Low order 16 bit PLT */
   HOWTO (R_METAG_LO16_PLT,     /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         16,                    /* bitsize */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_LO16_PLT",    /* name */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_LO16_PLT",    /* 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 */
 
   HOWTO (R_METAG_RELBRANCH_PLT, /* type */
         2,                     /* rightshift */
 
   HOWTO (R_METAG_RELBRANCH_PLT, /* type */
         2,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         19,                    /* bitsize */
         19,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         5,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_RELBRANCH_PLT", /* name */
         5,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_RELBRANCH_PLT", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x00ffffe0,            /* dst_mask */
         0,                     /* src_mask */
         0x00ffffe0,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Dummy relocs used by the linker internally.  */
   HOWTO (R_METAG_GOTOFF,       /* type */
         0,                     /* rightshift */
 
   /* Dummy relocs used by the linker internally.  */
   HOWTO (R_METAG_GOTOFF,       /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_GOTOFF",      /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_GOTOFF",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_PLT,          /* type */
         0,                     /* rightshift */
 
   HOWTO (R_METAG_PLT,          /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_GOTOFF",      /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_GOTOFF",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* 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
@@ -407,276 +405,276 @@ static reloc_howto_type elf_metag_howto_table[] =
      run has to have the data at some particular address.  */
   HOWTO (R_METAG_COPY,         /* type */
         0,                     /* rightshift */
      run has to have the data at some particular address.  */
   HOWTO (R_METAG_COPY,         /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_COPY",        /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_COPY",        /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Marks a procedure linkage table entry for a symbol.  */
   HOWTO (R_METAG_JMP_SLOT,     /* type */
         0,                     /* rightshift */
 
   /* Marks a procedure linkage table entry for a symbol.  */
   HOWTO (R_METAG_JMP_SLOT,     /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_JMP_SLOT",    /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_JMP_SLOT",    /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* 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
      addend.  */
   HOWTO (R_METAG_RELATIVE,     /* type */
         0,                     /* rightshift */
 
   /* Used only by the dynamic linker.  When the object is run, this
      longword is set to the load address of the object, plus the
      addend.  */
   HOWTO (R_METAG_RELATIVE,     /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_RELATIVE",    /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_RELATIVE",    /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_GLOB_DAT,     /* type */
         0,                     /* rightshift */
 
   HOWTO (R_METAG_GLOB_DAT,     /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_GLOB_DAT",    /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_GLOB_DAT",    /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_GD,       /* type */
         0,                     /* rightshift */
 
   HOWTO (R_METAG_TLS_GD,       /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         16,                    /* bitsize */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_GD",      /* name */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_GD",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_LDM,      /* type */
         0,                     /* rightshift */
 
   HOWTO (R_METAG_TLS_LDM,      /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         16,                    /* bitsize */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LDM",     /* name */
         3,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LDM",     /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_LDO_HI16, /* type */
         16,                    /* rightshift */
 
   HOWTO (R_METAG_TLS_LDO_HI16, /* type */
         16,                    /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         16,                    /* bitsize */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LDO_HI16", /* name */
         3,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LDO_HI16", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_LDO_LO16, /* type */
         0,                     /* rightshift */
 
   HOWTO (R_METAG_TLS_LDO_LO16, /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         16,                    /* bitsize */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LDO_LO16", /* name */
         3,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LDO_LO16", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Dummy reloc used by the linker internally.  */
   HOWTO (R_METAG_TLS_LDO,      /* type */
         0,                     /* rightshift */
 
   /* Dummy reloc used by the linker internally.  */
   HOWTO (R_METAG_TLS_LDO,      /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         16,                    /* bitsize */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LDO",     /* name */
         3,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LDO",     /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_IE,       /* type */
         2,                     /* rightshift */
 
   HOWTO (R_METAG_TLS_IE,       /* type */
         2,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         12,                    /* bitsize */
         12,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         7,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_IE",      /* name */
         7,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_IE",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007ff80,            /* dst_mask */
         0,                     /* src_mask */
         0x0007ff80,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Dummy reloc used by the linker internally.  */
   HOWTO (R_METAG_TLS_IENONPIC,  /* type */
         0,                     /* rightshift */
 
   /* Dummy reloc used by the linker internally.  */
   HOWTO (R_METAG_TLS_IENONPIC,  /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         16,                    /* bitsize */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_IENONPIC", /* name */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_IENONPIC", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_IENONPIC_HI16,/* type */
         16,                    /* rightshift */
 
   HOWTO (R_METAG_TLS_IENONPIC_HI16,/* type */
         16,                    /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         16,                    /* bitsize */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_IENONPIC_HI16", /* name */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_IENONPIC_HI16", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_IENONPIC_LO16,/* type */
         0,                     /* rightshift */
 
   HOWTO (R_METAG_TLS_IENONPIC_LO16,/* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         16,                    /* bitsize */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_IENONPIC_LO16", /* name */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_IENONPIC_LO16", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_TPOFF,    /* type */
         0,                     /* rightshift */
 
   HOWTO (R_METAG_TLS_TPOFF,    /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_TPOFF",   /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_TPOFF",   /* 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 */
 
   HOWTO (R_METAG_TLS_DTPMOD,   /* type */
         0,                     /* rightshift */
 
   HOWTO (R_METAG_TLS_DTPMOD,   /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_DTPMOD",  /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_DTPMOD",  /* 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 */
 
   HOWTO (R_METAG_TLS_DTPOFF,   /* type */
         0,                     /* rightshift */
 
   HOWTO (R_METAG_TLS_DTPOFF,   /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_DTPOFF",  /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_DTPOFF",  /* 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 */
 
   /* Dummy reloc used by the linker internally.  */
   HOWTO (R_METAG_TLS_LE,       /* type */
         0,                     /* rightshift */
 
   /* Dummy reloc used by the linker internally.  */
   HOWTO (R_METAG_TLS_LE,       /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LE",      /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LE",      /* 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 */
 
   HOWTO (R_METAG_TLS_LE_HI16,  /* type */
         16,                    /* rightshift */
 
   HOWTO (R_METAG_TLS_LE_HI16,  /* type */
         16,                    /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         16,                    /* bitsize */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LE_HI16", /* name */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LE_HI16", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_LE_LO16,  /* type */
         0,                     /* rightshift */
 
   HOWTO (R_METAG_TLS_LE_LO16,  /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         16,                    /* bitsize */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LE_LO16", /* name */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LE_LO16", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
 };
 
 
 };
 
@@ -701,44 +699,44 @@ struct metag_reloc_map
 
 static const struct metag_reloc_map metag_reloc_map [] =
   {
 
 static const struct metag_reloc_map metag_reloc_map [] =
   {
-    { BFD_RELOC_NONE,                R_METAG_NONE },
-    { BFD_RELOC_32,                  R_METAG_ADDR32 },
-    { BFD_RELOC_METAG_HIADDR16,      R_METAG_HIADDR16 },
-    { BFD_RELOC_METAG_LOADDR16,      R_METAG_LOADDR16 },
+    { BFD_RELOC_NONE,               R_METAG_NONE },
+    { BFD_RELOC_32,                 R_METAG_ADDR32 },
+    { BFD_RELOC_METAG_HIADDR16,             R_METAG_HIADDR16 },
+    { BFD_RELOC_METAG_LOADDR16,             R_METAG_LOADDR16 },
     { BFD_RELOC_METAG_RELBRANCH,     R_METAG_RELBRANCH },
     { BFD_RELOC_METAG_GETSETOFF,     R_METAG_GETSETOFF },
     { BFD_RELOC_METAG_RELBRANCH,     R_METAG_RELBRANCH },
     { BFD_RELOC_METAG_GETSETOFF,     R_METAG_GETSETOFF },
-    { BFD_RELOC_VTABLE_INHERIT,      R_METAG_GNU_VTINHERIT },
-    { BFD_RELOC_VTABLE_ENTRY,        R_METAG_GNU_VTENTRY },
-    { BFD_RELOC_METAG_REL8,          R_METAG_REL8 },
-    { BFD_RELOC_METAG_REL16,         R_METAG_REL16 },
+    { BFD_RELOC_VTABLE_INHERIT,             R_METAG_GNU_VTINHERIT },
+    { BFD_RELOC_VTABLE_ENTRY,       R_METAG_GNU_VTENTRY },
+    { BFD_RELOC_METAG_REL8,         R_METAG_REL8 },
+    { BFD_RELOC_METAG_REL16,        R_METAG_REL16 },
     { BFD_RELOC_METAG_HI16_GOTOFF,   R_METAG_HI16_GOTOFF },
     { BFD_RELOC_METAG_LO16_GOTOFF,   R_METAG_LO16_GOTOFF },
     { BFD_RELOC_METAG_GETSET_GOTOFF, R_METAG_GETSET_GOTOFF },
     { BFD_RELOC_METAG_GETSET_GOT,    R_METAG_GETSET_GOT },
     { BFD_RELOC_METAG_HI16_GOTPC,    R_METAG_HI16_GOTPC },
     { BFD_RELOC_METAG_LO16_GOTPC,    R_METAG_LO16_GOTPC },
     { BFD_RELOC_METAG_HI16_GOTOFF,   R_METAG_HI16_GOTOFF },
     { BFD_RELOC_METAG_LO16_GOTOFF,   R_METAG_LO16_GOTOFF },
     { BFD_RELOC_METAG_GETSET_GOTOFF, R_METAG_GETSET_GOTOFF },
     { BFD_RELOC_METAG_GETSET_GOT,    R_METAG_GETSET_GOT },
     { BFD_RELOC_METAG_HI16_GOTPC,    R_METAG_HI16_GOTPC },
     { BFD_RELOC_METAG_LO16_GOTPC,    R_METAG_LO16_GOTPC },
-    { BFD_RELOC_METAG_HI16_PLT,      R_METAG_HI16_PLT },
-    { BFD_RELOC_METAG_LO16_PLT,      R_METAG_LO16_PLT },
+    { BFD_RELOC_METAG_HI16_PLT,             R_METAG_HI16_PLT },
+    { BFD_RELOC_METAG_LO16_PLT,             R_METAG_LO16_PLT },
     { BFD_RELOC_METAG_RELBRANCH_PLT, R_METAG_RELBRANCH_PLT },
     { BFD_RELOC_METAG_RELBRANCH_PLT, R_METAG_RELBRANCH_PLT },
-    { BFD_RELOC_METAG_GOTOFF,        R_METAG_GOTOFF },
-    { BFD_RELOC_METAG_PLT,           R_METAG_PLT },
-    { BFD_RELOC_METAG_COPY,          R_METAG_COPY },
-    { BFD_RELOC_METAG_JMP_SLOT,      R_METAG_JMP_SLOT },
-    { BFD_RELOC_METAG_RELATIVE,      R_METAG_RELATIVE },
-    { BFD_RELOC_METAG_GLOB_DAT,      R_METAG_GLOB_DAT },
-    { BFD_RELOC_METAG_TLS_GD,        R_METAG_TLS_GD },
-    { BFD_RELOC_METAG_TLS_LDM,       R_METAG_TLS_LDM },
+    { BFD_RELOC_METAG_GOTOFF,       R_METAG_GOTOFF },
+    { BFD_RELOC_METAG_PLT,          R_METAG_PLT },
+    { BFD_RELOC_METAG_COPY,         R_METAG_COPY },
+    { BFD_RELOC_METAG_JMP_SLOT,             R_METAG_JMP_SLOT },
+    { BFD_RELOC_METAG_RELATIVE,             R_METAG_RELATIVE },
+    { BFD_RELOC_METAG_GLOB_DAT,             R_METAG_GLOB_DAT },
+    { BFD_RELOC_METAG_TLS_GD,       R_METAG_TLS_GD },
+    { BFD_RELOC_METAG_TLS_LDM,      R_METAG_TLS_LDM },
     { BFD_RELOC_METAG_TLS_LDO_HI16,  R_METAG_TLS_LDO_HI16 },
     { BFD_RELOC_METAG_TLS_LDO_LO16,  R_METAG_TLS_LDO_LO16 },
     { BFD_RELOC_METAG_TLS_LDO_HI16,  R_METAG_TLS_LDO_HI16 },
     { BFD_RELOC_METAG_TLS_LDO_LO16,  R_METAG_TLS_LDO_LO16 },
-    { BFD_RELOC_METAG_TLS_LDO,       R_METAG_TLS_LDO },
-    { BFD_RELOC_METAG_TLS_IE,        R_METAG_TLS_IE },
+    { BFD_RELOC_METAG_TLS_LDO,      R_METAG_TLS_LDO },
+    { BFD_RELOC_METAG_TLS_IE,       R_METAG_TLS_IE },
     { BFD_RELOC_METAG_TLS_IENONPIC,  R_METAG_TLS_IENONPIC },
     { BFD_RELOC_METAG_TLS_IENONPIC_HI16, R_METAG_TLS_IENONPIC_HI16 },
     { BFD_RELOC_METAG_TLS_IENONPIC_LO16, R_METAG_TLS_IENONPIC_LO16 },
     { BFD_RELOC_METAG_TLS_TPOFF,     R_METAG_TLS_TPOFF },
     { BFD_RELOC_METAG_TLS_DTPMOD,    R_METAG_TLS_DTPMOD },
     { BFD_RELOC_METAG_TLS_DTPOFF,    R_METAG_TLS_DTPOFF },
     { BFD_RELOC_METAG_TLS_IENONPIC,  R_METAG_TLS_IENONPIC },
     { BFD_RELOC_METAG_TLS_IENONPIC_HI16, R_METAG_TLS_IENONPIC_HI16 },
     { BFD_RELOC_METAG_TLS_IENONPIC_LO16, R_METAG_TLS_IENONPIC_LO16 },
     { BFD_RELOC_METAG_TLS_TPOFF,     R_METAG_TLS_TPOFF },
     { BFD_RELOC_METAG_TLS_DTPMOD,    R_METAG_TLS_DTPMOD },
     { BFD_RELOC_METAG_TLS_DTPOFF,    R_METAG_TLS_DTPOFF },
-    { BFD_RELOC_METAG_TLS_LE,        R_METAG_TLS_LE },
+    { BFD_RELOC_METAG_TLS_LE,       R_METAG_TLS_LE },
     { BFD_RELOC_METAG_TLS_LE_HI16,   R_METAG_TLS_LE_HI16 },
     { BFD_RELOC_METAG_TLS_LE_LO16,   R_METAG_TLS_LE_LO16 },
   };
     { BFD_RELOC_METAG_TLS_LE_HI16,   R_METAG_TLS_LE_HI16 },
     { BFD_RELOC_METAG_TLS_LE_LO16,   R_METAG_TLS_LE_LO16 },
   };
@@ -787,23 +785,6 @@ struct elf_metag_link_hash_entry
      symbol.  */
   struct elf_metag_stub_hash_entry *hsh_cache;
 
      symbol.  */
   struct elf_metag_stub_hash_entry *hsh_cache;
 
-  /* Used to count relocations for delayed sizing of relocation
-     sections.  */
-  struct elf_metag_dyn_reloc_entry {
-
-    /* Next relocation in the chain.  */
-    struct elf_metag_dyn_reloc_entry *hdh_next;
-
-    /* The input section of the reloc.  */
-    asection *sec;
-
-    /* Number of relocs copied in this section.  */
-    bfd_size_type count;
-
-    /* Number of relative relocs copied for the input section.  */
-    bfd_size_type relative_count;
-  } *dyn_relocs;
-
   enum
     {
       GOT_UNKNOWN = 0, GOT_NORMAL = 1, GOT_TLS_IE = 2, GOT_TLS_LDM = 4, GOT_TLS_GD = 8
   enum
     {
       GOT_UNKNOWN = 0, GOT_NORMAL = 1, GOT_TLS_IE = 2, GOT_TLS_LDM = 4, GOT_TLS_GD = 8
@@ -842,13 +823,6 @@ struct elf_metag_link_hash_table
   asection **input_list;
   Elf_Internal_Sym **all_local_syms;
 
   asection **input_list;
   Elf_Internal_Sym **all_local_syms;
 
-  /* Short-cuts to get to dynamic linker sections.  */
-  asection *sdynbss;
-  asection *srelbss;
-
-  /* Small local sym cache.  */
-  struct sym_cache sym_cache;
-
   /* Data for LDM relocations.  */
   union
   {
   /* Data for LDM relocations.  */
   union
   {
@@ -883,8 +857,8 @@ tpoff (struct bfd_link_info *info, bfd_vma address)
                         elf_hash_table (info)->tls_sec->alignment_power));
 }
 
                         elf_hash_table (info)->tls_sec->alignment_power));
 }
 
-static void
-metag_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
+static bool
+metag_info_to_howto_rela (bfd *abfd,
                          arelent *cache_ptr,
                          Elf_Internal_Rela *dst)
 {
                          arelent *cache_ptr,
                          Elf_Internal_Rela *dst)
 {
@@ -894,10 +868,13 @@ metag_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
   if (r_type >= (unsigned int) R_METAG_MAX)
     {
       /* xgettext:c-format */
   if (r_type >= (unsigned int) R_METAG_MAX)
     {
       /* xgettext:c-format */
-      _bfd_error_handler (_("%B: invalid METAG reloc number: %d"), abfd, r_type);
-      r_type = 0;
+      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+                         abfd, r_type);
+      bfd_set_error (bfd_error_bad_value);
+      return false;
     }
   cache_ptr->howto = & elf_metag_howto_table [r_type];
     }
   cache_ptr->howto = & elf_metag_howto_table [r_type];
+  return true;
 }
 
 static reloc_howto_type *
 }
 
 static reloc_howto_type *
@@ -929,8 +906,9 @@ metag_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
 
 /* Various hash macros and functions.  */
 #define metag_link_hash_table(p) \
 
 /* Various hash macros and functions.  */
 #define metag_link_hash_table(p) \
-  (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
-  == METAG_ELF_DATA ? ((struct elf_metag_link_hash_table *) ((p)->hash)) : NULL)
+  ((is_elf_hash_table ((p)->hash)                                      \
+    && elf_hash_table_id (elf_hash_table (p)) == METAG_ELF_DATA)       \
+   ? (struct elf_metag_link_hash_table *) (p)->hash : NULL)
 
 #define metag_elf_hash_entry(ent) \
   ((struct elf_metag_link_hash_entry *)(ent))
 
 #define metag_elf_hash_entry(ent) \
   ((struct elf_metag_link_hash_entry *)(ent))
@@ -1010,7 +988,6 @@ metag_link_hash_newfunc (struct bfd_hash_entry *entry,
       /* Initialize the local fields.  */
       hh = (struct elf_metag_link_hash_entry *) entry;
       hh->hsh_cache = NULL;
       /* Initialize the local fields.  */
       hh = (struct elf_metag_link_hash_entry *) entry;
       hh->hsh_cache = NULL;
-      hh->dyn_relocs = NULL;
       hh->tls_type = GOT_UNKNOWN;
     }
 
       hh->tls_type = GOT_UNKNOWN;
     }
 
@@ -1037,7 +1014,7 @@ static struct bfd_link_hash_table *
 elf_metag_link_hash_table_create (bfd *abfd)
 {
   struct elf_metag_link_hash_table *htab;
 elf_metag_link_hash_table_create (bfd *abfd)
 {
   struct elf_metag_link_hash_table *htab;
-  bfd_size_type amt = sizeof (*htab);
+  size_t amt = sizeof (*htab);
 
   htab = bfd_zmalloc (amt);
   if (htab == NULL)
 
   htab = bfd_zmalloc (amt);
   if (htab == NULL)
@@ -1060,6 +1037,7 @@ elf_metag_link_hash_table_create (bfd *abfd)
       return NULL;
     }
   htab->etab.root.hash_table_free = elf_metag_link_hash_table_free;
       return NULL;
     }
   htab->etab.root.hash_table_free = elf_metag_link_hash_table_free;
+  htab->etab.dt_pltgot_required = true;
 
   return &htab->etab.root;
 }
 
   return &htab->etab.root;
 }
@@ -1142,7 +1120,7 @@ metag_get_stub_entry (const asection *input_section,
        return NULL;
 
       hsh = metag_stub_hash_lookup (&htab->bstab,
        return NULL;
 
       hsh = metag_stub_hash_lookup (&htab->bstab,
-                                   stub_name, FALSE, FALSE);
+                                   stub_name, false, false);
 
       if (hh != NULL)
        hh->hsh_cache = hsh;
 
       if (hh != NULL)
        hh->hsh_cache = hsh;
@@ -1195,11 +1173,11 @@ metag_add_stub (const char *stub_name,
 
   /* Enter this entry into the linker stub hash table.  */
   hsh = metag_stub_hash_lookup (&htab->bstab, stub_name,
 
   /* Enter this entry into the linker stub hash table.  */
   hsh = metag_stub_hash_lookup (&htab->bstab, stub_name,
-                               TRUE, FALSE);
+                               true, false);
   if (hsh == NULL)
     {
       /* xgettext:c-format */
   if (hsh == NULL)
     {
       /* xgettext:c-format */
-      _bfd_error_handler (_("%B: cannot create stub entry %s"),
+      _bfd_error_handler (_("%pB: cannot create stub entry %s"),
                          section->owner, stub_name);
       return NULL;
     }
                          section->owner, stub_name);
       return NULL;
     }
@@ -1213,7 +1191,7 @@ metag_add_stub (const char *stub_name,
 /* Check a signed integer value can be represented in the given number
    of bits.  */
 
 /* Check a signed integer value can be represented in the given number
    of bits.  */
 
-static bfd_boolean
+static bool
 within_signed_range (int value, unsigned int bits)
 {
   int min_val = -(1 << (bits - 1));
 within_signed_range (int value, unsigned int bits)
 {
   int min_val = -(1 << (bits - 1));
@@ -1412,7 +1390,7 @@ metag_final_link_relocate (reloc_howto_type *howto,
                                              rel, relend, howto, contents) \
   {                                                                    \
     _bfd_clear_contents (howto, input_bfd, input_section,              \
                                              rel, relend, howto, contents) \
   {                                                                    \
     _bfd_clear_contents (howto, input_bfd, input_section,              \
-                        contents + rel->r_offset);                     \
+                        contents, rel->r_offset);                      \
                                                                        \
     if (bfd_link_relocatable (info)                                    \
        && (input_section->flags & SEC_DEBUGGING))                      \
                                                                        \
     if (bfd_link_relocatable (info)                                    \
        && (input_section->flags & SEC_DEBUGGING))                      \
@@ -1474,7 +1452,7 @@ going to be the section symbol corresponding to the output
 section, which means that the addend must be adjusted
 accordingly.  */
 
 section, which means that the addend must be adjusted
 accordingly.  */
 
-static bfd_boolean
+static int
 elf_metag_relocate_section (bfd *output_bfd,
                            struct bfd_link_info *info,
                            bfd *input_bfd,
 elf_metag_relocate_section (bfd *output_bfd,
                            struct bfd_link_info *info,
                            bfd *input_bfd,
@@ -1535,12 +1513,12 @@ elf_metag_relocate_section (bfd *output_bfd,
 
          name = bfd_elf_string_from_elf_section
            (input_bfd, symtab_hdr->sh_link, sym->st_name);
 
          name = bfd_elf_string_from_elf_section
            (input_bfd, symtab_hdr->sh_link, sym->st_name);
-         name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
+         name = name == NULL ? bfd_section_name (sec) : name;
        }
       else
        {
          struct elf_link_hash_entry *eh;
        }
       else
        {
          struct elf_link_hash_entry *eh;
-         bfd_boolean unresolved_reloc, warned, ignored;
+         bool unresolved_reloc, warned, ignored;
 
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
                                   r_symndx, symtab_hdr, eh_syms,
 
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
                                   r_symndx, symtab_hdr, eh_syms,
@@ -1568,8 +1546,8 @@ elf_metag_relocate_section (bfd *output_bfd,
          if ((bfd_link_pic (info)
               && r_symndx != STN_UNDEF
               && (input_section->flags & SEC_ALLOC) != 0
          if ((bfd_link_pic (info)
               && r_symndx != STN_UNDEF
               && (input_section->flags & SEC_ALLOC) != 0
-              && (r_type != R_METAG_RELBRANCH
-                  || !SYMBOL_CALLS_LOCAL (info, &hh->eh)))
+              && !(r_type == R_METAG_RELBRANCH
+                   && (hh == NULL || SYMBOL_CALLS_LOCAL (info, &hh->eh))))
              || (!bfd_link_pic (info)
                  && hh != NULL
                  && hh->eh.dynindx != -1
              || (!bfd_link_pic (info)
                  && hh != NULL
                  && hh->eh.dynindx != -1
@@ -1580,7 +1558,7 @@ elf_metag_relocate_section (bfd *output_bfd,
                      || hh->eh.root.type == bfd_link_hash_undefined)))
            {
              Elf_Internal_Rela outrel;
                      || hh->eh.root.type == bfd_link_hash_undefined)))
            {
              Elf_Internal_Rela outrel;
-             bfd_boolean skip, relocate;
+             bool skip, relocate;
              bfd_byte *loc;
 
              /* When generating a shared object, these relocations
              bfd_byte *loc;
 
              /* When generating a shared object, these relocations
@@ -1590,17 +1568,17 @@ elf_metag_relocate_section (bfd *output_bfd,
              sreloc = elf_section_data (input_section)->sreloc;
              BFD_ASSERT (sreloc != NULL);
 
              sreloc = elf_section_data (input_section)->sreloc;
              BFD_ASSERT (sreloc != NULL);
 
-             skip = FALSE;
-             relocate = FALSE;
+             skip = false;
+             relocate = false;
 
              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_elf_section_offset (output_bfd,
                                                         info,
                                                         input_section,
                                                         rel->r_offset);
              if (outrel.r_offset == (bfd_vma) -1)
-               skip = TRUE;
+               skip = true;
              else if (outrel.r_offset == (bfd_vma) -2)
              else if (outrel.r_offset == (bfd_vma) -2)
-               skip = TRUE, relocate = TRUE;
+               skip = true, relocate = true;
              outrel.r_offset += (input_section->output_section->vma
                                  + input_section->output_offset);
 
              outrel.r_offset += (input_section->output_section->vma
                                  + input_section->output_offset);
 
@@ -1623,7 +1601,7 @@ elf_metag_relocate_section (bfd *output_bfd,
                      || ((info->symbolic || hh->eh.dynindx == -1)
                          && hh->eh.def_regular))
                    {
                      || ((info->symbolic || hh->eh.dynindx == -1)
                          && hh->eh.def_regular))
                    {
-                     relocate = TRUE;
+                     relocate = true;
                      outrel.r_info = ELF32_R_INFO (0, R_METAG_RELATIVE);
                      outrel.r_addend = relocation + rel->r_addend;
                    }
                      outrel.r_info = ELF32_R_INFO (0, R_METAG_RELATIVE);
                      outrel.r_addend = relocation + rel->r_addend;
                    }
@@ -1694,13 +1672,13 @@ elf_metag_relocate_section (bfd *output_bfd,
        case R_METAG_GETSET_GOT:
          {
            bfd_vma off;
        case R_METAG_GETSET_GOT:
          {
            bfd_vma off;
-           bfd_boolean do_got = 0;
+           bool do_got = 0;
 
            /* Relocation is to the entry for this symbol in the
               global offset table.  */
            if (hh != NULL)
              {
 
            /* Relocation is to the entry for this symbol in the
               global offset table.  */
            if (hh != NULL)
              {
-               bfd_boolean dyn;
+               bool dyn;
 
                off = hh->eh.got.offset;
                dyn = htab->etab.dynamic_sections_created;
 
                off = hh->eh.got.offset;
                dyn = htab->etab.dynamic_sections_created;
@@ -1789,7 +1767,7 @@ elf_metag_relocate_section (bfd *output_bfd,
            indx = 0;
            if (hh != NULL)
              {
            indx = 0;
            if (hh != NULL)
              {
-               bfd_boolean dyn;
+               bool dyn;
                dyn = htab->etab.dynamic_sections_created;
 
                if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
                dyn = htab->etab.dynamic_sections_created;
 
                if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
@@ -1820,7 +1798,7 @@ elf_metag_relocate_section (bfd *output_bfd,
              off &= ~1;
            else
              {
              off &= ~1;
            else
              {
-               bfd_boolean need_relocs = FALSE;
+               bool need_relocs = false;
                Elf_Internal_Rela outrel;
                bfd_byte *loc = NULL;
                int cur_off = off;
                Elf_Internal_Rela outrel;
                bfd_byte *loc = NULL;
                int cur_off = off;
@@ -1834,7 +1812,7 @@ elf_metag_relocate_section (bfd *output_bfd,
                        || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
                        || hh->eh.root.type != bfd_link_hash_undefweak))
                  {
                        || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
                        || hh->eh.root.type != bfd_link_hash_undefweak))
                  {
-                   need_relocs = TRUE;
+                   need_relocs = true;
                    loc = htab->etab.srelgot->contents;
                    /* FIXME (CAO): Should this be reloc_count++ ? */
                    loc += htab->etab.srelgot->reloc_count * sizeof (Elf32_External_Rela);
                    loc = htab->etab.srelgot->contents;
                    /* FIXME (CAO): Should this be reloc_count++ ? */
                    loc += htab->etab.srelgot->reloc_count * sizeof (Elf32_External_Rela);
@@ -1876,12 +1854,12 @@ elf_metag_relocate_section (bfd *output_bfd,
                        /* We don't support changing the TLS model.  */
                        /* PR 20675 */
                        if (bfd_link_pic (info))
                        /* We don't support changing the TLS model.  */
                        /* PR 20675 */
                        if (bfd_link_pic (info))
-                         _bfd_error_handler (_("%B(%A): multiple TLS models are not supported"),
-                                             input_bfd, input_section, name);
+                         _bfd_error_handler (_("%pB(%pA): multiple TLS models are not supported"),
+                                             input_bfd, input_section);
                        else
                        else
-                         _bfd_error_handler (_("%B(%A): shared library symbol %s encountered whilst performing a static link"),
+                         _bfd_error_handler (_("%pB(%pA): shared library symbol %s encountered whilst performing a static link"),
                                              input_bfd, input_section, name);
                                              input_bfd, input_section, name);
-                       return FALSE;
+                       return false;
                      }
 
                    cur_off += 8;
                      }
 
                    cur_off += 8;
@@ -1932,10 +1910,11 @@ elf_metag_relocate_section (bfd *output_bfd,
            {
              _bfd_error_handler
                /* xgettext:c-format */
            {
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B(%A+0x%lx): R_METAG_TLS_LE/IENONPIC relocation not permitted in shared object"),
-                input_bfd, input_section,
-                (long) rel->r_offset, howto->name);
-             return FALSE;
+               (_("%pB(%pA+%#" PRIx64 "): "
+                  "%s relocation not permitted in shared object"),
+                input_bfd, input_section, (uint64_t) rel->r_offset,
+                howto->name);
+             return false;
            }
          else
            relocation = tpoff (info, relocation);
            }
          else
            relocation = tpoff (info, relocation);
@@ -1998,7 +1977,7 @@ elf_metag_relocate_section (bfd *output_bfd,
 
            case bfd_reloc_undefined:
              (*info->callbacks->undefined_symbol)
 
            case bfd_reloc_undefined:
              (*info->callbacks->undefined_symbol)
-               (info, name, input_bfd, input_section, rel->r_offset, TRUE);
+               (info, name, input_bfd, input_section, rel->r_offset, true);
              break;
 
            case bfd_reloc_outofrange:
              break;
 
            case bfd_reloc_outofrange:
@@ -2024,13 +2003,13 @@ elf_metag_relocate_section (bfd *output_bfd,
        }
     }
 
        }
     }
 
-  return TRUE;
+  return true;
 }
 
 /* Create the .plt and .got sections, and set up our hash table
    short-cuts to various dynamic sections.  */
 
 }
 
 /* Create the .plt and .got sections, and set up our hash table
    short-cuts to various dynamic sections.  */
 
-static bfd_boolean
+static bool
 elf_metag_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
 {
   struct elf_metag_link_hash_table *htab;
 elf_metag_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
 {
   struct elf_metag_link_hash_table *htab;
@@ -2041,11 +2020,11 @@ elf_metag_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
   /* Don't try to create the .plt and .got twice.  */
   htab = metag_link_hash_table (info);
   if (htab->etab.splt != NULL)
   /* Don't try to create the .plt and .got twice.  */
   htab = metag_link_hash_table (info);
   if (htab->etab.splt != NULL)
-    return TRUE;
+    return true;
 
   /* Call the generic code to do most of the work.  */
   if (! _bfd_elf_create_dynamic_sections (abfd, info))
 
   /* Call the generic code to do most of the work.  */
   if (! _bfd_elf_create_dynamic_sections (abfd, info))
-    return FALSE;
+    return false;
 
   /* The header goes at the start of the dynamic .got section, which
      is placed after the dynamic .got.plt section.  ie. The header is
 
   /* The header goes at the start of the dynamic .got section, which
      is placed after the dynamic .got.plt section.  ie. The header is
@@ -2056,8 +2035,8 @@ elf_metag_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
   bh = NULL;
   if (!(_bfd_generic_link_add_one_symbol
        (info, abfd, "__GLOBAL_OFFSET_TABLE__", BSF_GLOBAL, htab->etab.sgot,
   bh = NULL;
   if (!(_bfd_generic_link_add_one_symbol
        (info, abfd, "__GLOBAL_OFFSET_TABLE__", BSF_GLOBAL, htab->etab.sgot,
-        (bfd_vma) 0, NULL, FALSE, bed->collect, &bh)))
-    return FALSE;
+        (bfd_vma) 0, NULL, false, bed->collect, &bh)))
+    return false;
   eh = (struct elf_link_hash_entry *) bh;
   eh->def_regular = 1;
   eh->type = STT_OBJECT;
   eh = (struct elf_link_hash_entry *) bh;
   eh->def_regular = 1;
   eh->type = STT_OBJECT;
@@ -2065,14 +2044,11 @@ elf_metag_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
 
   if (! bfd_link_executable (info)
       && ! bfd_elf_link_record_dynamic_symbol (info, eh))
 
   if (! bfd_link_executable (info)
       && ! bfd_elf_link_record_dynamic_symbol (info, eh))
-    return FALSE;
+    return false;
 
   htab->etab.hgot = eh;
 
 
   htab->etab.hgot = eh;
 
-  htab->sdynbss = bfd_get_linker_section (abfd, ".dynbss");
-  htab->srelbss = bfd_get_linker_section (abfd, ".rela.bss");
-
-  return TRUE;
+  return true;
 }
 
 /* Look through the relocs for a section during the first phase, and
 }
 
 /* Look through the relocs for a section during the first phase, and
@@ -2080,7 +2056,7 @@ elf_metag_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
    table, and dynamic reloc sections.  At this point we haven't
    necessarily read all the input files.  */
 
    table, and dynamic reloc sections.  At this point we haven't
    necessarily read all the input files.  */
 
-static bfd_boolean
+static bool
 elf_metag_check_relocs (bfd *abfd,
                        struct bfd_link_info *info,
                        asection *sec,
 elf_metag_check_relocs (bfd *abfd,
                        struct bfd_link_info *info,
                        asection *sec,
@@ -2096,7 +2072,7 @@ elf_metag_check_relocs (bfd *abfd,
   int tls_type = GOT_UNKNOWN, old_tls_type = GOT_UNKNOWN;
 
   if (bfd_link_relocatable (info))
   int tls_type = GOT_UNKNOWN, old_tls_type = GOT_UNKNOWN;
 
   if (bfd_link_relocatable (info))
-    return TRUE;
+    return true;
 
   htab = metag_link_hash_table (info);
   dynobj = htab->etab.dynobj;
 
   htab = metag_link_hash_table (info);
   dynobj = htab->etab.dynobj;
@@ -2105,7 +2081,7 @@ elf_metag_check_relocs (bfd *abfd,
   sreloc = NULL;
 
   if (htab == NULL)
   sreloc = NULL;
 
   if (htab == NULL)
-    return FALSE;
+    return false;
 
   rel_end = relocs + sec->reloc_count;
   for (rel = relocs; rel < rel_end; rel++)
 
   rel_end = relocs + sec->reloc_count;
   for (rel = relocs; rel < rel_end; rel++)
@@ -2120,10 +2096,10 @@ elf_metag_check_relocs (bfd *abfd,
       if (r_symndx < symtab_hdr->sh_info)
        {
          /* A local symbol.  */
       if (r_symndx < symtab_hdr->sh_info)
        {
          /* A local symbol.  */
-         isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+         isym = bfd_sym_from_r_symndx (&htab->etab.sym_cache,
                                        abfd, r_symndx);
          if (isym == NULL)
                                        abfd, r_symndx);
          if (isym == NULL)
-           return FALSE;
+           return false;
 
          hh = NULL;
        }
 
          hh = NULL;
        }
@@ -2136,10 +2112,6 @@ elf_metag_check_relocs (bfd *abfd,
          while (hh->eh.root.type == bfd_link_hash_indirect
                 || hh->eh.root.type == bfd_link_hash_warning)
            hh = (struct elf_metag_link_hash_entry *) hh->eh.root.u.i.link;
          while (hh->eh.root.type == bfd_link_hash_indirect
                 || hh->eh.root.type == bfd_link_hash_warning)
            hh = (struct elf_metag_link_hash_entry *) hh->eh.root.u.i.link;
-
-         /* PR15323, ref flags aren't set for references in the same
-            object.  */
-         hh->eh.root.non_ir_ref = 1;
        }
 
       /* Some relocs require a global offset table.  */
        }
 
       /* Some relocs require a global offset table.  */
@@ -2163,7 +2135,7 @@ elf_metag_check_relocs (bfd *abfd,
              if (dynobj == NULL)
                htab->etab.dynobj = dynobj = abfd;
              if (!elf_metag_create_dynamic_sections (dynobj, info))
              if (dynobj == NULL)
                htab->etab.dynobj = dynobj = abfd;
              if (!elf_metag_create_dynamic_sections (dynobj, info))
-               return FALSE;
+               return false;
              break;
 
            default:
              break;
 
            default:
@@ -2212,7 +2184,7 @@ elf_metag_check_relocs (bfd *abfd,
                  local_got_refcounts = ((bfd_signed_vma *)
                                         bfd_zalloc (abfd, size));
                  if (local_got_refcounts == NULL)
                  local_got_refcounts = ((bfd_signed_vma *)
                                         bfd_zalloc (abfd, size));
                  if (local_got_refcounts == NULL)
-                   return FALSE;
+                   return false;
                  elf_local_got_refcounts (abfd) = local_got_refcounts;
                  memset (metag_elf_local_got_tls_type (abfd),
                          GOT_UNKNOWN, symtab_hdr->sh_info);
                  elf_local_got_refcounts (abfd) = local_got_refcounts;
                  memset (metag_elf_local_got_tls_type (abfd),
                          GOT_UNKNOWN, symtab_hdr->sh_info);
@@ -2276,10 +2248,10 @@ elf_metag_check_relocs (bfd *abfd,
                name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
              _bfd_error_handler
                /* xgettext:c-format */
                name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
+               (_("%pB: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
                 abfd, elf_metag_howto_table[r_type].name, name);
              bfd_set_error (bfd_error_bad_value);
                 abfd, elf_metag_howto_table[r_type].name, name);
              bfd_set_error (bfd_error_bad_value);
-             return FALSE;
+             return false;
            }
 
          /* Fall through.  */
            }
 
          /* Fall through.  */
@@ -2324,8 +2296,8 @@ elf_metag_check_relocs (bfd *abfd,
                  && (hh->eh.root.type == bfd_link_hash_defweak
                      || !hh->eh.def_regular)))
            {
                  && (hh->eh.root.type == bfd_link_hash_defweak
                      || !hh->eh.def_regular)))
            {
-             struct elf_metag_dyn_reloc_entry *hdh_p;
-             struct elf_metag_dyn_reloc_entry **hdh_head;
+             struct elf_dyn_relocs *hdh_p;
+             struct elf_dyn_relocs **hdh_head;
 
              if (dynobj == NULL)
                htab->etab.dynobj = dynobj = abfd;
 
              if (dynobj == NULL)
                htab->etab.dynobj = dynobj = abfd;
@@ -2336,12 +2308,12 @@ elf_metag_check_relocs (bfd *abfd,
              if (sreloc == NULL)
                {
                  sreloc = _bfd_elf_make_dynamic_reloc_section
              if (sreloc == NULL)
                {
                  sreloc = _bfd_elf_make_dynamic_reloc_section
-                   (sec, htab->etab.dynobj, 2, abfd, /*rela?*/ TRUE);
+                   (sec, htab->etab.dynobj, 2, abfd, /*rela?*/ true);
 
                  if (sreloc == NULL)
                    {
                      bfd_set_error (bfd_error_bad_value);
 
                  if (sreloc == NULL)
                    {
                      bfd_set_error (bfd_error_bad_value);
-                     return FALSE;
+                     return false;
                    }
 
                  elf_section_data (sec)->sreloc = sreloc;
                    }
 
                  elf_section_data (sec)->sreloc = sreloc;
@@ -2350,7 +2322,7 @@ elf_metag_check_relocs (bfd *abfd,
              /* If this is a global symbol, we count the number of
                 relocations we need for this symbol.  */
              if (hh != NULL)
              /* If this is a global symbol, we count the number of
                 relocations we need for this symbol.  */
              if (hh != NULL)
-               hdh_head = &((struct elf_metag_link_hash_entry *) hh)->dyn_relocs;
+               hdh_head = &hh->eh.dyn_relocs;
              else
                {
                  /* Track dynamic relocs needed for local syms too.  */
              else
                {
                  /* Track dynamic relocs needed for local syms too.  */
@@ -2362,26 +2334,26 @@ elf_metag_check_relocs (bfd *abfd,
                    sr = sec;
 
                  vpp = &elf_section_data (sr)->local_dynrel;
                    sr = sec;
 
                  vpp = &elf_section_data (sr)->local_dynrel;
-                 hdh_head = (struct elf_metag_dyn_reloc_entry **) vpp;
+                 hdh_head = (struct elf_dyn_relocs **) vpp;
                }
 
              hdh_p = *hdh_head;
              if (hdh_p == NULL || hdh_p->sec != sec)
                {
                }
 
              hdh_p = *hdh_head;
              if (hdh_p == NULL || hdh_p->sec != sec)
                {
-                 hdh_p = ((struct elf_metag_dyn_reloc_entry *)
+                 hdh_p = ((struct elf_dyn_relocs *)
                           bfd_alloc (dynobj, sizeof *hdh_p));
                  if (hdh_p == NULL)
                           bfd_alloc (dynobj, sizeof *hdh_p));
                  if (hdh_p == NULL)
-                   return FALSE;
-                 hdh_p->hdh_next = *hdh_head;
+                   return false;
+                 hdh_p->next = *hdh_head;
                  *hdh_head = hdh_p;
                  hdh_p->sec = sec;
                  hdh_p->count = 0;
                  *hdh_head = hdh_p;
                  hdh_p->sec = sec;
                  hdh_p->count = 0;
-                 hdh_p->relative_count = 0;
+                 hdh_p->pc_count = 0;
                }
 
              hdh_p->count += 1;
              if (ELF32_R_TYPE (rel->r_info) == R_METAG_RELBRANCH)
                }
 
              hdh_p->count += 1;
              if (ELF32_R_TYPE (rel->r_info) == R_METAG_RELBRANCH)
-               hdh_p->relative_count += 1;
+               hdh_p->pc_count += 1;
            }
          break;
 
            }
          break;
 
@@ -2390,21 +2362,19 @@ elf_metag_check_relocs (bfd *abfd,
        case R_METAG_GNU_VTINHERIT:
          if (!bfd_elf_gc_record_vtinherit (abfd, sec, &hh->eh,
                                            rel->r_offset))
        case R_METAG_GNU_VTINHERIT:
          if (!bfd_elf_gc_record_vtinherit (abfd, sec, &hh->eh,
                                            rel->r_offset))
-           return FALSE;
+           return false;
          break;
 
          /* This relocation describes which C++ vtable entries are actually
             used.  Record for later use during GC.  */
        case R_METAG_GNU_VTENTRY:
          break;
 
          /* This relocation describes which C++ vtable entries are actually
             used.  Record for later use during GC.  */
        case R_METAG_GNU_VTENTRY:
-         BFD_ASSERT (hh != NULL);
-         if (hh != NULL
-             && !bfd_elf_gc_record_vtentry (abfd, sec, &hh->eh, rel->r_addend))
-           return FALSE;
+         if (!bfd_elf_gc_record_vtentry (abfd, sec, &hh->eh, rel->r_addend))
+           return false;
          break;
        }
     }
 
          break;
        }
     }
 
-  return TRUE;
+  return true;
 }
 
 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
 }
 
 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
@@ -2419,41 +2389,6 @@ elf_metag_copy_indirect_symbol (struct bfd_link_info *info,
   hh_dir = metag_elf_hash_entry (eh_dir);
   hh_ind = metag_elf_hash_entry (eh_ind);
 
   hh_dir = metag_elf_hash_entry (eh_dir);
   hh_ind = metag_elf_hash_entry (eh_ind);
 
-  if (hh_ind->dyn_relocs != NULL)
-    {
-      if (hh_dir->dyn_relocs != NULL)
-       {
-         struct elf_metag_dyn_reloc_entry **hdh_pp;
-         struct elf_metag_dyn_reloc_entry *hdh_p;
-
-         if (eh_ind->root.type == bfd_link_hash_indirect)
-           abort ();
-
-         /* Add reloc counts against the weak sym to the strong sym
-            list.  Merge any entries against the same section.  */
-         for (hdh_pp = &hh_ind->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
-           {
-             struct elf_metag_dyn_reloc_entry *hdh_q;
-
-             for (hdh_q = hh_dir->dyn_relocs; hdh_q != NULL;
-                  hdh_q = hdh_q->hdh_next)
-               if (hdh_q->sec == hdh_p->sec)
-                 {
-                   hdh_q->relative_count += hdh_p->relative_count;
-                   hdh_q->count += hdh_p->count;
-                   *hdh_pp = hdh_p->hdh_next;
-                   break;
-                 }
-             if (hdh_q == NULL)
-               hdh_pp = &hdh_p->hdh_next;
-           }
-         *hdh_pp = hh_dir->dyn_relocs;
-       }
-
-      hh_dir->dyn_relocs = hh_ind->dyn_relocs;
-      hh_ind->dyn_relocs = NULL;
-    }
-
   if (eh_ind->root.type == bfd_link_hash_indirect
       && eh_dir->got.refcount <= 0)
     {
   if (eh_ind->root.type == bfd_link_hash_indirect
       && eh_dir->got.refcount <= 0)
     {
@@ -2470,14 +2405,12 @@ elf_metag_copy_indirect_symbol (struct bfd_link_info *info,
    change the definition to something the rest of the link can
    understand.  */
 
    change the definition to something the rest of the link can
    understand.  */
 
-static bfd_boolean
+static bool
 elf_metag_adjust_dynamic_symbol (struct bfd_link_info *info,
                                 struct elf_link_hash_entry *eh)
 {
   struct elf_metag_link_hash_table *htab;
 elf_metag_adjust_dynamic_symbol (struct bfd_link_info *info,
                                 struct elf_link_hash_entry *eh)
 {
   struct elf_metag_link_hash_table *htab;
-  struct elf_metag_link_hash_entry *hh;
-  struct elf_metag_dyn_reloc_entry *hdh_p;
-  asection *s;
+  asection *s, *srel;
 
   /* If this is a function, put it in the procedure linkage table.  We
      will fill in the contents of the procedure linkage table later,
 
   /* If this is a function, put it in the procedure linkage table.  We
      will fill in the contents of the procedure linkage table later,
@@ -2499,7 +2432,7 @@ elf_metag_adjust_dynamic_symbol (struct bfd_link_info *info,
          eh->needs_plt = 0;
        }
 
          eh->needs_plt = 0;
        }
 
-      return TRUE;
+      return true;
     }
   else
     eh->plt.offset = (bfd_vma) -1;
     }
   else
     eh->plt.offset = (bfd_vma) -1;
@@ -2507,15 +2440,14 @@ elf_metag_adjust_dynamic_symbol (struct bfd_link_info *info,
   /* 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 (eh->u.weakdef != NULL)
+  if (eh->is_weakalias)
     {
     {
-      if (eh->u.weakdef->root.type != bfd_link_hash_defined
-         && eh->u.weakdef->root.type != bfd_link_hash_defweak)
-       abort ();
-      eh->root.u.def.section = eh->u.weakdef->root.u.def.section;
-      eh->root.u.def.value = eh->u.weakdef->root.u.def.value;
-      eh->non_got_ref = eh->u.weakdef->non_got_ref;
-      return TRUE;
+      struct elf_link_hash_entry *def = weakdef (eh);
+      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
+      eh->root.u.def.section = def->root.u.def.section;
+      eh->root.u.def.value = def->root.u.def.value;
+      eh->non_got_ref = def->non_got_ref;
+      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
@@ -2526,34 +2458,26 @@ elf_metag_adjust_dynamic_symbol (struct bfd_link_info *info,
      For such cases we need not do anything here; the relocations will
      be handled correctly by relocate_section.  */
   if (bfd_link_pic (info))
      For such cases we need not do anything here; the relocations will
      be handled correctly by relocate_section.  */
   if (bfd_link_pic (info))
-    return TRUE;
+    return true;
 
   /* If there are no references to this symbol that do not use the
      GOT, we don't need to generate a copy reloc.  */
   if (!eh->non_got_ref)
 
   /* If there are no references to this symbol that do not use the
      GOT, we don't need to generate a copy reloc.  */
   if (!eh->non_got_ref)
-    return TRUE;
+    return true;
 
   /* If -z nocopyreloc was given, we won't generate them either.  */
   if (info->nocopyreloc)
     {
       eh->non_got_ref = 0;
 
   /* If -z nocopyreloc was given, we won't generate them either.  */
   if (info->nocopyreloc)
     {
       eh->non_got_ref = 0;
-      return TRUE;
+      return true;
     }
 
     }
 
-  hh = (struct elf_metag_link_hash_entry *) eh;
-  for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
-    {
-      s = hdh_p->sec->output_section;
-      if (s != NULL && (s->flags & SEC_READONLY) != 0)
-       break;
-    }
-
-  /* If we didn't find any dynamic relocs in read-only sections, then
+  /* If we don't find any dynamic relocs in read-only sections, then
      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
-  if (hdh_p == NULL)
+  if (!_bfd_elf_readonly_dynrelocs (eh))
     {
       eh->non_got_ref = 0;
     {
       eh->non_got_ref = 0;
-      return TRUE;
+      return true;
     }
 
   /* We must allocate the symbol in our .dynbss section, which will
     }
 
   /* We must allocate the symbol in our .dynbss section, which will
@@ -2571,30 +2495,37 @@ elf_metag_adjust_dynamic_symbol (struct bfd_link_info *info,
   /* We must generate a COPY reloc to tell the dynamic linker to
      copy the initial value out of the dynamic object and into the
      runtime process image.  */
   /* We must generate a COPY reloc to tell the dynamic linker to
      copy the initial value out of the dynamic object and into the
      runtime process image.  */
+  if ((eh->root.u.def.section->flags & SEC_READONLY) != 0)
+    {
+      s = htab->etab.sdynrelro;
+      srel = htab->etab.sreldynrelro;
+    }
+  else
+    {
+      s = htab->etab.sdynbss;
+      srel = htab->etab.srelbss;
+    }
   if ((eh->root.u.def.section->flags & SEC_ALLOC) != 0 && eh->size != 0)
     {
   if ((eh->root.u.def.section->flags & SEC_ALLOC) != 0 && eh->size != 0)
     {
-      htab->srelbss->size += sizeof (Elf32_External_Rela);
+      srel->size += sizeof (Elf32_External_Rela);
       eh->needs_copy = 1;
     }
 
       eh->needs_copy = 1;
     }
 
-  s = htab->sdynbss;
-
   return _bfd_elf_adjust_dynamic_copy (info, eh, s);
 }
 
 /* Allocate space in .plt, .got and associated reloc sections for
    global syms.  */
 
   return _bfd_elf_adjust_dynamic_copy (info, eh, s);
 }
 
 /* Allocate space in .plt, .got and associated reloc sections for
    global syms.  */
 
-static bfd_boolean
+static bool
 allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
 {
   struct bfd_link_info *info;
   struct elf_metag_link_hash_table *htab;
 allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
 {
   struct bfd_link_info *info;
   struct elf_metag_link_hash_table *htab;
-  struct elf_metag_link_hash_entry *hh;
-  struct elf_metag_dyn_reloc_entry *hdh_p;
+  struct elf_dyn_relocs *hdh_p;
 
   if (eh->root.type == bfd_link_hash_indirect)
 
   if (eh->root.type == bfd_link_hash_indirect)
-    return TRUE;
+    return true;
 
   if (eh->root.type == bfd_link_hash_warning)
     eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
 
   if (eh->root.type == bfd_link_hash_warning)
     eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
@@ -2611,7 +2542,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
          && !eh->forced_local)
        {
          if (! bfd_elf_link_record_dynamic_symbol (info, eh))
          && !eh->forced_local)
        {
          if (! bfd_elf_link_record_dynamic_symbol (info, eh))
-           return FALSE;
+           return false;
        }
 
       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), eh))
        }
 
       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), eh))
@@ -2662,7 +2593,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
   if (eh->got.refcount > 0)
     {
       asection *s;
   if (eh->got.refcount > 0)
     {
       asection *s;
-      bfd_boolean dyn;
+      bool dyn;
       int tls_type = metag_elf_hash_entry (eh)->tls_type;
 
       /* Make sure this symbol is output as a dynamic symbol.
       int tls_type = metag_elf_hash_entry (eh)->tls_type;
 
       /* Make sure this symbol is output as a dynamic symbol.
@@ -2671,7 +2602,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
          && !eh->forced_local)
        {
          if (! bfd_elf_link_record_dynamic_symbol (info, eh))
          && !eh->forced_local)
        {
          if (! bfd_elf_link_record_dynamic_symbol (info, eh))
-           return FALSE;
+           return false;
        }
 
       s = htab->etab.sgot;
        }
 
       s = htab->etab.sgot;
@@ -2697,9 +2628,8 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
   else
     eh->got.offset = (bfd_vma) -1;
 
   else
     eh->got.offset = (bfd_vma) -1;
 
-  hh = (struct elf_metag_link_hash_entry *) eh;
-  if (hh->dyn_relocs == NULL)
-    return TRUE;
+  if (eh->dyn_relocs == NULL)
+    return true;
 
   /* If this is a -Bsymbolic shared link, then we need to discard all
      space allocated for dynamic pc-relative relocs against symbols
 
   /* If this is a -Bsymbolic shared link, then we need to discard all
      space allocated for dynamic pc-relative relocs against symbols
@@ -2710,26 +2640,26 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
     {
       if (SYMBOL_CALLS_LOCAL (info, eh))
        {
     {
       if (SYMBOL_CALLS_LOCAL (info, eh))
        {
-         struct elf_metag_dyn_reloc_entry **hdh_pp;
+         struct elf_dyn_relocs **hdh_pp;
 
 
-         for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
+         for (hdh_pp = &eh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
            {
            {
-             hdh_p->count -= hdh_p->relative_count;
-             hdh_p->relative_count = 0;
+             hdh_p->count -= hdh_p->pc_count;
+             hdh_p->pc_count = 0;
              if (hdh_p->count == 0)
              if (hdh_p->count == 0)
-               *hdh_pp = hdh_p->hdh_next;
+               *hdh_pp = hdh_p->next;
              else
              else
-               hdh_pp = &hdh_p->hdh_next;
+               hdh_pp = &hdh_p->next;
            }
        }
 
       /* Also discard relocs on undefined weak syms with non-default
         visibility.  */
            }
        }
 
       /* Also discard relocs on undefined weak syms with non-default
         visibility.  */
-      if (hh->dyn_relocs != NULL
+      if (eh->dyn_relocs != NULL
          && eh->root.type == bfd_link_hash_undefweak)
        {
          if (ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT)
          && eh->root.type == bfd_link_hash_undefweak)
        {
          if (ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT)
-           hh->dyn_relocs = NULL;
+           eh->dyn_relocs = NULL;
 
          /* Make sure undefined weak symbols are output as a dynamic
             symbol in PIEs.  */
 
          /* Make sure undefined weak symbols are output as a dynamic
             symbol in PIEs.  */
@@ -2737,7 +2667,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
                   && !eh->forced_local)
            {
              if (! bfd_elf_link_record_dynamic_symbol (info, eh))
                   && !eh->forced_local)
            {
              if (! bfd_elf_link_record_dynamic_symbol (info, eh))
-               return FALSE;
+               return false;
            }
        }
     }
            }
        }
     }
@@ -2759,7 +2689,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
              && !eh->forced_local)
            {
              if (! bfd_elf_link_record_dynamic_symbol (info, eh))
              && !eh->forced_local)
            {
              if (! bfd_elf_link_record_dynamic_symbol (info, eh))
-               return FALSE;
+               return false;
            }
 
          /* If that succeeded, we know we'll be keeping all the
            }
 
          /* If that succeeded, we know we'll be keeping all the
@@ -2768,54 +2698,25 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
            goto keep;
        }
 
            goto keep;
        }
 
-      hh->dyn_relocs = NULL;
-      return TRUE;
+      eh->dyn_relocs = NULL;
+      return true;
 
     keep: ;
     }
 
   /* Finally, allocate space.  */
 
     keep: ;
     }
 
   /* Finally, allocate space.  */
-  for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
+  for (hdh_p = eh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->next)
     {
       asection *sreloc = elf_section_data (hdh_p->sec)->sreloc;
       sreloc->size += hdh_p->count * sizeof (Elf32_External_Rela);
     }
 
     {
       asection *sreloc = elf_section_data (hdh_p->sec)->sreloc;
       sreloc->size += hdh_p->count * sizeof (Elf32_External_Rela);
     }
 
-  return TRUE;
-}
-
-/* Find any dynamic relocs that apply to read-only sections.  */
-
-static bfd_boolean
-readonly_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
-{
-  struct elf_metag_link_hash_entry *hh;
-  struct elf_metag_dyn_reloc_entry *hdh_p;
-
-  if (eh->root.type == bfd_link_hash_warning)
-    eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
-
-  hh = (struct elf_metag_link_hash_entry *) eh;
-  for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
-    {
-      asection *s = hdh_p->sec->output_section;
-
-      if (s != NULL && (s->flags & SEC_READONLY) != 0)
-       {
-         struct bfd_link_info *info = inf;
-
-         info->flags |= DF_TEXTREL;
-
-         /* Not an error, just cut short the traversal.  */
-         return FALSE;
-       }
-    }
-  return TRUE;
+  return true;
 }
 
 /* Set the sizes of the dynamic sections.  */
 
 }
 
 /* Set the sizes of the dynamic sections.  */
 
-static bfd_boolean
+static bool
 elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
                                 struct bfd_link_info *info)
 {
 elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
                                 struct bfd_link_info *info)
 {
@@ -2823,7 +2724,7 @@ elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   bfd *dynobj;
   bfd *ibfd;
   asection *s;
   bfd *dynobj;
   bfd *ibfd;
   asection *s;
-  bfd_boolean relocs;
+  bool relocs;
 
   htab = metag_link_hash_table (info);
   dynobj = htab->etab.dynobj;
 
   htab = metag_link_hash_table (info);
   dynobj = htab->etab.dynobj;
@@ -2859,12 +2760,12 @@ elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 
       for (s = ibfd->sections; s != NULL; s = s->next)
        {
 
       for (s = ibfd->sections; s != NULL; s = s->next)
        {
-         struct elf_metag_dyn_reloc_entry *hdh_p;
+         struct elf_dyn_relocs *hdh_p;
 
 
-         for (hdh_p = ((struct elf_metag_dyn_reloc_entry *)
+         for (hdh_p = ((struct elf_dyn_relocs *)
                        elf_section_data (s)->local_dynrel);
               hdh_p != NULL;
                        elf_section_data (s)->local_dynrel);
               hdh_p != NULL;
-              hdh_p = hdh_p->hdh_next)
+              hdh_p = hdh_p->next)
            {
              if (!bfd_is_abs_section (hdh_p->sec)
                  && bfd_is_abs_section (hdh_p->sec->output_section))
            {
              if (!bfd_is_abs_section (hdh_p->sec)
                  && bfd_is_abs_section (hdh_p->sec->output_section))
@@ -2929,10 +2830,10 @@ elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 
   /* We now have determined the sizes of the various dynamic sections.
      Allocate memory for them.  */
 
   /* We now have determined the sizes of the various dynamic sections.
      Allocate memory for them.  */
-  relocs = FALSE;
+  relocs = false;
   for (s = dynobj->sections; s != NULL; s = s->next)
     {
   for (s = dynobj->sections; s != NULL; s = s->next)
     {
-      bfd_boolean reloc_section = FALSE;
+      bool reloc_section = false;
 
       if ((s->flags & SEC_LINKER_CREATED) == 0)
        continue;
 
       if ((s->flags & SEC_LINKER_CREATED) == 0)
        continue;
@@ -2940,20 +2841,21 @@ elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
       if (s == htab->etab.splt
          || s == htab->etab.sgot
          || s == htab->etab.sgotplt
       if (s == htab->etab.splt
          || s == htab->etab.sgot
          || s == htab->etab.sgotplt
-         || s == htab->sdynbss)
+         || s == htab->etab.sdynbss
+         || s == htab->etab.sdynrelro)
        {
          /* 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.  */
        }
-      else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
+      else if (startswith (bfd_section_name (s), ".rela"))
        {
          if (s->size != 0 && s != htab->etab.srelplt)
        {
          if (s->size != 0 && s != htab->etab.srelplt)
-           relocs = TRUE;
+           relocs = true;
 
          /* We use the reloc_count field as a counter if we need
             to copy relocs into the output file.  */
          s->reloc_count = 0;
 
          /* We use the reloc_count field as a counter if we need
             to copy relocs into the output file.  */
          s->reloc_count = 0;
-         reloc_section = TRUE;
+         reloc_section = true;
        }
       else
        {
        }
       else
        {
@@ -2982,7 +2884,7 @@ elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
       /* Allocate memory for the section contents.  */
       s->contents = bfd_zalloc (dynobj, s->size);
       if (s->contents == NULL)
       /* Allocate memory for the section contents.  */
       s->contents = bfd_zalloc (dynobj, s->size);
       if (s->contents == NULL)
-       return FALSE;
+       return false;
       else if (reloc_section)
        {
          unsigned char *contents = s->contents;
       else if (reloc_section)
        {
          unsigned char *contents = s->contents;
@@ -2999,61 +2901,13 @@ elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
        }
     }
 
        }
     }
 
-  if (htab->etab.dynamic_sections_created)
-    {
-      /* Add some entries to the .dynamic section.  We fill in the
-        values later, in elf_metag_finish_dynamic_sections, but we
-        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.  */
-#define add_dynamic_entry(TAG, VAL) \
-  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
-
-      if (!add_dynamic_entry (DT_PLTGOT, 0))
-       return FALSE;
-
-      if (bfd_link_executable (info))
-       {
-         if (!add_dynamic_entry (DT_DEBUG, 0))
-           return FALSE;
-       }
-
-      if (htab->etab.srelplt->size != 0)
-       {
-         if (!add_dynamic_entry (DT_PLTRELSZ, 0)
-             || !add_dynamic_entry (DT_PLTREL, DT_RELA)
-             || !add_dynamic_entry (DT_JMPREL, 0))
-           return FALSE;
-       }
-
-      if (relocs)
-       {
-         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 any dynamic relocs apply to a read-only section,
-            then we need a DT_TEXTREL entry.  */
-         if ((info->flags & DF_TEXTREL) == 0)
-           elf_link_hash_traverse (&htab->etab, readonly_dynrelocs, info);
-
-         if ((info->flags & DF_TEXTREL) != 0)
-           {
-             if (!add_dynamic_entry (DT_TEXTREL, 0))
-               return FALSE;
-           }
-       }
-    }
-#undef add_dynamic_entry
-
-  return TRUE;
+  return _bfd_elf_add_dynamic_tags (output_bfd, info, relocs);
 }
 
 /* Finish up dynamic symbol handling.  We set the contents of various
    dynamic sections here.  */
 
 }
 
 /* Finish up dynamic symbol handling.  We set the contents of various
    dynamic sections here.  */
 
-static bfd_boolean
+static bool
 elf_metag_finish_dynamic_symbol (bfd *output_bfd,
                                 struct bfd_link_info *info,
                                 struct elf_link_hash_entry *eh,
 elf_metag_finish_dynamic_symbol (bfd *output_bfd,
                                 struct bfd_link_info *info,
                                 struct elf_link_hash_entry *eh,
@@ -3222,13 +3076,15 @@ elf_metag_finish_dynamic_symbol (bfd *output_bfd,
                 || eh->root.type == bfd_link_hash_defweak)))
        abort ();
 
                 || eh->root.type == bfd_link_hash_defweak)))
        abort ();
 
-      s = htab->srelbss;
-
       rel.r_offset = (eh->root.u.def.value
                      + eh->root.u.def.section->output_offset
                      + eh->root.u.def.section->output_section->vma);
       rel.r_addend = 0;
       rel.r_info = ELF32_R_INFO (eh->dynindx, R_METAG_COPY);
       rel.r_offset = (eh->root.u.def.value
                      + eh->root.u.def.section->output_offset
                      + eh->root.u.def.section->output_section->vma);
       rel.r_addend = 0;
       rel.r_info = ELF32_R_INFO (eh->dynindx, R_METAG_COPY);
+      if (eh->root.u.def.section == htab->etab.sdynrelro)
+       s = htab->etab.sreldynrelro;
+      else
+       s = htab->etab.srelbss;
       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
       bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
     }
       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
       bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
     }
@@ -3241,19 +3097,22 @@ elf_metag_finish_dynamic_symbol (bfd *output_bfd,
       sym->st_shndx = SHN_ABS;
     }
 
       sym->st_shndx = SHN_ABS;
     }
 
-  return TRUE;
+  return true;
 }
 
 /* Set the Meta ELF ABI version.  */
 
 }
 
 /* Set the Meta ELF ABI version.  */
 
-static void
-elf_metag_post_process_headers (bfd * abfd, struct bfd_link_info * link_info)
+static bool
+elf_metag_init_file_header (bfd *abfd, struct bfd_link_info *link_info)
 {
   Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form.  */
 
 {
   Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form.  */
 
-  _bfd_elf_post_process_headers (abfd, link_info);
+  if (!_bfd_elf_init_file_header (abfd, link_info))
+    return false;
+
   i_ehdrp = elf_elfheader (abfd);
   i_ehdrp->e_ident[EI_ABIVERSION] = METAG_ELF_ABI_VERSION;
   i_ehdrp = elf_elfheader (abfd);
   i_ehdrp->e_ident[EI_ABIVERSION] = METAG_ELF_ABI_VERSION;
+  return true;
 }
 
 /* Used to decide how to sort relocs in an optimal manner for the
 }
 
 /* Used to decide how to sort relocs in an optimal manner for the
@@ -3279,7 +3138,7 @@ elf_metag_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
 
 /* Finish up the dynamic sections.  */
 
 
 /* Finish up the dynamic sections.  */
 
-static bfd_boolean
+static bool
 elf_metag_finish_dynamic_sections (bfd *output_bfd,
                                   struct bfd_link_info *info)
 {
 elf_metag_finish_dynamic_sections (bfd *output_bfd,
                                   struct bfd_link_info *info)
 {
@@ -3331,28 +3190,6 @@ elf_metag_finish_dynamic_sections (bfd *output_bfd,
              dyn.d_un.d_val = s->size;
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
              break;
              dyn.d_un.d_val = s->size;
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
              break;
-
-           case DT_RELASZ:
-             /* Don't count procedure linkage table relocs in the
-                overall reloc count.  */
-             if (htab->etab.srelplt) {
-               s = htab->etab.srelplt;
-               dyn.d_un.d_val -= s->size;
-             }
-             bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
-             break;
-
-           case DT_RELA:
-             /* We may not be using the standard ELF linker script.
-                If .rela.plt is the first .rela section, we adjust
-                DT_RELA to not include it.  */
-             if (htab->etab.srelplt) {
-               s = htab->etab.srelplt;
-               if (dyn.d_un.d_ptr == s->output_section->vma + s->output_offset)
-                 dyn.d_un.d_ptr += s->size;
-             }
-             bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
-             break;
            }
 
        }
            }
 
        }
@@ -3412,7 +3249,7 @@ elf_metag_finish_dynamic_sections (bfd *output_bfd,
        ->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
     }
 
        ->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
     }
 
-  return TRUE;
+  return true;
 }
 
 /* Return the section that should be marked against GC for a given
 }
 
 /* Return the section that should be marked against GC for a given
@@ -3436,131 +3273,6 @@ elf_metag_gc_mark_hook (asection *sec,
   return _bfd_elf_gc_mark_hook (sec, info, rela, hh, sym);
 }
 
   return _bfd_elf_gc_mark_hook (sec, info, rela, hh, sym);
 }
 
-/* Update the got and plt entry reference counts for the section being
-   removed.  */
-
-static bfd_boolean
-elf_metag_gc_sweep_hook (bfd *abfd ATTRIBUTE_UNUSED,
-                        struct bfd_link_info *info ATTRIBUTE_UNUSED,
-                        asection *sec ATTRIBUTE_UNUSED,
-                        const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED)
-{
-  Elf_Internal_Shdr *symtab_hdr;
-  struct elf_link_hash_entry **eh_syms;
-  bfd_signed_vma *local_got_refcounts;
-  bfd_signed_vma *local_plt_refcounts;
-  const Elf_Internal_Rela *rel, *relend;
-
-  if (bfd_link_relocatable (info))
-    return TRUE;
-
-  elf_section_data (sec)->local_dynrel = NULL;
-
-  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
-  eh_syms = elf_sym_hashes (abfd);
-  local_got_refcounts = elf_local_got_refcounts (abfd);
-  local_plt_refcounts = local_got_refcounts;
-  if (local_plt_refcounts != NULL)
-    local_plt_refcounts += symtab_hdr->sh_info;
-
-  relend = relocs + sec->reloc_count;
-  for (rel = relocs; rel < relend; rel++)
-    {
-      unsigned long r_symndx;
-      unsigned int r_type;
-      struct elf_link_hash_entry *eh = NULL;
-
-      r_symndx = ELF32_R_SYM (rel->r_info);
-      if (r_symndx >= symtab_hdr->sh_info)
-       {
-         struct elf_metag_link_hash_entry *hh;
-         struct elf_metag_dyn_reloc_entry **hdh_pp;
-         struct elf_metag_dyn_reloc_entry *hdh_p;
-
-         eh = eh_syms[r_symndx - symtab_hdr->sh_info];
-         while (eh->root.type == bfd_link_hash_indirect
-                || eh->root.type == bfd_link_hash_warning)
-           eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
-         hh = (struct elf_metag_link_hash_entry *) eh;
-
-         for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL;
-              hdh_pp = &hdh_p->hdh_next)
-           if (hdh_p->sec == sec)
-             {
-               /* Everything must go for SEC.  */
-               *hdh_pp = hdh_p->hdh_next;
-               break;
-             }
-       }
-
-      r_type = ELF32_R_TYPE (rel->r_info);
-      switch (r_type)
-       {
-       case R_METAG_TLS_LDM:
-         if (metag_link_hash_table (info)->tls_ldm_got.refcount > 0)
-           metag_link_hash_table (info)->tls_ldm_got.refcount -= 1;
-         break;
-       case R_METAG_TLS_IE:
-       case R_METAG_TLS_GD:
-       case R_METAG_GETSET_GOT:
-         if (eh != NULL)
-           {
-             if (eh->got.refcount > 0)
-               eh->got.refcount -= 1;
-           }
-         else if (local_got_refcounts != NULL)
-           {
-             if (local_got_refcounts[r_symndx] > 0)
-               local_got_refcounts[r_symndx] -= 1;
-           }
-         break;
-
-       case R_METAG_RELBRANCH_PLT:
-         if (eh != NULL)
-           {
-             if (eh->plt.refcount > 0)
-               eh->plt.refcount -= 1;
-           }
-         break;
-
-       case R_METAG_ADDR32:
-       case R_METAG_HIADDR16:
-       case R_METAG_LOADDR16:
-       case R_METAG_GETSETOFF:
-       case R_METAG_RELBRANCH:
-         if (eh != NULL)
-           {
-             struct elf_metag_link_hash_entry *hh;
-             struct elf_metag_dyn_reloc_entry **hdh_pp;
-             struct elf_metag_dyn_reloc_entry *hdh_p;
-
-             if (!bfd_link_pic (info) && eh->plt.refcount > 0)
-               eh->plt.refcount -= 1;
-
-             hh = (struct elf_metag_link_hash_entry *) eh;
-
-             for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL;
-                  hdh_pp = &hdh_p->hdh_next)
-               if (hdh_p->sec == sec)
-                 {
-                   if (ELF32_R_TYPE (rel->r_info) == R_METAG_RELBRANCH)
-                     hdh_p->relative_count -= 1;
-                   hdh_p->count -= 1;
-                   if (hdh_p->count == 0)
-                     *hdh_pp = hdh_p->hdh_next;
-                   break;
-                 }
-           }
-         break;
-
-       default:
-         break;
-       }
-    }
-
-  return TRUE;
-}
-
 /* Determine the type of stub needed, if any, for a call.  */
 
 static enum elf_metag_stub_type
 /* Determine the type of stub needed, if any, for a call.  */
 
 static enum elf_metag_stub_type
@@ -3611,8 +3323,8 @@ metag_type_of_stub (asection *input_sec,
 #define ADD_A0_3_A0_3  0x82180000
 #define MOV_PC_A0_3    0xa3180ca0
 
 #define ADD_A0_3_A0_3  0x82180000
 #define MOV_PC_A0_3    0xa3180ca0
 
-static bfd_boolean
-metag_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
+static bool
+metag_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
 {
   struct elf_metag_stub_hash_entry *hsh;
   asection *stub_sec;
 {
   struct elf_metag_stub_hash_entry *hsh;
   asection *stub_sec;
@@ -3620,9 +3332,19 @@ metag_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_U
   bfd_byte *loc;
   bfd_vma sym_value;
   int size;
   bfd_byte *loc;
   bfd_vma sym_value;
   int size;
+  struct bfd_link_info *info;
 
   /* Massage our args to the form they really have.  */
   hsh = (struct elf_metag_stub_hash_entry *) gen_entry;
 
   /* Massage our args to the form they really have.  */
   hsh = (struct elf_metag_stub_hash_entry *) gen_entry;
+  info = (struct bfd_link_info *) in_arg;
+
+  /* Fail if the target section could not be assigned to an output
+     section.  The user should fix his linker script.  */
+  if (hsh->target_section->output_section == NULL
+      && info->non_contiguous_regions)
+    info->callbacks->einfo (_("%F%P: Could not assign `%pA' to an output section. "
+                             "Retry without --enable-non-contiguous-regions.\n"),
+                           hsh->target_section);
 
   stub_sec = hsh->stub_sec;
 
 
   stub_sec = hsh->stub_sec;
 
@@ -3675,17 +3397,17 @@ metag_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_U
       break;
     default:
       BFD_FAIL ();
       break;
     default:
       BFD_FAIL ();
-      return FALSE;
+      return false;
     }
 
   stub_sec->size += size;
     }
 
   stub_sec->size += size;
-  return TRUE;
+  return true;
 }
 
 /* As above, but don't actually build the stub.  Just bump offset so
    we know stub section sizes.  */
 
 }
 
 /* As above, but don't actually build the stub.  Just bump offset so
    we know stub section sizes.  */
 
-static bfd_boolean
+static bool
 metag_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
 {
   struct elf_metag_stub_hash_entry *hsh;
 metag_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
 {
   struct elf_metag_stub_hash_entry *hsh;
@@ -3700,7 +3422,7 @@ metag_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UN
     size = 12;
 
   hsh->stub_sec->size += size;
     size = 12;
 
   hsh->stub_sec->size += size;
-  return TRUE;
+  return true;
 }
 
 /* Set up various things so that we can make a list of input sections
 }
 
 /* Set up various things so that we can make a list of input sections
@@ -3715,7 +3437,7 @@ elf_metag_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
   unsigned int top_id, top_index;
   asection *section;
   asection **input_list, **list;
   unsigned int top_id, top_index;
   asection *section;
   asection **input_list, **list;
-  bfd_size_type amt;
+  size_t amt;
   struct elf_metag_link_hash_table *htab = metag_link_hash_table (info);
 
   /* Count the number of input BFDs and find the top input section id.  */
   struct elf_metag_link_hash_table *htab = metag_link_hash_table (info);
 
   /* Count the number of input BFDs and find the top input section id.  */
@@ -3815,7 +3537,7 @@ elf_metag_next_input_section (struct bfd_link_info *info, asection *isec)
 static void
 group_sections (struct elf_metag_link_hash_table *htab,
                bfd_size_type stub_group_size,
 static void
 group_sections (struct elf_metag_link_hash_table *htab,
                bfd_size_type stub_group_size,
-               bfd_boolean stubs_always_before_branch)
+               bool stubs_always_before_branch)
 {
   asection **list = htab->input_list + htab->top_index;
   do
 {
   asection **list = htab->input_list + htab->top_index;
   do
@@ -3828,7 +3550,7 @@ group_sections (struct elf_metag_link_hash_table *htab,
          asection *curr;
          asection *prev;
          bfd_size_type total;
          asection *curr;
          asection *prev;
          bfd_size_type total;
-         bfd_boolean big_sec;
+         bool big_sec;
 
          curr = tail;
          total = tail->size;
 
          curr = tail;
          total = tail->size;
@@ -3894,7 +3616,7 @@ get_local_syms (bfd *output_bfd ATTRIBUTE_UNUSED, bfd *input_bfd,
   /* We want to read in symbol extension records only once.  To do this
      we need to read in the local symbols in parallel and save them for
      later use; so hold pointers to the local symbols in an array.  */
   /* We want to read in symbol extension records only once.  To do this
      we need to read in the local symbols in parallel and save them for
      later use; so hold pointers to the local symbols in an array.  */
-  bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
+  size_t amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
   all_local_syms = bfd_zmalloc (amt);
   htab->all_local_syms = all_local_syms;
   if (all_local_syms == NULL)
   all_local_syms = bfd_zmalloc (amt);
   htab->all_local_syms = all_local_syms;
   if (all_local_syms == NULL)
@@ -3939,7 +3661,7 @@ instruction.  */
 
 /* See elf32-hppa.c and elf64-ppc.c.  */
 
 
 /* See elf32-hppa.c and elf64-ppc.c.  */
 
-bfd_boolean
+bool
 elf_metag_size_stubs(bfd *output_bfd, bfd *stub_bfd,
                     struct bfd_link_info *info,
                     bfd_signed_vma group_size,
 elf_metag_size_stubs(bfd *output_bfd, bfd *stub_bfd,
                     struct bfd_link_info *info,
                     bfd_signed_vma group_size,
@@ -3947,8 +3669,8 @@ elf_metag_size_stubs(bfd *output_bfd, bfd *stub_bfd,
                     void (*layout_sections_again) (void))
 {
   bfd_size_type stub_group_size;
                     void (*layout_sections_again) (void))
 {
   bfd_size_type stub_group_size;
-  bfd_boolean stubs_always_before_branch;
-  bfd_boolean stub_changed;
+  bool stubs_always_before_branch;
+  bool stub_changed;
   struct elf_metag_link_hash_table *htab = metag_link_hash_table (info);
 
   /* Stash our params away.  */
   struct elf_metag_link_hash_table *htab = metag_link_hash_table (info);
 
   /* Stash our params away.  */
@@ -3981,14 +3703,14 @@ elf_metag_size_stubs(bfd *output_bfd, bfd *stub_bfd,
     default:
       if (htab->all_local_syms)
        goto error_ret_free_local;
     default:
       if (htab->all_local_syms)
        goto error_ret_free_local;
-      return FALSE;
+      return false;
 
     case 0:
 
     case 0:
-      stub_changed = FALSE;
+      stub_changed = false;
       break;
 
     case 1:
       break;
 
     case 1:
-      stub_changed = TRUE;
+      stub_changed = true;
       break;
     }
 
       break;
     }
 
@@ -4166,7 +3888,7 @@ elf_metag_size_stubs(bfd *output_bfd, bfd *stub_bfd,
 
                  hsh = metag_stub_hash_lookup (&htab->bstab,
                                                stub_name,
 
                  hsh = metag_stub_hash_lookup (&htab->bstab,
                                                stub_name,
-                                               FALSE, FALSE);
+                                               false, false);
                  if (hsh != NULL)
                    {
                      /* The proper stub has already been created.  */
                  if (hsh != NULL)
                    {
                      /* The proper stub has already been created.  */
@@ -4185,7 +3907,7 @@ elf_metag_size_stubs(bfd *output_bfd, bfd *stub_bfd,
                  hsh->stub_type = stub_type;
                  hsh->hh = hh;
                  hsh->addend = irela->r_addend;
                  hsh->stub_type = stub_type;
                  hsh->hh = hh;
                  hsh->addend = irela->r_addend;
-                 stub_changed = TRUE;
+                 stub_changed = true;
                }
 
              /* We're done with the internal relocs, free them.  */
                }
 
              /* We're done with the internal relocs, free them.  */
@@ -4208,22 +3930,22 @@ elf_metag_size_stubs(bfd *output_bfd, bfd *stub_bfd,
 
       /* Ask the linker to do its stuff.  */
       (*htab->layout_sections_again) ();
 
       /* Ask the linker to do its stuff.  */
       (*htab->layout_sections_again) ();
-      stub_changed = FALSE;
+      stub_changed = false;
     }
 
   free (htab->all_local_syms);
     }
 
   free (htab->all_local_syms);
-  return TRUE;
+  return true;
 
  error_ret_free_local:
   free (htab->all_local_syms);
 
  error_ret_free_local:
   free (htab->all_local_syms);
-  return FALSE;
+  return false;
 }
 
 /* Build all the stubs associated with the current output file.  The
    stubs are kept in a hash table attached to the main linker hash
    table.  This function is called via metagelf_finish in the linker.  */
 
 }
 
 /* Build all the stubs associated with the current output file.  The
    stubs are kept in a hash table attached to the main linker hash
    table.  This function is called via metagelf_finish in the linker.  */
 
-bfd_boolean
+bool
 elf_metag_build_stubs (struct bfd_link_info *info)
 {
   asection *stub_sec;
 elf_metag_build_stubs (struct bfd_link_info *info)
 {
   asection *stub_sec;
@@ -4242,7 +3964,7 @@ elf_metag_build_stubs (struct bfd_link_info *info)
       size = stub_sec->size;
       stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
       if (stub_sec->contents == NULL && size != 0)
       size = stub_sec->size;
       stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
       if (stub_sec->contents == NULL && size != 0)
-       return FALSE;
+       return false;
       stub_sec->size = 0;
     }
 
       stub_sec->size = 0;
     }
 
@@ -4250,12 +3972,12 @@ elf_metag_build_stubs (struct bfd_link_info *info)
   table = &htab->bstab;
   bfd_hash_traverse (table, metag_build_one_stub, info);
 
   table = &htab->bstab;
   bfd_hash_traverse (table, metag_build_one_stub, info);
 
-  return TRUE;
+  return true;
 }
 
 /* Return TRUE if SYM represents a local label symbol.  */
 
 }
 
 /* Return TRUE if SYM represents a local label symbol.  */
 
-static bfd_boolean
+static bool
 elf_metag_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
 {
   if (name[0] == '$' && name[1] == 'L')
 elf_metag_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
 {
   if (name[0] == '$' && name[1] == 'L')
@@ -4276,8 +3998,7 @@ elf_metag_plt_sym_val (bfd_vma i, const asection *plt,
 #define ELF_ARCH               bfd_arch_metag
 #define ELF_TARGET_ID          METAG_ELF_DATA
 #define ELF_MACHINE_CODE       EM_METAG
 #define ELF_ARCH               bfd_arch_metag
 #define ELF_TARGET_ID          METAG_ELF_DATA
 #define ELF_MACHINE_CODE       EM_METAG
-#define ELF_MINPAGESIZE        0x1000
-#define ELF_MAXPAGESIZE        0x4000
+#define ELF_MAXPAGESIZE                0x4000
 #define ELF_COMMONPAGESIZE     0x1000
 
 #define TARGET_LITTLE_SYM      metag_elf32_vec
 #define ELF_COMMONPAGESIZE     0x1000
 
 #define TARGET_LITTLE_SYM      metag_elf32_vec
@@ -4293,7 +4014,6 @@ elf_metag_plt_sym_val (bfd_vma i, const asection *plt,
        elf_metag_link_hash_table_create
 #define elf_backend_relocate_section           elf_metag_relocate_section
 #define elf_backend_gc_mark_hook               elf_metag_gc_mark_hook
        elf_metag_link_hash_table_create
 #define elf_backend_relocate_section           elf_metag_relocate_section
 #define elf_backend_gc_mark_hook               elf_metag_gc_mark_hook
-#define elf_backend_gc_sweep_hook              elf_metag_gc_sweep_hook
 #define elf_backend_check_relocs               elf_metag_check_relocs
 #define elf_backend_create_dynamic_sections    elf_metag_create_dynamic_sections
 #define elf_backend_adjust_dynamic_symbol      elf_metag_adjust_dynamic_symbol
 #define elf_backend_check_relocs               elf_metag_check_relocs
 #define elf_backend_create_dynamic_sections    elf_metag_create_dynamic_sections
 #define elf_backend_adjust_dynamic_symbol      elf_metag_adjust_dynamic_symbol
@@ -4301,8 +4021,8 @@ elf_metag_plt_sym_val (bfd_vma i, const asection *plt,
 #define elf_backend_finish_dynamic_sections    elf_metag_finish_dynamic_sections
 #define elf_backend_size_dynamic_sections      elf_metag_size_dynamic_sections
 #define elf_backend_omit_section_dynsym \
 #define elf_backend_finish_dynamic_sections    elf_metag_finish_dynamic_sections
 #define elf_backend_size_dynamic_sections      elf_metag_size_dynamic_sections
 #define elf_backend_omit_section_dynsym \
-  ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
-#define elf_backend_post_process_headers       elf_metag_post_process_headers
+       _bfd_elf_omit_section_dynsym_all
+#define elf_backend_init_file_header           elf_metag_init_file_header
 #define elf_backend_reloc_type_class           elf_metag_reloc_type_class
 #define elf_backend_copy_indirect_symbol       elf_metag_copy_indirect_symbol
 #define elf_backend_plt_sym_val                elf_metag_plt_sym_val
 #define elf_backend_reloc_type_class           elf_metag_reloc_type_class
 #define elf_backend_copy_indirect_symbol       elf_metag_copy_indirect_symbol
 #define elf_backend_plt_sym_val                elf_metag_plt_sym_val
@@ -4314,6 +4034,8 @@ elf_metag_plt_sym_val (bfd_vma i, const asection *plt,
 #define elf_backend_want_got_sym               0
 #define elf_backend_want_plt_sym               0
 #define elf_backend_plt_readonly               1
 #define elf_backend_want_got_sym               0
 #define elf_backend_want_plt_sym               0
 #define elf_backend_plt_readonly               1
+#define elf_backend_dtrel_excludes_plt         1
+#define elf_backend_want_dynrelro              1
 
 #define bfd_elf32_bfd_reloc_type_lookup        metag_reloc_type_lookup
 #define bfd_elf32_bfd_reloc_name_lookup        metag_reloc_name_lookup
 
 #define bfd_elf32_bfd_reloc_type_lookup        metag_reloc_type_lookup
 #define bfd_elf32_bfd_reloc_name_lookup        metag_reloc_name_lookup