]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - bfd/elf32-cr16.c
[PATCH] fix windmc typedef bug
[thirdparty/binutils-gdb.git] / bfd / elf32-cr16.c
index 56d1c542789bfed35c683d242481d73729ea72a3..62906c83a500821dcedbcf367d0338ede5e47146 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for National Semiconductor's CR16 ELF
-   Copyright 2007, 2008, 2009, 2010, 2012 Free Software Foundation, Inc.
+   Copyright (C) 2007-2020 Free Software Foundation, Inc.
    Written by M R Swami Reddy.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -25,6 +25,7 @@
 #include "libiberty.h"
 #include "elf-bfd.h"
 #include "elf/cr16.h"
+#include "elf32-cr16.h"
 
 /* The cr16 linker needs to keep track of the number of relocs that
    it decides to copy in check_relocs for each symbol.  This is so
@@ -72,13 +73,13 @@ struct elf32_cr16_link_hash_entry
 struct cr16_reloc_map
 {
   bfd_reloc_code_real_type bfd_reloc_enum; /* BFD relocation enum.  */
-  unsigned short cr16_reloc_type;          /* CR16 relocation type.  */
+  unsigned short cr16_reloc_type;         /* CR16 relocation type.  */
 };
 
 static const struct cr16_reloc_map cr16_reloc_map[R_CR16_MAX] =
 {
-  {BFD_RELOC_NONE,           R_CR16_NONE},
-  {BFD_RELOC_CR16_NUM8,      R_CR16_NUM8},
+  {BFD_RELOC_NONE,          R_CR16_NONE},
+  {BFD_RELOC_CR16_NUM8,             R_CR16_NUM8},
   {BFD_RELOC_CR16_NUM16,     R_CR16_NUM16},
   {BFD_RELOC_CR16_NUM32,     R_CR16_NUM32},
   {BFD_RELOC_CR16_NUM32a,    R_CR16_NUM32a},
@@ -91,8 +92,8 @@ static const struct cr16_reloc_map cr16_reloc_map[R_CR16_MAX] =
   {BFD_RELOC_CR16_REGREL20a, R_CR16_REGREL20a},
   {BFD_RELOC_CR16_ABS20,     R_CR16_ABS20},
   {BFD_RELOC_CR16_ABS24,     R_CR16_ABS24},
-  {BFD_RELOC_CR16_IMM4,      R_CR16_IMM4},
-  {BFD_RELOC_CR16_IMM8,      R_CR16_IMM8},
+  {BFD_RELOC_CR16_IMM4,             R_CR16_IMM4},
+  {BFD_RELOC_CR16_IMM8,             R_CR16_IMM8},
   {BFD_RELOC_CR16_IMM16,     R_CR16_IMM16},
   {BFD_RELOC_CR16_IMM20,     R_CR16_IMM20},
   {BFD_RELOC_CR16_IMM24,     R_CR16_IMM24},
@@ -113,463 +114,463 @@ static const struct cr16_reloc_map cr16_reloc_map[R_CR16_MAX] =
 
 static reloc_howto_type cr16_elf_howto_table[] =
 {
-  HOWTO (R_CR16_NONE,              /* type */
-         0,                        /* rightshift */
-         2,                        /* size */
-         32,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_dont,   /* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_NONE",            /* name */
-         FALSE,                    /* partial_inplace */
-         0,                        /* src_mask */
-         0,                        /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_NUM8,              /* type */
-         0,                        /* rightshift */
-         0,                        /* size */
-         8,                        /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_NUM8",            /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xff,                     /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_NUM16,             /* type */
-         0,                        /* rightshift */
-         1,                        /* size */
-         16,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_NUM16",           /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xffff,                   /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_NUM32,             /* type */
-         0,                        /* rightshift */
-         2,                        /* size */
-         32,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_NUM32",           /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xffffffff,               /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_NUM32a,            /* type */
-         1,                        /* rightshift */
-         2,                        /* size */
-         32,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_NUM32a",          /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xffffffff,               /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_REGREL4,           /* type */
-         0,                        /* rightshift */
-         0,                        /* size */
-         4,                        /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_REGREL4",         /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xf,                      /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_REGREL4a,          /* type */
-         0,                        /* rightshift */
-         0,                        /* size */
-         4,                        /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_REGREL4a",        /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xf,                      /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_REGREL14,          /* type */
-         0,                        /* rightshift */
-         1,                        /* size */
-         14,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_REGREL14",        /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0x3fff,                   /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_REGREL14a,         /* type */
-         0,                        /* rightshift */
-         1,                        /* size */
-         14,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_REGREL14a",       /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0x3fff,                   /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_REGREL16,          /* type */
-         0,                        /* rightshift */
-         1,                        /* size */
-         16,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_REGREL16",        /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xffff,                   /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_REGREL20,          /* type */
-         0,                        /* rightshift */
-         2,                        /* size */
-         20,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_REGREL20",        /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xfffff,                  /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_REGREL20a,         /* type */
-         0,                        /* rightshift */
-         2,                        /* size */
-         20,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_REGREL20a",       /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xfffff,                  /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_ABS20,             /* type */
-         0,                        /* rightshift */
-         2,                        /* size */
-         20,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_ABS20",           /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xfffff,                  /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_ABS24,             /* type */
-         0,                        /* rightshift */
-         2,                        /* size */
-         24,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_ABS24",           /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xffffff,                 /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_IMM4,              /* type */
-         0,                        /* rightshift */
-         0,                        /* size */
-         4,                        /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_IMM4",            /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xf,                      /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_IMM8,              /* type */
-         0,                        /* rightshift */
-         0,                        /* size */
-         8,                        /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_IMM8",            /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xff,                     /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_IMM16,             /* type */
-         0,                        /* rightshift */
-         1,                        /* size */
-         16,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_IMM16",           /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xffff,                   /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_IMM20,             /* type */
-         0,                        /* rightshift */
-         2,                        /* size */
-         20,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_IMM20",           /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xfffff,                  /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_IMM24,             /* type */
-         0,                        /* rightshift */
-         2,                        /* size */
-         24,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_IMM24",           /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xffffff,                 /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_IMM32,             /* type */
-         0,                        /* rightshift */
-         2,                        /* size */
-         32,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_IMM32",           /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xffffffff,               /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_IMM32a,            /* type */
-         1,                        /* rightshift */
-         2,                        /* size */
-         32,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_IMM32a",          /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xffffffff,               /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_DISP4,             /* type */
-         1,                        /* rightshift */
-         0,                        /* size (0 = byte, 1 = short, 2 = long) */
-         4,                        /* bitsize */
-         TRUE,                     /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_unsigned, /* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_DISP4",           /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xf,                      /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_DISP8,             /* type */
-         1,                        /* rightshift */
-         0,                        /* size (0 = byte, 1 = short, 2 = long) */
-         8,                        /* bitsize */
-         TRUE,                     /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_unsigned, /* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_DISP8",           /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0x1ff,                    /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_DISP16,            /* type */
-         0,                        /* rightshift REVIITS: To sync with WinIDEA*/
-         1,                        /* size (0 = byte, 1 = short, 2 = long) */
-         16,                       /* bitsize */
-         TRUE,                     /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_unsigned, /* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_DISP16",          /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0x1ffff,                  /* dst_mask */
-         FALSE),                   /* pcrel_offset */
+  HOWTO (R_CR16_NONE,             /* type */
+        0,                        /* rightshift */
+        3,                        /* size */
+        0,                        /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_dont,   /* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_NONE",            /* name */
+        FALSE,                    /* partial_inplace */
+        0,                        /* src_mask */
+        0,                        /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_NUM8,             /* type */
+        0,                        /* rightshift */
+        0,                        /* size */
+        8,                        /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_NUM8",            /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xff,                     /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_NUM16,            /* type */
+        0,                        /* rightshift */
+        1,                        /* size */
+        16,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_NUM16",           /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xffff,                   /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_NUM32,            /* type */
+        0,                        /* rightshift */
+        2,                        /* size */
+        32,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_NUM32",           /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xffffffff,               /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_NUM32a,                   /* type */
+        1,                        /* rightshift */
+        2,                        /* size */
+        32,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_NUM32a",          /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xffffffff,               /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_REGREL4,          /* type */
+        0,                        /* rightshift */
+        0,                        /* size */
+        4,                        /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_REGREL4",         /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xf,                      /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_REGREL4a,         /* type */
+        0,                        /* rightshift */
+        0,                        /* size */
+        4,                        /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_REGREL4a",        /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xf,                      /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_REGREL14,         /* type */
+        0,                        /* rightshift */
+        1,                        /* size */
+        14,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_REGREL14",        /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0x3fff,                   /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_REGREL14a,        /* type */
+        0,                        /* rightshift */
+        1,                        /* size */
+        14,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_REGREL14a",       /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0x3fff,                   /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_REGREL16,         /* type */
+        0,                        /* rightshift */
+        1,                        /* size */
+        16,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_REGREL16",        /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xffff,                   /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_REGREL20,         /* type */
+        0,                        /* rightshift */
+        2,                        /* size */
+        20,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_REGREL20",        /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xfffff,                  /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_REGREL20a,        /* type */
+        0,                        /* rightshift */
+        2,                        /* size */
+        20,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_REGREL20a",       /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xfffff,                  /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_ABS20,            /* type */
+        0,                        /* rightshift */
+        2,                        /* size */
+        20,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_ABS20",           /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xfffff,                  /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_ABS24,            /* type */
+        0,                        /* rightshift */
+        2,                        /* size */
+        24,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_ABS24",           /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xffffff,                 /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_IMM4,             /* type */
+        0,                        /* rightshift */
+        0,                        /* size */
+        4,                        /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_IMM4",            /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xf,                      /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_IMM8,             /* type */
+        0,                        /* rightshift */
+        0,                        /* size */
+        8,                        /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_IMM8",            /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xff,                     /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_IMM16,            /* type */
+        0,                        /* rightshift */
+        1,                        /* size */
+        16,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_IMM16",           /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xffff,                   /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_IMM20,            /* type */
+        0,                        /* rightshift */
+        2,                        /* size */
+        20,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_IMM20",           /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xfffff,                  /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_IMM24,            /* type */
+        0,                        /* rightshift */
+        2,                        /* size */
+        24,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_IMM24",           /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xffffff,                 /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_IMM32,            /* type */
+        0,                        /* rightshift */
+        2,                        /* size */
+        32,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_IMM32",           /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xffffffff,               /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_IMM32a,                   /* type */
+        1,                        /* rightshift */
+        2,                        /* size */
+        32,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_IMM32a",          /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xffffffff,               /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_DISP4,            /* type */
+        1,                        /* rightshift */
+        0,                        /* size (0 = byte, 1 = short, 2 = long) */
+        4,                        /* bitsize */
+        TRUE,                     /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_unsigned, /* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_DISP4",           /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xf,                      /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_DISP8,            /* type */
+        1,                        /* rightshift */
+        0,                        /* size (0 = byte, 1 = short, 2 = long) */
+        8,                        /* bitsize */
+        TRUE,                     /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_unsigned, /* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_DISP8",           /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0x1ff,                    /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_DISP16,                   /* type */
+        0,                        /* rightshift REVIITS: To sync with WinIDEA*/
+        1,                        /* size (0 = byte, 1 = short, 2 = long) */
+        16,                       /* bitsize */
+        TRUE,                     /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_unsigned, /* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_DISP16",          /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0x1ffff,                  /* dst_mask */
+        FALSE),                   /* pcrel_offset */
   /* REVISIT: DISP24 should be left-shift by 2 as per ISA doc
      but its not done, to sync with WinIDEA and CR16 4.1 tools */
-  HOWTO (R_CR16_DISP24,            /* type */
-         0,                        /* rightshift */
-         2,                        /* size (0 = byte, 1 = short, 2 = long) */
-         24,                       /* bitsize */
-         TRUE,                     /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_unsigned, /* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_DISP24",          /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0x1ffffff,                /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_DISP24a,           /* type */
-         0,                        /* rightshift */
-         2,                        /* size (0 = byte, 1 = short, 2 = long) */
-         24,                       /* bitsize */
-         TRUE,                     /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_unsigned, /* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_DISP24a",         /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xffffff,                 /* dst_mask */
-         FALSE),                   /* pcrel_offset */
+  HOWTO (R_CR16_DISP24,                   /* type */
+        0,                        /* rightshift */
+        2,                        /* size (0 = byte, 1 = short, 2 = long) */
+        24,                       /* bitsize */
+        TRUE,                     /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_unsigned, /* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_DISP24",          /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0x1ffffff,                /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_DISP24a,          /* type */
+        0,                        /* rightshift */
+        2,                        /* size (0 = byte, 1 = short, 2 = long) */
+        24,                       /* bitsize */
+        TRUE,                     /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_unsigned, /* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_DISP24a",         /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xffffff,                 /* dst_mask */
+        FALSE),                   /* pcrel_offset */
 
   /* An 8 bit switch table entry.  This is generated for an expression
      such as ``.byte L1 - L2''.  The offset holds the difference
      between the reloc address and L2.  */
-  HOWTO (R_CR16_SWITCH8,           /* type */
-         0,                        /* rightshift */
-         0,                        /* size (0 = byte, 1 = short, 2 = long) */
-         8,                        /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_unsigned, /* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_SWITCH8",         /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xff,                     /* dst_mask */
-         TRUE),                    /* pcrel_offset */
+  HOWTO (R_CR16_SWITCH8,          /* type */
+        0,                        /* rightshift */
+        0,                        /* size (0 = byte, 1 = short, 2 = long) */
+        8,                        /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_unsigned, /* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_SWITCH8",         /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xff,                     /* dst_mask */
+        TRUE),                    /* pcrel_offset */
 
   /* A 16 bit switch table entry.  This is generated for an expression
      such as ``.word L1 - L2''.  The offset holds the difference
      between the reloc address and L2.  */
-  HOWTO (R_CR16_SWITCH16,          /* type */
-         0,                        /* rightshift */
-         1,                        /* size (0 = byte, 1 = short, 2 = long) */
-         16,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_unsigned, /* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_SWITCH16",        /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xffff,                   /* dst_mask */
-         TRUE),                    /* pcrel_offset */
+  HOWTO (R_CR16_SWITCH16,         /* type */
+        0,                        /* rightshift */
+        1,                        /* size (0 = byte, 1 = short, 2 = long) */
+        16,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_unsigned, /* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_SWITCH16",        /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xffff,                   /* dst_mask */
+        TRUE),                    /* pcrel_offset */
 
   /* A 32 bit switch table entry.  This is generated for an expression
      such as ``.long L1 - L2''.  The offset holds the difference
      between the reloc address and L2.  */
-  HOWTO (R_CR16_SWITCH32,          /* type */
-         0,                        /* rightshift */
-         2,                        /* size (0 = byte, 1 = short, 2 = long) */
-         32,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_unsigned, /* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_SWITCH32",        /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xffffffff,               /* dst_mask */
-         TRUE),                    /* pcrel_offset */
-
-  HOWTO (R_CR16_GOT_REGREL20,      /* type */
-         0,                        /* rightshift */
-         2,                        /* size */
-         20,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_GOT_REGREL20",    /* name */
-         TRUE,                     /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xfffff,                  /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_GOTC_REGREL20,     /* type */
-         0,                        /* rightshift */
-         2,                        /* size */
-         20,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_bitfield,/* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_GOTC_REGREL20",   /* name */
-         TRUE,                     /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xfffff,                  /* dst_mask */
-         FALSE),                   /* pcrel_offset */
-
-  HOWTO (R_CR16_GLOB_DAT,          /* type */
-         0,                        /* rightshift */
-         2,                        /* size (0 = byte, 1 = short, 2 = long) */
-         32,                       /* bitsize */
-         FALSE,                    /* pc_relative */
-         0,                        /* bitpos */
-         complain_overflow_unsigned, /* complain_on_overflow */
-         bfd_elf_generic_reloc,    /* special_function */
-         "R_CR16_GLOB_DAT",        /* name */
-         FALSE,                    /* partial_inplace */
-         0x0,                      /* src_mask */
-         0xffffffff,               /* dst_mask */
-         TRUE)                     /* pcrel_offset */
+  HOWTO (R_CR16_SWITCH32,         /* type */
+        0,                        /* rightshift */
+        2,                        /* size (0 = byte, 1 = short, 2 = long) */
+        32,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_unsigned, /* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_SWITCH32",        /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xffffffff,               /* dst_mask */
+        TRUE),                    /* pcrel_offset */
+
+  HOWTO (R_CR16_GOT_REGREL20,     /* type */
+        0,                        /* rightshift */
+        2,                        /* size */
+        20,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_GOT_REGREL20",    /* name */
+        TRUE,                     /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xfffff,                  /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_GOTC_REGREL20,    /* type */
+        0,                        /* rightshift */
+        2,                        /* size */
+        20,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_bitfield,/* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_GOTC_REGREL20",   /* name */
+        TRUE,                     /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xfffff,                  /* dst_mask */
+        FALSE),                   /* pcrel_offset */
+
+  HOWTO (R_CR16_GLOB_DAT,         /* type */
+        0,                        /* rightshift */
+        2,                        /* size (0 = byte, 1 = short, 2 = long) */
+        32,                       /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_unsigned, /* complain_on_overflow */
+        bfd_elf_generic_reloc,    /* special_function */
+        "R_CR16_GLOB_DAT",        /* name */
+        FALSE,                    /* partial_inplace */
+        0x0,                      /* src_mask */
+        0xffffffff,               /* dst_mask */
+        TRUE)                     /* pcrel_offset */
 };
 
 
@@ -582,10 +583,11 @@ _bfd_cr16_elf_create_got_section (bfd * abfd, struct bfd_link_info * info)
   asection * s;
   struct elf_link_hash_entry * h;
   const struct elf_backend_data * bed = get_elf_backend_data (abfd);
+  struct elf_link_hash_table *htab = elf_hash_table (info);
   int ptralign;
 
   /* This function may be called more than once.  */
-  if (bfd_get_section_by_name (abfd, ".got") != NULL)
+  if (htab->sgot != NULL)
     return TRUE;
 
   switch (bed->s->arch_size)
@@ -604,19 +606,21 @@ _bfd_cr16_elf_create_got_section (bfd * abfd, struct bfd_link_info * info)
     }
 
   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
-           | SEC_LINKER_CREATED);
+          | SEC_LINKER_CREATED);
 
-  s = bfd_make_section_with_flags (abfd, ".got", flags);
+  s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
+  htab->sgot= s;
   if (s == NULL
-      || ! bfd_set_section_alignment (abfd, s, ptralign))
+      || !bfd_set_section_alignment (s, ptralign))
     return FALSE;
 
   if (bed->want_got_plt)
     {
-      s = bfd_make_section_with_flags (abfd, ".got.plt", flags);
+      s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
+      htab->sgotplt = s;
       if (s == NULL
-          || ! bfd_set_section_alignment (abfd, s, ptralign))
-        return FALSE;
+         || !bfd_set_section_alignment (s, ptralign))
+       return FALSE;
     }
 
   /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
@@ -624,7 +628,7 @@ _bfd_cr16_elf_create_got_section (bfd * abfd, struct bfd_link_info * info)
      because we don't want to define the symbol if we are not creating
      a global offset table.  */
   h = _bfd_elf_define_linkage_sym (abfd, info, s, "_GLOBAL_OFFSET_TABLE_");
-  elf_hash_table (info)->hgot = h;
+  htab->hgot = h;
   if (h == NULL)
     return FALSE;
 
@@ -638,8 +642,8 @@ _bfd_cr16_elf_create_got_section (bfd * abfd, struct bfd_link_info * info)
 /* Retrieve a howto ptr using a BFD reloc_code.  */
 
 static reloc_howto_type *
-elf_cr16_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
-                            bfd_reloc_code_real_type code)
+elf_cr16_reloc_type_lookup (bfd *abfd,
+                           bfd_reloc_code_real_type code)
 {
   unsigned int i;
 
@@ -647,19 +651,20 @@ elf_cr16_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
     if (code == cr16_reloc_map[i].bfd_reloc_enum)
       return &cr16_elf_howto_table[cr16_reloc_map[i].cr16_reloc_type];
 
-  _bfd_error_handler ("Unsupported CR16 relocation type: 0x%x\n", code);
+  _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+                     abfd, code);
   return NULL;
 }
 
 static reloc_howto_type *
 elf_cr16_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
-                            const char *r_name)
+                           const char *r_name)
 {
   unsigned int i;
 
   for (i = 0; ARRAY_SIZE (cr16_elf_howto_table); i++)
     if (cr16_elf_howto_table[i].name != NULL
-        && strcasecmp (cr16_elf_howto_table[i].name, r_name) == 0)
+       && strcasecmp (cr16_elf_howto_table[i].name, r_name) == 0)
       return cr16_elf_howto_table + i;
 
   return NULL;
@@ -667,14 +672,22 @@ elf_cr16_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
 
 /* Retrieve a howto ptr using an internal relocation entry.  */
 
-static void
-elf_cr16_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
-                        Elf_Internal_Rela *dst)
+static bfd_boolean
+elf_cr16_info_to_howto (bfd *abfd, arelent *cache_ptr,
+                       Elf_Internal_Rela *dst)
 {
   unsigned int r_type = ELF32_R_TYPE (dst->r_info);
 
-  BFD_ASSERT (r_type < (unsigned int) R_CR16_MAX);
+  if (r_type >= R_CR16_MAX)
+    {
+      /* xgettext:c-format */
+      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+                         abfd, r_type);
+      bfd_set_error (bfd_error_bad_value);
+      return FALSE;
+    }
   cache_ptr->howto = cr16_elf_howto_table + r_type;
+  return TRUE;
 }
 
 /* Look through the relocs for a section during the first phase.
@@ -683,7 +696,7 @@ elf_cr16_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
 
 static bfd_boolean
 cr16_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
-                       const Elf_Internal_Rela *relocs)
+                      const Elf_Internal_Rela *relocs)
 {
   Elf_Internal_Shdr *symtab_hdr;
   Elf_Internal_Sym * isymbuf = NULL;
@@ -699,7 +712,7 @@ cr16_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
   srelgot = NULL;
   bfd_boolean result = FALSE;
 
-  if (info->relocatable)
+  if (bfd_link_relocatable (info))
     return TRUE;
 
   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
@@ -718,125 +731,102 @@ cr16_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
 
       r_symndx = ELF32_R_SYM (rel->r_info);
       if (r_symndx < symtab_hdr->sh_info)
-        h = NULL;
+       h = NULL;
       else
-        {
-          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
-          while (h->root.type == bfd_link_hash_indirect
-                 || h->root.type == bfd_link_hash_warning)
-            h = (struct elf_link_hash_entry *) h->root.u.i.link;
-        }
+       {
+         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+         while (h->root.type == bfd_link_hash_indirect
+                || h->root.type == bfd_link_hash_warning)
+           h = (struct elf_link_hash_entry *) h->root.u.i.link;
+       }
 
       /* Some relocs require a global offset table.  */
       if (dynobj == NULL)
-        {
-          switch (ELF32_R_TYPE (rel->r_info))
-            {
-            case R_CR16_GOT_REGREL20:
-            case R_CR16_GOTC_REGREL20:
-              elf_hash_table (info)->dynobj = dynobj = abfd;
-              if (! _bfd_cr16_elf_create_got_section (dynobj, info))
-                goto fail;
-              break;
-
-            default:
-              break;
-            }
-        }
+       {
+         switch (ELF32_R_TYPE (rel->r_info))
+           {
+           case R_CR16_GOT_REGREL20:
+           case R_CR16_GOTC_REGREL20:
+             elf_hash_table (info)->dynobj = dynobj = abfd;
+             if (! _bfd_cr16_elf_create_got_section (dynobj, info))
+               goto fail;
+             break;
+
+           default:
+             break;
+           }
+       }
 
       switch (ELF32_R_TYPE (rel->r_info))
-        {
-        case R_CR16_GOT_REGREL20:
-        case R_CR16_GOTC_REGREL20:
-          /* This symbol requires a global offset table entry.  */
-
-          if (sgot == NULL)
-            {
-              sgot = bfd_get_section_by_name (dynobj, ".got");
-              BFD_ASSERT (sgot != NULL);
-            }
-
-          if (srelgot == NULL
-              && (h != NULL || info->executable))
-            {
-              srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
-              if (srelgot == NULL)
-                {
-                  srelgot = bfd_make_section_with_flags (dynobj,
-                                                         ".rela.got",
-                                                         (SEC_ALLOC
-                                                          | SEC_LOAD
-                                                          | SEC_HAS_CONTENTS
-                                                          | SEC_IN_MEMORY
-                                                          | SEC_LINKER_CREATED
-                                                          | SEC_READONLY));
-                  if (srelgot == NULL
-                      || ! bfd_set_section_alignment (dynobj, srelgot, 2))
-                    goto fail;
-                }
-            }
-
-          if (h != NULL)
-            {
-              if (h->got.offset != (bfd_vma) -1)
-                /* We have already allocated space in the .got.  */
-                break;
-
-              h->got.offset = sgot->size;
-
-              /* Make sure this symbol is output as a dynamic symbol.  */
-              if (h->dynindx == -1)
-                {
-                  if (! bfd_elf_link_record_dynamic_symbol (info, h))
-                    goto fail;
-                }
-
-              srelgot->size += sizeof (Elf32_External_Rela);
-            }
-          else
-            {
-              /* This is a global offset table entry for a local
-                 symbol.  */
-              if (local_got_offsets == NULL)
-                {
-                  size_t       size;
-                  unsigned int i;
-
-                  size = symtab_hdr->sh_info * sizeof (bfd_vma);
-                  local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size);
-
-                  if (local_got_offsets == NULL)
-                    goto fail;
-
-                  elf_local_got_offsets (abfd) = local_got_offsets;
-
-                  for (i = 0; i < symtab_hdr->sh_info; i++)
-                    local_got_offsets[i] = (bfd_vma) -1;
-                }
-
-              if (local_got_offsets[r_symndx] != (bfd_vma) -1)
-                /* We have already allocated space in the .got.  */
-                break;
-
-              local_got_offsets[r_symndx] = sgot->size;
-
-              if (info->executable)
-                /* If we are generating a shared object, we need to
-                   output a R_CR16_RELATIVE reloc so that the dynamic
-                   linker can adjust this GOT entry.  */
-                srelgot->size += sizeof (Elf32_External_Rela);
-            }
-
-          sgot->size += 4;
-          break;
-
-        }
+       {
+       case R_CR16_GOT_REGREL20:
+       case R_CR16_GOTC_REGREL20:
+         /* This symbol requires a global offset table entry.  */
+
+         sgot = elf_hash_table (info)->sgot;
+         srelgot = elf_hash_table (info)->srelgot;
+         BFD_ASSERT (sgot != NULL && srelgot != NULL);
+
+         if (h != NULL)
+           {
+             if (h->got.offset != (bfd_vma) -1)
+               /* We have already allocated space in the .got.  */
+               break;
+
+             h->got.offset = sgot->size;
+
+             /* Make sure this symbol is output as a dynamic symbol.  */
+             if (h->dynindx == -1)
+               {
+                 if (! bfd_elf_link_record_dynamic_symbol (info, h))
+                   goto fail;
+               }
+
+             srelgot->size += sizeof (Elf32_External_Rela);
+           }
+         else
+           {
+             /* This is a global offset table entry for a local
+                symbol.  */
+             if (local_got_offsets == NULL)
+               {
+                 size_t       size;
+                 unsigned int i;
+
+                 size = symtab_hdr->sh_info * sizeof (bfd_vma);
+                 local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size);
+
+                 if (local_got_offsets == NULL)
+                   goto fail;
+
+                 elf_local_got_offsets (abfd) = local_got_offsets;
+
+                 for (i = 0; i < symtab_hdr->sh_info; i++)
+                   local_got_offsets[i] = (bfd_vma) -1;
+               }
+
+             if (local_got_offsets[r_symndx] != (bfd_vma) -1)
+               /* We have already allocated space in the .got.  */
+               break;
+
+             local_got_offsets[r_symndx] = sgot->size;
+
+             if (bfd_link_executable (info))
+               /* If we are generating a shared object, we need to
+                  output a R_CR16_RELATIVE reloc so that the dynamic
+                  linker can adjust this GOT entry.  */
+               srelgot->size += sizeof (Elf32_External_Rela);
+           }
+
+         sgot->size += 4;
+         break;
+
+       }
     }
 
-   result = TRUE;
-  fail:
-    if (isymbuf != NULL)
-      free (isymbuf);
+  result = TRUE;
+ fail:
+  free (isymbuf);
 
   return result;
 }
@@ -845,25 +835,22 @@ cr16_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
 
 static bfd_reloc_status_type
 cr16_elf_final_link_relocate (reloc_howto_type *howto,
-                              bfd *input_bfd,
-                              bfd *output_bfd ATTRIBUTE_UNUSED,
-                              asection *input_section,
-                              bfd_byte *contents,
-                              bfd_vma offset,
-                              bfd_vma Rvalue,
-                              bfd_vma addend,
-                              struct elf_link_hash_entry * h,
-                              unsigned long symndx  ATTRIBUTE_UNUSED,
-                              struct bfd_link_info *info ATTRIBUTE_UNUSED,
-                              asection *sec ATTRIBUTE_UNUSED,
-                              int is_local ATTRIBUTE_UNUSED)
+                             bfd *input_bfd,
+                             bfd *output_bfd ATTRIBUTE_UNUSED,
+                             asection *input_section,
+                             bfd_byte *contents,
+                             bfd_vma offset,
+                             bfd_vma Rvalue,
+                             bfd_vma addend,
+                             struct elf_link_hash_entry * h,
+                             unsigned long symndx  ATTRIBUTE_UNUSED,
+                             struct bfd_link_info *info ATTRIBUTE_UNUSED,
+                             asection *sec ATTRIBUTE_UNUSED,
+                             int is_local ATTRIBUTE_UNUSED)
 {
   unsigned short r_type = howto->type;
   bfd_byte *hit_data = contents + offset;
   bfd_vma reloc_bits, check, Rvalue1;
-  bfd *      dynobj;
-
-  dynobj = elf_hash_table (info)->dynobj;
 
   switch (r_type)
     {
@@ -889,7 +876,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto,
      case R_CR16_DISP16:
      case R_CR16_DISP24:
        /* 'hit_data' is relative to the start of the instruction, not the
-           relocation offset. Advance it to account for the exact offset.  */
+          relocation offset. Advance it to account for the exact offset.  */
        hit_data += 2;
        break;
 
@@ -899,22 +886,22 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto,
 
      case R_CR16_DISP4:
        if (is_local)
-        Rvalue += -1;
+       Rvalue += -1;
        break;
 
      case R_CR16_DISP8:
      case R_CR16_DISP24a:
        if (is_local)
-        Rvalue -= -1;
+       Rvalue -= -1;
        break;
 
      case R_CR16_SWITCH8:
      case R_CR16_SWITCH16:
      case R_CR16_SWITCH32:
        /* We only care about the addend, where the difference between
-          expressions is kept.  */
+         expressions is kept.  */
        Rvalue = 0;
-       
+
      default:
        break;
     }
@@ -923,7 +910,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto,
     {
       /* Subtract the address of the section containing the location.  */
       Rvalue -= (input_section->output_section->vma
-                 + input_section->output_offset);
+                + input_section->output_offset);
       /* Subtract the position of the location within the section.  */
       Rvalue -= offset;
     }
@@ -945,25 +932,25 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto,
       || (r_type == R_CR16_GOTC_REGREL20)))
     {
       if (((bfd_vma) check & ~reloc_bits) != 0
-          && (((bfd_vma) check & ~reloc_bits)
-          != (-(bfd_vma) 1 & ~reloc_bits)))
-        {
-          /* The above right shift is incorrect for a signed
-             value.  See if turning on the upper bits fixes the
-             overflow.  */
-          if (howto->rightshift && (bfd_signed_vma) Rvalue < 0)
-            {
-              check |= ((bfd_vma) - 1
-                        & ~((bfd_vma) - 1
-                         >> howto->rightshift));
-
-              if (((bfd_vma) check & ~reloc_bits)
-                  != (-(bfd_vma) 1 & ~reloc_bits))
-                 return bfd_reloc_overflow;
-            }
-          else
-            return bfd_reloc_overflow;
-        }
+         && (((bfd_vma) check & ~reloc_bits)
+         != (-(bfd_vma) 1 & ~reloc_bits)))
+       {
+         /* The above right shift is incorrect for a signed
+            value.  See if turning on the upper bits fixes the
+            overflow.  */
+         if (howto->rightshift && (bfd_signed_vma) Rvalue < 0)
+           {
+             check |= ((bfd_vma) - 1
+                       & ~((bfd_vma) - 1
+                        >> howto->rightshift));
+
+             if (((bfd_vma) check & ~reloc_bits)
+                 != (-(bfd_vma) 1 & ~reloc_bits))
+                return bfd_reloc_overflow;
+           }
+         else
+           return bfd_reloc_overflow;
+       }
 
       /* Drop unwanted bits from the value we are relocating to.  */
       Rvalue >>= (bfd_vma) howto->rightshift;
@@ -975,276 +962,275 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto,
   switch (howto->size)
     {
       case 0:
-        if (r_type == R_CR16_DISP8)
-          {
-             Rvalue1 = bfd_get_16 (input_bfd, hit_data);
-             Rvalue = ((Rvalue1 & 0xf000) | ((Rvalue << 4) & 0xf00)
-                       | (Rvalue1 & 0x00f0) | (Rvalue & 0xf));
-             bfd_put_16 (input_bfd, Rvalue, hit_data);
-          }
-        else if (r_type == R_CR16_IMM4)
-          {
-             Rvalue1 = bfd_get_16 (input_bfd, hit_data);
-             Rvalue = (((Rvalue1 & 0xff) << 8) | ((Rvalue << 4) & 0xf0)
-                       | ((Rvalue1 & 0x0f00) >> 8));
-             bfd_put_16 (input_bfd, Rvalue, hit_data);
-          }
-        else if (r_type == R_CR16_DISP4)
-          {
-             Rvalue1 = bfd_get_16 (input_bfd, hit_data);
-             Rvalue = (Rvalue1 | ((Rvalue & 0xf) << 4));
-             bfd_put_16 (input_bfd, Rvalue, hit_data);
-          }
-        else
-          {
-             bfd_put_8 (input_bfd, (unsigned char) Rvalue, hit_data);
-          }
-        break;
+       if (r_type == R_CR16_DISP8)
+         {
+            Rvalue1 = bfd_get_16 (input_bfd, hit_data);
+            Rvalue = ((Rvalue1 & 0xf000) | ((Rvalue << 4) & 0xf00)
+                      | (Rvalue1 & 0x00f0) | (Rvalue & 0xf));
+            bfd_put_16 (input_bfd, Rvalue, hit_data);
+         }
+       else if (r_type == R_CR16_IMM4)
+         {
+            Rvalue1 = bfd_get_16 (input_bfd, hit_data);
+            Rvalue = (((Rvalue1 & 0xff) << 8) | ((Rvalue << 4) & 0xf0)
+                      | ((Rvalue1 & 0x0f00) >> 8));
+            bfd_put_16 (input_bfd, Rvalue, hit_data);
+         }
+       else if (r_type == R_CR16_DISP4)
+         {
+            Rvalue1 = bfd_get_16 (input_bfd, hit_data);
+            Rvalue = (Rvalue1 | ((Rvalue & 0xf) << 4));
+            bfd_put_16 (input_bfd, Rvalue, hit_data);
+         }
+       else
+         {
+            bfd_put_8 (input_bfd, (unsigned char) Rvalue, hit_data);
+         }
+       break;
 
       case 1:
-        if (r_type == R_CR16_DISP16)
-          {
-            Rvalue |= (bfd_get_16 (input_bfd, hit_data));
-            Rvalue = ((Rvalue & 0xfffe) | ((Rvalue >> 16) & 0x1));
-          }
-        if (r_type == R_CR16_IMM16)
-          {
-            Rvalue1 = bfd_get_16 (input_bfd, hit_data);
-
-            /* Add or subtract the offset value.  */
-            if (Rvalue1 & 0x8000)
-              Rvalue -= (~Rvalue1 + 1) & 0xffff;
-            else
-              Rvalue += Rvalue1;
-
-             /* Check for range.  */
-             if ((long) Rvalue > 0xffff || (long) Rvalue < 0x0)
-              return bfd_reloc_overflow;
-          }
-
-        bfd_put_16 (input_bfd, Rvalue, hit_data);
-        break;
+       if (r_type == R_CR16_DISP16)
+         {
+           Rvalue |= (bfd_get_16 (input_bfd, hit_data));
+           Rvalue = ((Rvalue & 0xfffe) | ((Rvalue >> 16) & 0x1));
+         }
+       if (r_type == R_CR16_IMM16)
+         {
+           Rvalue1 = bfd_get_16 (input_bfd, hit_data);
+
+           /* Add or subtract the offset value.  */
+           if (Rvalue1 & 0x8000)
+             Rvalue -= (~Rvalue1 + 1) & 0xffff;
+           else
+             Rvalue += Rvalue1;
+
+            /* Check for range.  */
+            if ((long) Rvalue > 0xffff || (long) Rvalue < 0x0)
+             return bfd_reloc_overflow;
+         }
+
+       bfd_put_16 (input_bfd, Rvalue, hit_data);
+       break;
 
       case 2:
-        if ((r_type == R_CR16_ABS20) || (r_type == R_CR16_IMM20))
-          {
-             Rvalue1 = (bfd_get_16 (input_bfd, hit_data + 2)
-                        | (((bfd_get_16 (input_bfd, hit_data) & 0xf) <<16)));
-
-             /* Add or subtract the offset value.  */
-             if (Rvalue1 & 0x80000)
-                Rvalue -= (~Rvalue1 + 1) & 0xfffff;
-              else
-                Rvalue += Rvalue1;
-
-              /* Check for range.  */
-              if ((long) Rvalue > 0xfffff || (long) Rvalue < 0x0)
-               return bfd_reloc_overflow;
-
-            bfd_put_16 (input_bfd, ((bfd_get_16 (input_bfd, hit_data) & 0xfff0)
-                        | ((Rvalue >> 16) & 0xf)), hit_data);
-            bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2);
-          }
-        else if (r_type == R_CR16_GOT_REGREL20) 
-          {
-            asection * sgot = bfd_get_section_by_name (dynobj, ".got");
-
-            if (h != NULL)
-              {
-                bfd_vma off;
-
-                off = h->got.offset;
-                BFD_ASSERT (off != (bfd_vma) -1);
-
-                if (! elf_hash_table (info)->dynamic_sections_created
-                     || SYMBOL_REFERENCES_LOCAL (info, h))
-                    /* This is actually a static link, or it is a
-                       -Bsymbolic link and the symbol is defined
-                       locally, or the symbol was forced to be local
-                       because of a version file.  We must initialize
-                       this entry in the global offset table. 
-                       When doing a dynamic link, we create a .rela.got
-                       relocation entry to initialize the value.  This
-                       is done in the finish_dynamic_symbol routine.  */
-                  bfd_put_32 (output_bfd, Rvalue, sgot->contents + off);
-
-                  Rvalue = sgot->output_offset + off;
-                }
-              else
-                {
-                   bfd_vma off;
-
-                   off = elf_local_got_offsets (input_bfd)[symndx];
-                   bfd_put_32 (output_bfd,Rvalue, sgot->contents + off);
-
-                   Rvalue = sgot->output_offset + off;
-                }
-
-             Rvalue += addend;
-
-             /* REVISIT: if ((long) Rvalue > 0xffffff || 
-                                    (long) Rvalue < -0x800000).  */
-             if ((long) Rvalue > 0xffffff || (long) Rvalue < 0)
-               return bfd_reloc_overflow;
-
-
-             bfd_put_16 (input_bfd, (bfd_get_16 (input_bfd, hit_data))
-                         | (((Rvalue >> 16) & 0xf) << 8), hit_data);
-             bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2);
-
-          }
-        else if (r_type == R_CR16_GOTC_REGREL20)
-          {
-             asection * sgot;
-             sgot = bfd_get_section_by_name (dynobj, ".got");
-
-             if (h != NULL)
-               {
-                 bfd_vma off;
-
-                 off = h->got.offset;
-                 BFD_ASSERT (off != (bfd_vma) -1);
-
-                  Rvalue >>=1; /* For code symbols.  */
-
-                 if (! elf_hash_table (info)->dynamic_sections_created
-                      || SYMBOL_REFERENCES_LOCAL (info, h))
-                 /* This is actually a static link, or it is a
-                    -Bsymbolic link and the symbol is defined
-                     locally, or the symbol was forced to be local
-                     because of a version file.  We must initialize
-                     this entry in the global offset table. 
-                     When doing a dynamic link, we create a .rela.got
-                     relocation entry to initialize the value.  This
-                     is done in the finish_dynamic_symbol routine.  */
-                  bfd_put_32 (output_bfd, Rvalue, sgot->contents + off);
-
-                  Rvalue = sgot->output_offset + off;
-               }
-             else
-               {
-                  bfd_vma off;
-
-                  off = elf_local_got_offsets (input_bfd)[symndx];
-                  Rvalue >>= 1;
-                  bfd_put_32 (output_bfd,Rvalue, sgot->contents + off);
-                  Rvalue = sgot->output_offset + off;
-               }
-
-             Rvalue += addend;
-
-             /* Check if any value in DISP.  */
-             Rvalue1 =((bfd_get_32 (input_bfd, hit_data) >>16)
-                       | (((bfd_get_32 (input_bfd, hit_data) & 0xfff) >> 8) <<16));
-
-             /* Add or subtract the offset value.  */
-             if (Rvalue1 & 0x80000)
-               Rvalue -= (~Rvalue1 + 1) & 0xfffff;
-             else
-               Rvalue += Rvalue1;
-
-              /* Check for range.  */
-             /* REVISIT: if ((long) Rvalue > 0xffffff 
-                             || (long) Rvalue < -0x800000).  */
-             if ((long) Rvalue > 0xffffff || (long) Rvalue < 0)
-               return bfd_reloc_overflow;
-
-             bfd_put_16 (input_bfd, (bfd_get_16 (input_bfd, hit_data))
-                         | (((Rvalue >> 16) & 0xf) << 8), hit_data);
-             bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2);
-          }
-        else
-          {
-             if (r_type == R_CR16_ABS24)
-               {
-                  Rvalue1 = ((bfd_get_32 (input_bfd, hit_data) >> 16)
-                             | (((bfd_get_32 (input_bfd, hit_data) & 0xfff) >> 8) <<16)
-                             | (((bfd_get_32 (input_bfd, hit_data) & 0xf) <<20)));
-
-                  /* Add or subtract the offset value.  */
-                  if (Rvalue1 & 0x800000)
-                    Rvalue -= (~Rvalue1 + 1) & 0xffffff;
-                  else
-                    Rvalue += Rvalue1;
-
-                 /* Check for Range.  */
-                 if ((long) Rvalue > 0xffffff || (long) Rvalue < 0x0)
-                   return bfd_reloc_overflow;
-
-                 Rvalue = ((((Rvalue >> 20) & 0xf) | (((Rvalue >> 16) & 0xf)<<8)
-                           | (bfd_get_32 (input_bfd, hit_data) & 0xf0f0))
-                           | ((Rvalue & 0xffff) << 16));
-               }
-             else if (r_type == R_CR16_DISP24)
-               {
-                  Rvalue = ((((Rvalue >> 20)& 0xf) | (((Rvalue >>16) & 0xf)<<8)
-                            | (bfd_get_16 (input_bfd, hit_data)))
-                            | (((Rvalue & 0xfffe) | ((Rvalue >> 24) & 0x1)) << 16));
-               }
-             else if ((r_type == R_CR16_IMM32) || (r_type == R_CR16_IMM32a))
-               {
-                  Rvalue1 =((((bfd_get_32 (input_bfd, hit_data)) >> 16) &0xffff)
-                            | (((bfd_get_32 (input_bfd, hit_data)) &0xffff)) << 16);
-
-                 /* Add or subtract the offset value.  */
-                 if (Rvalue1 & 0x80000000)
-                   Rvalue -= (~Rvalue1 + 1) & 0xffffffff;
-                 else
-                   Rvalue += Rvalue1;
-
-                 /* Check for range.  */
-                 if (Rvalue > 0xffffffff || (long) Rvalue < 0x0)
-                   return bfd_reloc_overflow;
-
-                 Rvalue = (((Rvalue >> 16)& 0xffff) | (Rvalue & 0xffff) << 16);
-               }
-             else if (r_type == R_CR16_DISP24a)
-               {
-                  Rvalue = (((Rvalue & 0xfffffe) | (Rvalue >> 23)));
-                  Rvalue = ((Rvalue >> 16) & 0xff) | ((Rvalue & 0xffff) << 16)
-                            | (bfd_get_32 (input_bfd, hit_data));
-               }
-             else if ((r_type == R_CR16_REGREL20)
-                      || (r_type == R_CR16_REGREL20a))
-               {
-                  Rvalue1 = ((bfd_get_32 (input_bfd, hit_data) >> 16)
-                             | (((bfd_get_32 (input_bfd, hit_data) & 0xfff) >> 8) <<16));
-                  /* Add or subtract the offset value.  */
-                  if (Rvalue1 & 0x80000)
-                     Rvalue -= (~Rvalue1 + 1) & 0xfffff;
-                  else
-                     Rvalue += Rvalue1;
-
-                  /* Check for range.  */
-                  if ((long) Rvalue > 0xfffff || (long) Rvalue < 0x0)
-                    return bfd_reloc_overflow;
-
-                  Rvalue = (((((Rvalue >> 20)& 0xf) | (((Rvalue >>16) & 0xf)<<8)
-                            | ((Rvalue & 0xffff) << 16)))
-                            | (bfd_get_32 (input_bfd, hit_data) & 0xf0ff));
-
-              }
-            else if (r_type == R_CR16_NUM32)
-              {
-                 Rvalue1 = (bfd_get_32 (input_bfd, hit_data)); 
-
-                 /* Add or subtract the offset value */
-                 if (Rvalue1 & 0x80000000)
-                   Rvalue -= (~Rvalue1 + 1) & 0xffffffff;
-                 else
-                   Rvalue += Rvalue1;
-
-                /* Check for Ranga */
-                if (Rvalue > 0xffffffff)
-                  return bfd_reloc_overflow;
-              }
-
-            bfd_put_32 (input_bfd, Rvalue, hit_data);
-          }
-        break;
+       if ((r_type == R_CR16_ABS20) || (r_type == R_CR16_IMM20))
+         {
+            Rvalue1 = (bfd_get_16 (input_bfd, hit_data + 2)
+                       | (((bfd_get_16 (input_bfd, hit_data) & 0xf) <<16)));
+
+            /* Add or subtract the offset value.  */
+            if (Rvalue1 & 0x80000)
+               Rvalue -= (~Rvalue1 + 1) & 0xfffff;
+             else
+               Rvalue += Rvalue1;
+
+             /* Check for range.  */
+             if ((long) Rvalue > 0xfffff || (long) Rvalue < 0x0)
+              return bfd_reloc_overflow;
+
+           bfd_put_16 (input_bfd, ((bfd_get_16 (input_bfd, hit_data) & 0xfff0)
+                       | ((Rvalue >> 16) & 0xf)), hit_data);
+           bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2);
+         }
+       else if (r_type == R_CR16_GOT_REGREL20)
+         {
+           asection *sgot = elf_hash_table (info)->sgot;
+
+           if (h != NULL)
+             {
+               bfd_vma off;
+
+               off = h->got.offset;
+               BFD_ASSERT (off != (bfd_vma) -1);
+
+               if (! elf_hash_table (info)->dynamic_sections_created
+                    || SYMBOL_REFERENCES_LOCAL (info, h))
+                   /* This is actually a static link, or it is a
+                      -Bsymbolic link and the symbol is defined
+                      locally, or the symbol was forced to be local
+                      because of a version file.  We must initialize
+                      this entry in the global offset table.
+                      When doing a dynamic link, we create a .rela.got
+                      relocation entry to initialize the value.  This
+                      is done in the finish_dynamic_symbol routine.  */
+                 bfd_put_32 (output_bfd, Rvalue, sgot->contents + off);
+
+                 Rvalue = sgot->output_offset + off;
+               }
+             else
+               {
+                  bfd_vma off;
+
+                  off = elf_local_got_offsets (input_bfd)[symndx];
+                  bfd_put_32 (output_bfd,Rvalue, sgot->contents + off);
+
+                  Rvalue = sgot->output_offset + off;
+               }
+
+            Rvalue += addend;
+
+            /* REVISIT: if ((long) Rvalue > 0xffffff ||
+                                   (long) Rvalue < -0x800000).  */
+            if ((long) Rvalue > 0xffffff || (long) Rvalue < 0)
+              return bfd_reloc_overflow;
+
+
+            bfd_put_16 (input_bfd, (bfd_get_16 (input_bfd, hit_data))
+                        | (((Rvalue >> 16) & 0xf) << 8), hit_data);
+            bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2);
+
+         }
+       else if (r_type == R_CR16_GOTC_REGREL20)
+         {
+            asection *sgot = elf_hash_table (info)->sgot;
+
+            if (h != NULL)
+              {
+                bfd_vma off;
+
+                off = h->got.offset;
+                BFD_ASSERT (off != (bfd_vma) -1);
+
+                 Rvalue >>=1; /* For code symbols.  */
+
+                if (! elf_hash_table (info)->dynamic_sections_created
+                     || SYMBOL_REFERENCES_LOCAL (info, h))
+                /* This is actually a static link, or it is a
+                   -Bsymbolic link and the symbol is defined
+                    locally, or the symbol was forced to be local
+                    because of a version file.  We must initialize
+                    this entry in the global offset table.
+                    When doing a dynamic link, we create a .rela.got
+                    relocation entry to initialize the value.  This
+                    is done in the finish_dynamic_symbol routine.  */
+                 bfd_put_32 (output_bfd, Rvalue, sgot->contents + off);
+
+                 Rvalue = sgot->output_offset + off;
+              }
+            else
+              {
+                 bfd_vma off;
+
+                 off = elf_local_got_offsets (input_bfd)[symndx];
+                 Rvalue >>= 1;
+                 bfd_put_32 (output_bfd,Rvalue, sgot->contents + off);
+                 Rvalue = sgot->output_offset + off;
+              }
+
+            Rvalue += addend;
+
+            /* Check if any value in DISP.  */
+            Rvalue1 =((bfd_get_32 (input_bfd, hit_data) >>16)
+                      | (((bfd_get_32 (input_bfd, hit_data) & 0xfff) >> 8) <<16));
+
+            /* Add or subtract the offset value.  */
+            if (Rvalue1 & 0x80000)
+              Rvalue -= (~Rvalue1 + 1) & 0xfffff;
+            else
+              Rvalue += Rvalue1;
+
+             /* Check for range.  */
+            /* REVISIT: if ((long) Rvalue > 0xffffff
+                            || (long) Rvalue < -0x800000).  */
+            if ((long) Rvalue > 0xffffff || (long) Rvalue < 0)
+              return bfd_reloc_overflow;
+
+            bfd_put_16 (input_bfd, (bfd_get_16 (input_bfd, hit_data))
+                        | (((Rvalue >> 16) & 0xf) << 8), hit_data);
+            bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2);
+         }
+       else
+         {
+            if (r_type == R_CR16_ABS24)
+              {
+                 Rvalue1 = ((bfd_get_32 (input_bfd, hit_data) >> 16)
+                            | (((bfd_get_32 (input_bfd, hit_data) & 0xfff) >> 8) <<16)
+                            | (((bfd_get_32 (input_bfd, hit_data) & 0xf) <<20)));
+
+                 /* Add or subtract the offset value.  */
+                 if (Rvalue1 & 0x800000)
+                   Rvalue -= (~Rvalue1 + 1) & 0xffffff;
+                 else
+                   Rvalue += Rvalue1;
+
+                /* Check for Range.  */
+                if ((long) Rvalue > 0xffffff || (long) Rvalue < 0x0)
+                  return bfd_reloc_overflow;
+
+                Rvalue = ((((Rvalue >> 20) & 0xf) | (((Rvalue >> 16) & 0xf)<<8)
+                          | (bfd_get_32 (input_bfd, hit_data) & 0xf0f0))
+                          | ((Rvalue & 0xffff) << 16));
+              }
+            else if (r_type == R_CR16_DISP24)
+              {
+                 Rvalue = ((((Rvalue >> 20)& 0xf) | (((Rvalue >>16) & 0xf)<<8)
+                           | (bfd_get_16 (input_bfd, hit_data)))
+                           | (((Rvalue & 0xfffe) | ((Rvalue >> 24) & 0x1)) << 16));
+              }
+            else if ((r_type == R_CR16_IMM32) || (r_type == R_CR16_IMM32a))
+              {
+                 Rvalue1 =((((bfd_get_32 (input_bfd, hit_data)) >> 16) &0xffff)
+                           | (((bfd_get_32 (input_bfd, hit_data)) &0xffff)) << 16);
+
+                /* Add or subtract the offset value.  */
+                if (Rvalue1 & 0x80000000)
+                  Rvalue -= (~Rvalue1 + 1) & 0xffffffff;
+                else
+                  Rvalue += Rvalue1;
+
+                /* Check for range.  */
+                if (Rvalue > 0xffffffff || (long) Rvalue < 0x0)
+                  return bfd_reloc_overflow;
+
+                Rvalue = (((Rvalue >> 16)& 0xffff) | (Rvalue & 0xffff) << 16);
+              }
+            else if (r_type == R_CR16_DISP24a)
+              {
+                 Rvalue = (((Rvalue & 0xfffffe) | (Rvalue >> 23)));
+                 Rvalue = ((Rvalue >> 16) & 0xff) | ((Rvalue & 0xffff) << 16)
+                           | (bfd_get_32 (input_bfd, hit_data));
+              }
+            else if ((r_type == R_CR16_REGREL20)
+                     || (r_type == R_CR16_REGREL20a))
+              {
+                 Rvalue1 = ((bfd_get_32 (input_bfd, hit_data) >> 16)
+                            | (((bfd_get_32 (input_bfd, hit_data) & 0xfff) >> 8) <<16));
+                 /* Add or subtract the offset value.  */
+                 if (Rvalue1 & 0x80000)
+                    Rvalue -= (~Rvalue1 + 1) & 0xfffff;
+                 else
+                    Rvalue += Rvalue1;
+
+                 /* Check for range.  */
+                 if ((long) Rvalue > 0xfffff || (long) Rvalue < 0x0)
+                   return bfd_reloc_overflow;
+
+                 Rvalue = (((((Rvalue >> 20)& 0xf) | (((Rvalue >>16) & 0xf)<<8)
+                           | ((Rvalue & 0xffff) << 16)))
+                           | (bfd_get_32 (input_bfd, hit_data) & 0xf0ff));
+
+             }
+           else if (r_type == R_CR16_NUM32)
+             {
+                Rvalue1 = (bfd_get_32 (input_bfd, hit_data));
+
+                /* Add or subtract the offset value */
+                if (Rvalue1 & 0x80000000)
+                  Rvalue -= (~Rvalue1 + 1) & 0xffffffff;
+                else
+                  Rvalue += Rvalue1;
+
+               /* Check for Ranga */
+               if (Rvalue > 0xffffffff)
+                 return bfd_reloc_overflow;
+             }
+
+           bfd_put_32 (input_bfd, Rvalue, hit_data);
+         }
+       break;
 
       default:
-        return bfd_reloc_notsupported;
+       return bfd_reloc_notsupported;
     }
 
   return bfd_reloc_ok;
@@ -1254,7 +1240,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto,
 
 static bfd_boolean
 elf32_cr16_relax_delete_bytes (struct bfd_link_info *link_info, bfd *abfd,
-                               asection *sec, bfd_vma addr, int count)
+                              asection *sec, bfd_vma addr, int count)
 {
   Elf_Internal_Shdr *symtab_hdr;
   unsigned int sec_shndx;
@@ -1279,14 +1265,14 @@ elf32_cr16_relax_delete_bytes (struct bfd_link_info *link_info, bfd *abfd,
 
   /* Actually delete the bytes.  */
   memmove (contents + addr, contents + addr + count,
-           (size_t) (toaddr - addr - count));
+          (size_t) (toaddr - addr - count));
   sec->size -= count;
 
   /* Adjust all the relocs.  */
   for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
     /* Get the new reloc address.  */
     if ((irel->r_offset > addr && irel->r_offset < toaddr))
-        irel->r_offset -= count;
+       irel->r_offset -= count;
 
   /* Adjust the local symbols defined in this section.  */
   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
@@ -1294,49 +1280,49 @@ elf32_cr16_relax_delete_bytes (struct bfd_link_info *link_info, bfd *abfd,
   for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
     {
       if (isym->st_shndx == sec_shndx
-          && isym->st_value > addr
-          && isym->st_value < toaddr)
-        {
-          /* Adjust the addend of SWITCH relocations in this section,
-             which reference this local symbol.  */
+         && isym->st_value > addr
+         && isym->st_value < toaddr)
+       {
+         /* Adjust the addend of SWITCH relocations in this section,
+            which reference this local symbol.  */
 #if 0
-          for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
-            {
-              unsigned long r_symndx;
-              Elf_Internal_Sym *rsym;
-              bfd_vma addsym, subsym;
-
-              /* Skip if not a SWITCH relocation.  */
-              if (ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH8
-                  && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH16
-                  && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH32)
-                 continue;
-        
-              r_symndx = ELF32_R_SYM (irel->r_info);
-              rsym = (Elf_Internal_Sym *) symtab_hdr->contents + r_symndx;
-
-              /* Skip if not the local adjusted symbol.  */
-              if (rsym != isym)
-                continue;
-
-              addsym = isym->st_value;
-              subsym = addsym - irel->r_addend;
-
-              /* Fix the addend only when -->> (addsym > addr >= subsym).  */
-              if (subsym <= addr)
-                irel->r_addend -= count;
-              else
-                continue;
-            }
+         for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
+           {
+             unsigned long r_symndx;
+             Elf_Internal_Sym *rsym;
+             bfd_vma addsym, subsym;
+
+             /* Skip if not a SWITCH relocation.  */
+             if (ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH8
+                 && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH16
+                 && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH32)
+                continue;
+
+             r_symndx = ELF32_R_SYM (irel->r_info);
+             rsym = (Elf_Internal_Sym *) symtab_hdr->contents + r_symndx;
+
+             /* Skip if not the local adjusted symbol.  */
+             if (rsym != isym)
+               continue;
+
+             addsym = isym->st_value;
+             subsym = addsym - irel->r_addend;
+
+             /* Fix the addend only when -->> (addsym > addr >= subsym).  */
+             if (subsym <= addr)
+               irel->r_addend -= count;
+             else
+               continue;
+           }
 #endif
 
-          isym->st_value -= count;
-        }
+         isym->st_value -= count;
+       }
     }
 
   /* Now adjust the global symbols defined in this section.  */
   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
-               - symtab_hdr->sh_info);
+              - symtab_hdr->sh_info);
   sym_hashes = start_hashes = elf_sym_hashes (abfd);
   end_hashes = sym_hashes + symcount;
 
@@ -1345,35 +1331,35 @@ elf32_cr16_relax_delete_bytes (struct bfd_link_info *link_info, bfd *abfd,
       struct elf_link_hash_entry *sym_hash = *sym_hashes;
 
       /* The '--wrap SYMBOL' option is causing a pain when the object file,
-         containing the definition of __wrap_SYMBOL, includes a direct
-         call to SYMBOL as well. Since both __wrap_SYMBOL and SYMBOL reference
-         the same symbol (which is __wrap_SYMBOL), but still exist as two
-         different symbols in 'sym_hashes', we don't want to adjust
-         the global symbol __wrap_SYMBOL twice.
-         This check is only relevant when symbols are being wrapped.  */
+        containing the definition of __wrap_SYMBOL, includes a direct
+        call to SYMBOL as well. Since both __wrap_SYMBOL and SYMBOL reference
+        the same symbol (which is __wrap_SYMBOL), but still exist as two
+        different symbols in 'sym_hashes', we don't want to adjust
+        the global symbol __wrap_SYMBOL twice.
+        This check is only relevant when symbols are being wrapped.  */
       if (link_info->wrap_hash != NULL)
-        {
-          struct elf_link_hash_entry **cur_sym_hashes;
-
-          /* Loop only over the symbols whom been already checked.  */
-          for (cur_sym_hashes = start_hashes; cur_sym_hashes < sym_hashes;
-               cur_sym_hashes++)
-            /* If the current symbol is identical to 'sym_hash', that means
-               the symbol was already adjusted (or at least checked).  */
-            if (*cur_sym_hashes == sym_hash)
-              break;
-
-          /* Don't adjust the symbol again.  */
-          if (cur_sym_hashes < sym_hashes)
-            continue;
-        }
+       {
+         struct elf_link_hash_entry **cur_sym_hashes;
+
+         /* Loop only over the symbols whom been already checked.  */
+         for (cur_sym_hashes = start_hashes; cur_sym_hashes < sym_hashes;
+              cur_sym_hashes++)
+           /* If the current symbol is identical to 'sym_hash', that means
+              the symbol was already adjusted (or at least checked).  */
+           if (*cur_sym_hashes == sym_hash)
+             break;
+
+         /* Don't adjust the symbol again.  */
+         if (cur_sym_hashes < sym_hashes)
+           continue;
+       }
 
       if ((sym_hash->root.type == bfd_link_hash_defined
-          || sym_hash->root.type == bfd_link_hash_defweak)
-          && sym_hash->root.u.def.section == sec
-          && sym_hash->root.u.def.value > addr
-          && sym_hash->root.u.def.value < toaddr)
-        sym_hash->root.u.def.value -= count;
+         || sym_hash->root.type == bfd_link_hash_defweak)
+         && sym_hash->root.u.def.section == sec
+         && sym_hash->root.u.def.value > addr
+         && sym_hash->root.u.def.value < toaddr)
+       sym_hash->root.u.def.value -= count;
     }
 
   return TRUE;
@@ -1383,10 +1369,10 @@ elf32_cr16_relax_delete_bytes (struct bfd_link_info *link_info, bfd *abfd,
 
 static bfd_boolean
 elf32_cr16_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
-                             bfd *input_bfd, asection *input_section,
-                             bfd_byte *contents, Elf_Internal_Rela *relocs,
-                             Elf_Internal_Sym *local_syms,
-                             asection **local_sections)
+                            bfd *input_bfd, asection *input_section,
+                            bfd_byte *contents, Elf_Internal_Rela *relocs,
+                            Elf_Internal_Sym *local_syms,
+                            asection **local_sections)
 {
   Elf_Internal_Shdr *symtab_hdr;
   struct elf_link_hash_entry **sym_hashes;
@@ -1416,92 +1402,86 @@ elf32_cr16_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
       sym = NULL;
       sec = NULL;
       if (r_symndx < symtab_hdr->sh_info)
-        {
-          sym = local_syms + r_symndx;
-          sec = local_sections[r_symndx];
-          relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
-        }
+       {
+         sym = local_syms + r_symndx;
+         sec = local_sections[r_symndx];
+         relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
+       }
       else
-        {
-          bfd_boolean unresolved_reloc, warned;
+       {
+         bfd_boolean unresolved_reloc, warned, ignored;
 
-          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
-                                   r_symndx, symtab_hdr, sym_hashes,
-                                   h, sec, relocation,
-                                   unresolved_reloc, warned);
-        }
+         RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
+                                  r_symndx, symtab_hdr, sym_hashes,
+                                  h, sec, relocation,
+                                  unresolved_reloc, warned, ignored);
+       }
 
       if (sec != NULL && discarded_section (sec))
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
                                         rel, 1, relend, howto, 0, contents);
 
-      if (info->relocatable)
-        continue;
+      if (bfd_link_relocatable (info))
+       continue;
 
       r = cr16_elf_final_link_relocate (howto, input_bfd, output_bfd,
-                                        input_section,
-                                        contents, rel->r_offset,
-                                        relocation, rel->r_addend,
-                                        (struct elf_link_hash_entry *) h,
-                                        r_symndx,
-                                        info, sec, h == NULL);
+                                       input_section,
+                                       contents, rel->r_offset,
+                                       relocation, rel->r_addend,
+                                       (struct elf_link_hash_entry *) h,
+                                       r_symndx,
+                                       info, sec, h == NULL);
 
       if (r != bfd_reloc_ok)
-        {
-          const char *name;
-          const char *msg = NULL;
-
-          if (h != NULL)
-            name = h->root.root.string;
-          else
-            {
-              name = (bfd_elf_string_from_elf_section
-                      (input_bfd, symtab_hdr->sh_link, sym->st_name));
-              if (name == NULL || *name == '\0')
-                name = bfd_section_name (input_bfd, sec);
-            }
-
-          switch (r)
-            {
-             case bfd_reloc_overflow:
-               if (!((*info->callbacks->reloc_overflow)
-                     (info, (h ? &h->root : NULL), name, howto->name,
-                      (bfd_vma) 0, input_bfd, input_section,
-                      rel->r_offset)))
-                 return FALSE;
-               break;
-
-             case bfd_reloc_undefined:
-               if (!((*info->callbacks->undefined_symbol)
-                     (info, name, input_bfd, input_section,
-                      rel->r_offset, TRUE)))
-                 return FALSE;
-               break;
-
-             case bfd_reloc_outofrange:
-               msg = _("internal error: out of range error");
-               goto common_error;
-
-             case bfd_reloc_notsupported:
-               msg = _("internal error: unsupported relocation error");
-               goto common_error;
-
-             case bfd_reloc_dangerous:
-               msg = _("internal error: dangerous error");
-               goto common_error;
-
-             default:
-               msg = _("internal error: unknown error");
-               /* Fall through.  */
-
-             common_error:
-               if (!((*info->callbacks->warning)
-                     (info, msg, name, input_bfd, input_section,
-                      rel->r_offset)))
-                 return FALSE;
-               break;
-            }
-        }
+       {
+         const char *name;
+         const char *msg = NULL;
+
+         if (h != NULL)
+           name = h->root.root.string;
+         else
+           {
+             name = (bfd_elf_string_from_elf_section
+                     (input_bfd, symtab_hdr->sh_link, sym->st_name));
+             if (name == NULL || *name == '\0')
+               name = bfd_section_name (sec);
+           }
+
+         switch (r)
+           {
+            case bfd_reloc_overflow:
+              (*info->callbacks->reloc_overflow)
+                (info, (h ? &h->root : NULL), name, howto->name,
+                 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
+              break;
+
+            case bfd_reloc_undefined:
+              (*info->callbacks->undefined_symbol)
+                (info, name, input_bfd, input_section, rel->r_offset, TRUE);
+              break;
+
+            case bfd_reloc_outofrange:
+              msg = _("internal error: out of range error");
+              goto common_error;
+
+            case bfd_reloc_notsupported:
+              msg = _("internal error: unsupported relocation error");
+              goto common_error;
+
+            case bfd_reloc_dangerous:
+              msg = _("internal error: dangerous error");
+              goto common_error;
+
+            default:
+              msg = _("internal error: unknown error");
+              /* Fall through.  */
+
+            common_error:
+              (*info->callbacks->warning) (info, msg, name, input_bfd,
+                                           input_section, rel->r_offset);
+              break;
+           }
+       }
     }
 
   return TRUE;
@@ -1512,11 +1492,11 @@ elf32_cr16_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
 
 static bfd_byte *
 elf32_cr16_get_relocated_section_contents (bfd *output_bfd,
-                                           struct bfd_link_info *link_info,
-                                           struct bfd_link_order *link_order,
-                                           bfd_byte *data,
-                                           bfd_boolean relocatable,
-                                           asymbol **symbols)
+                                          struct bfd_link_info *link_info,
+                                          struct bfd_link_order *link_order,
+                                          bfd_byte *data,
+                                          bfd_boolean relocatable,
+                                          asymbol **symbols)
 {
   Elf_Internal_Shdr *symtab_hdr;
   asection *input_section = link_order->u.indirect.section;
@@ -1530,14 +1510,14 @@ elf32_cr16_get_relocated_section_contents (bfd *output_bfd,
   if (relocatable
       || elf_section_data (input_section)->this_hdr.contents == NULL)
     return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
-                                                       link_order, data,
-                                                       relocatable,
-                                                       symbols);
+                                                      link_order, data,
+                                                      relocatable,
+                                                      symbols);
 
   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
 
   memcpy (data, elf_section_data (input_section)->this_hdr.contents,
-          (size_t) input_section->size);
+         (size_t) input_section->size);
 
   if ((input_section->flags & SEC_RELOC) != 0
       && input_section->reloc_count > 0)
@@ -1548,68 +1528,63 @@ elf32_cr16_get_relocated_section_contents (bfd *output_bfd,
       bfd_size_type amt;
 
       internal_relocs = _bfd_elf_link_read_relocs (input_bfd, input_section,
-                                                   NULL, NULL, FALSE);
+                                                  NULL, NULL, FALSE);
       if (internal_relocs == NULL)
-        goto error_return;
+       goto error_return;
 
       if (symtab_hdr->sh_info != 0)
-        {
-          isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
-          if (isymbuf == NULL)
-            isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
-                                            symtab_hdr->sh_info, 0,
-                                            NULL, NULL, NULL);
-          if (isymbuf == NULL)
-            goto error_return;
-        }
+       {
+         isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
+         if (isymbuf == NULL)
+           isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
+                                           symtab_hdr->sh_info, 0,
+                                           NULL, NULL, NULL);
+         if (isymbuf == NULL)
+           goto error_return;
+       }
 
       amt = symtab_hdr->sh_info;
       amt *= sizeof (asection *);
       sections = bfd_malloc (amt);
       if (sections == NULL && amt != 0)
-        goto error_return;
+       goto error_return;
 
       isymend = isymbuf + symtab_hdr->sh_info;
       for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
-        {
-          asection *isec;
+       {
+         asection *isec;
 
-          if (isym->st_shndx == SHN_UNDEF)
-            isec = bfd_und_section_ptr;
-          else if (isym->st_shndx == SHN_ABS)
-            isec = bfd_abs_section_ptr;
-          else if (isym->st_shndx == SHN_COMMON)
-            isec = bfd_com_section_ptr;
-          else
-            isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
+         if (isym->st_shndx == SHN_UNDEF)
+           isec = bfd_und_section_ptr;
+         else if (isym->st_shndx == SHN_ABS)
+           isec = bfd_abs_section_ptr;
+         else if (isym->st_shndx == SHN_COMMON)
+           isec = bfd_com_section_ptr;
+         else
+           isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
 
-          *secpp = isec;
-        }
+         *secpp = isec;
+       }
 
       if (! elf32_cr16_relocate_section (output_bfd, link_info, input_bfd,
-                                     input_section, data, internal_relocs,
-                                     isymbuf, sections))
-        goto error_return;
-
-      if (sections != NULL)
-        free (sections);
-      if (isymbuf != NULL
-          && symtab_hdr->contents != (unsigned char *) isymbuf)
-        free (isymbuf);
+                                    input_section, data, internal_relocs,
+                                    isymbuf, sections))
+       goto error_return;
+
+      free (sections);
+      if (symtab_hdr->contents != (unsigned char *) isymbuf)
+       free (isymbuf);
       if (elf_section_data (input_section)->relocs != internal_relocs)
-        free (internal_relocs);
+       free (internal_relocs);
     }
 
   return data;
 
  error_return:
-  if (sections != NULL)
-    free (sections);
-  if (isymbuf != NULL
-      && symtab_hdr->contents != (unsigned char *) isymbuf)
+  free (sections);
+  if (symtab_hdr->contents != (unsigned char *) isymbuf)
     free (isymbuf);
-  if (internal_relocs != NULL
-      && elf_section_data (input_section)->relocs != internal_relocs)
+  if (elf_section_data (input_section)->relocs != internal_relocs)
     free (internal_relocs);
   return NULL;
 }
@@ -1622,8 +1597,8 @@ elf32_cr16_get_relocated_section_contents (bfd *output_bfd,
 
 static struct bfd_hash_entry *
 elf32_cr16_link_hash_newfunc (struct bfd_hash_entry *entry,
-                              struct bfd_hash_table *table,
-                              const char *string)
+                             struct bfd_hash_table *table,
+                             const char *string)
 {
   struct elf32_cr16_link_hash_entry *ret =
     (struct elf32_cr16_link_hash_entry *) entry;
@@ -1632,15 +1607,15 @@ elf32_cr16_link_hash_newfunc (struct bfd_hash_entry *entry,
      subclass.  */
   if (ret == (struct elf32_cr16_link_hash_entry *) NULL)
     ret = ((struct elf32_cr16_link_hash_entry *)
-           bfd_hash_allocate (table,
-                              sizeof (struct elf32_cr16_link_hash_entry)));
+          bfd_hash_allocate (table,
+                             sizeof (struct elf32_cr16_link_hash_entry)));
   if (ret == (struct elf32_cr16_link_hash_entry *) NULL)
     return (struct bfd_hash_entry *) ret;
 
   /* Call the allocation method of the superclass.  */
   ret = ((struct elf32_cr16_link_hash_entry *)
-         _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
-                                     table, string));
+        _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
+                                    table, string));
   if (ret != (struct elf32_cr16_link_hash_entry *) NULL)
     {
       ret->direct_calls = 0;
@@ -1660,15 +1635,15 @@ static struct bfd_link_hash_table *
 elf32_cr16_link_hash_table_create (bfd *abfd)
 {
   struct elf_link_hash_table *ret;
-  bfd_size_type amt = sizeof (struct elf_link_hash_table);
+  size_t amt = sizeof (struct elf_link_hash_table);
 
-  ret = (struct elf_link_hash_table *) bfd_malloc (amt);
+  ret = (struct elf_link_hash_table *) bfd_zmalloc (amt);
   if (ret == (struct elf_link_hash_table *) NULL)
     return NULL;
 
   if (!_bfd_elf_link_hash_table_init (ret, abfd,
-                                      elf32_cr16_link_hash_newfunc,
-                                      sizeof (struct elf32_cr16_link_hash_entry),
+                                     elf32_cr16_link_hash_newfunc,
+                                     sizeof (struct elf32_cr16_link_hash_entry),
                                      GENERIC_ELF_DATA))
     {
       free (ret);
@@ -1678,18 +1653,6 @@ elf32_cr16_link_hash_table_create (bfd *abfd)
   return &ret->root;
 }
 
-/* Free an cr16 ELF linker hash table.  */
-
-static void
-elf32_cr16_link_hash_table_free (struct bfd_link_hash_table *hash)
-{
-  struct elf_link_hash_table *ret
-    = (struct elf_link_hash_table *) hash;
-
-  _bfd_generic_link_hash_table_free
-    ((struct bfd_link_hash_table *) ret);
-}
-
 static unsigned long
 elf_cr16_mach (flagword flags)
 {
@@ -1705,21 +1668,19 @@ elf_cr16_mach (flagword flags)
    file.  This gets the CR16 architecture right based on the machine
    number.  */
 
-static void
-_bfd_cr16_elf_final_write_processing (bfd *abfd,
-                                      bfd_boolean linker ATTRIBUTE_UNUSED)
+static bfd_boolean
+_bfd_cr16_elf_final_write_processing (bfd *abfd)
 {
   unsigned long val;
   switch (bfd_get_mach (abfd))
     {
      default:
      case bfd_mach_cr16:
-        val = EM_CR16;
-        break;
+       val = EM_CR16;
+       break;
     }
-
-
- elf_elfheader (abfd)->e_flags |= val;
+  elf_elfheader (abfd)->e_flags |= val;
+  return _bfd_elf_final_write_processing (abfd);
 }
 
 
@@ -1727,7 +1688,7 @@ static bfd_boolean
 _bfd_cr16_elf_object_p (bfd *abfd)
 {
   bfd_default_set_arch_mach (abfd, bfd_arch_cr16,
-                             elf_cr16_mach (elf_elfheader (abfd)->e_flags));
+                            elf_cr16_mach (elf_elfheader (abfd)->e_flags));
   return TRUE;
 }
 
@@ -1735,8 +1696,10 @@ _bfd_cr16_elf_object_p (bfd *abfd)
    object file when linking.  */
 
 static bfd_boolean
-_bfd_cr16_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
+_bfd_cr16_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
 {
+  bfd *obfd = info->output_bfd;
+
   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
     return TRUE;
@@ -1745,8 +1708,8 @@ _bfd_cr16_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
       && bfd_get_mach (obfd) < bfd_get_mach (ibfd))
     {
       if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
-                               bfd_get_mach (ibfd)))
-         return FALSE;
+                              bfd_get_mach (ibfd)))
+        return FALSE;
      }
 
   return TRUE;
@@ -1757,16 +1720,16 @@ _bfd_cr16_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
 
    There's quite a few relaxing opportunites available on the CR16:
 
-        * bcond:24 -> bcond:16                                1 byte
-        * bcond:16 -> bcond:8                                 1 byte
-        * arithmetic imm32 -> arithmetic imm20                12 bits
-        * arithmetic imm20/imm16 -> arithmetic imm4           12/16 bits
+       * bcond:24 -> bcond:16                                1 byte
+       * bcond:16 -> bcond:8                                 1 byte
+       * arithmetic imm32 -> arithmetic imm20                12 bits
+       * arithmetic imm20/imm16 -> arithmetic imm4           12/16 bits
 
    Symbol- and reloc-reading infrastructure copied from elf-m10200.c.  */
 
 static bfd_boolean
 elf32_cr16_relax_section (bfd *abfd, asection *sec,
-                          struct bfd_link_info *link_info, bfd_boolean *again)
+                         struct bfd_link_info *link_info, bfd_boolean *again)
 {
   Elf_Internal_Shdr *symtab_hdr;
   Elf_Internal_Rela *internal_relocs;
@@ -1780,7 +1743,7 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec,
   /* We don't have to do anything for a relocatable link, if
      this section does not have relocs, or if this is not a
      code section.  */
-  if (link_info->relocatable
+  if (bfd_link_relocatable (link_info)
       || (sec->flags & SEC_RELOC) == 0
       || sec->reloc_count == 0
       || (sec->flags & SEC_CODE) == 0)
@@ -1790,7 +1753,7 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec,
 
   /* Get a copy of the native relocations.  */
   internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
-                                               link_info->keep_memory);
+                                              link_info->keep_memory);
   if (internal_relocs == NULL)
     goto error_return;
 
@@ -1801,386 +1764,386 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec,
       bfd_vma symval;
 
       /* If this isn't something that can be relaxed, then ignore
-         this reloc.  */
+        this reloc.  */
       if (ELF32_R_TYPE (irel->r_info) != (int) R_CR16_DISP16
-          && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_DISP24
-          && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_IMM32
-          && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_IMM20
-          && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_IMM16)
-        continue;
+         && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_DISP24
+         && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_IMM32
+         && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_IMM20
+         && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_IMM16)
+       continue;
 
       /* Get the section contents if we haven't done so already.  */
       if (contents == NULL)
-        {
-          /* Get cached copy if it exists.  */
-          if (elf_section_data (sec)->this_hdr.contents != NULL)
-            contents = elf_section_data (sec)->this_hdr.contents;
-          /* Go get them off disk.  */
-          else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
-            goto error_return;
-        }
+       {
+         /* Get cached copy if it exists.  */
+         if (elf_section_data (sec)->this_hdr.contents != NULL)
+           contents = elf_section_data (sec)->this_hdr.contents;
+         /* Go get them off disk.  */
+         else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
+           goto error_return;
+       }
 
       /* Read this BFD's local symbols if we haven't done so already.  */
       if (isymbuf == NULL && symtab_hdr->sh_info != 0)
-        {
-          isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
-          if (isymbuf == NULL)
-            isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
-                                            symtab_hdr->sh_info, 0,
-                                            NULL, NULL, NULL);
-          if (isymbuf == NULL)
-            goto error_return;
-        }
+       {
+         isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
+         if (isymbuf == NULL)
+           isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
+                                           symtab_hdr->sh_info, 0,
+                                           NULL, NULL, NULL);
+         if (isymbuf == NULL)
+           goto error_return;
+       }
 
       /* Get the value of the symbol referred to by the reloc.  */
       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
-        {
-          /* A local symbol.  */
-          Elf_Internal_Sym *isym;
-          asection *sym_sec;
-
-          isym = isymbuf + ELF32_R_SYM (irel->r_info);
-          if (isym->st_shndx == SHN_UNDEF)
-            sym_sec = bfd_und_section_ptr;
-          else if (isym->st_shndx == SHN_ABS)
-            sym_sec = bfd_abs_section_ptr;
-          else if (isym->st_shndx == SHN_COMMON)
-            sym_sec = bfd_com_section_ptr;
-          else
-            sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
-          symval = (isym->st_value
-                    + sym_sec->output_section->vma
-                    + sym_sec->output_offset);
-        }
+       {
+         /* A local symbol.  */
+         Elf_Internal_Sym *isym;
+         asection *sym_sec;
+
+         isym = isymbuf + ELF32_R_SYM (irel->r_info);
+         if (isym->st_shndx == SHN_UNDEF)
+           sym_sec = bfd_und_section_ptr;
+         else if (isym->st_shndx == SHN_ABS)
+           sym_sec = bfd_abs_section_ptr;
+         else if (isym->st_shndx == SHN_COMMON)
+           sym_sec = bfd_com_section_ptr;
+         else
+           sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
+         symval = (isym->st_value
+                   + sym_sec->output_section->vma
+                   + sym_sec->output_offset);
+       }
       else
-        {
-          unsigned long indx;
-          struct elf_link_hash_entry *h;
-
-          /* An external symbol.  */
-          indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
-          h = elf_sym_hashes (abfd)[indx];
-          BFD_ASSERT (h != NULL);
-
-          if (h->root.type != bfd_link_hash_defined
-              && h->root.type != bfd_link_hash_defweak)
-            /* This appears to be a reference to an undefined
-               symbol.  Just ignore it--it will be caught by the
-               regular reloc processing.  */
-            continue;
-
-          symval = (h->root.u.def.value
-                    + h->root.u.def.section->output_section->vma
-                    + h->root.u.def.section->output_offset);
-        }
+       {
+         unsigned long indx;
+         struct elf_link_hash_entry *h;
+
+         /* An external symbol.  */
+         indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
+         h = elf_sym_hashes (abfd)[indx];
+         BFD_ASSERT (h != NULL);
+
+         if (h->root.type != bfd_link_hash_defined
+             && h->root.type != bfd_link_hash_defweak)
+           /* This appears to be a reference to an undefined
+              symbol.  Just ignore it--it will be caught by the
+              regular reloc processing.  */
+           continue;
+
+         symval = (h->root.u.def.value
+                   + h->root.u.def.section->output_section->vma
+                   + h->root.u.def.section->output_offset);
+       }
 
       /* For simplicity of coding, we are going to modify the section
-         contents, the section relocs, and the BFD symbol table.  We
-         must tell the rest of the code not to free up this
-         information.  It would be possible to instead create a table
-         of changes which have to be made, as is done in coff-mips.c;
-         that would be more work, but would require less memory when
-         the linker is run.  */
+        contents, the section relocs, and the BFD symbol table.  We
+        must tell the rest of the code not to free up this
+        information.  It would be possible to instead create a table
+        of changes which have to be made, as is done in coff-mips.c;
+        that would be more work, but would require less memory when
+        the linker is run.  */
 
       /* Try to turn a 24  branch/call into a 16bit relative
-         branch/call.  */
+        branch/call.  */
       if (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_DISP24)
-        {
-          bfd_vma value = symval;
-
-          /* Deal with pc-relative gunk.  */
-          value -= (sec->output_section->vma + sec->output_offset);
-          value -= irel->r_offset;
-          value += irel->r_addend;
-
-          /* See if the value will fit in 16 bits, note the high value is
-             0xfffe + 2 as the target will be two bytes closer if we are
-             able to relax.  */
-          if ((long) value < 0x10000 && (long) value > -0x10002)
-            {
-              unsigned int code;
-
-              /* Get the opcode.  */
-              code = (unsigned int) bfd_get_32 (abfd, contents + irel->r_offset);
-
-              /* Verify it's a 'bcond' and fix the opcode.  */
-              if ((code  & 0xffff) == 0x0010)
-                bfd_put_16 (abfd, 0x1800 | ((0xf & (code >> 20)) << 4), contents + irel->r_offset);
-              else
-                continue;
-
-              /* Note that we've changed the relocs, section contents, etc.  */
-              elf_section_data (sec)->relocs = internal_relocs;
-              elf_section_data (sec)->this_hdr.contents = contents;
-              symtab_hdr->contents = (unsigned char *) isymbuf;
-
-              /* Fix the relocation's type.  */
-              irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
-                                           R_CR16_DISP16);
-
-              /* Delete two bytes of data.  */
-              if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
-                                                   irel->r_offset + 2, 2))
-                goto error_return;
-
-              /* That will change things, so, we should relax again.
-                 Note that this is not required, and it may be slow.  */
-              *again = TRUE;
-            }
-        }
+       {
+         bfd_vma value = symval;
+
+         /* Deal with pc-relative gunk.  */
+         value -= (sec->output_section->vma + sec->output_offset);
+         value -= irel->r_offset;
+         value += irel->r_addend;
+
+         /* See if the value will fit in 16 bits, note the high value is
+            0xfffe + 2 as the target will be two bytes closer if we are
+            able to relax.  */
+         if ((long) value < 0x10000 && (long) value > -0x10002)
+           {
+             unsigned int code;
+
+             /* Get the opcode.  */
+             code = (unsigned int) bfd_get_32 (abfd, contents + irel->r_offset);
+
+             /* Verify it's a 'bcond' and fix the opcode.  */
+             if ((code  & 0xffff) == 0x0010)
+               bfd_put_16 (abfd, 0x1800 | ((0xf & (code >> 20)) << 4), contents + irel->r_offset);
+             else
+               continue;
+
+             /* Note that we've changed the relocs, section contents, etc.  */
+             elf_section_data (sec)->relocs = internal_relocs;
+             elf_section_data (sec)->this_hdr.contents = contents;
+             symtab_hdr->contents = (unsigned char *) isymbuf;
+
+             /* Fix the relocation's type.  */
+             irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
+                                          R_CR16_DISP16);
+
+             /* Delete two bytes of data.  */
+             if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
+                                                  irel->r_offset + 2, 2))
+               goto error_return;
+
+             /* That will change things, so, we should relax again.
+                Note that this is not required, and it may be slow.  */
+             *again = TRUE;
+           }
+       }
 
       /* Try to turn a 16bit pc-relative branch into an
-         8bit pc-relative branch.  */
+        8bit pc-relative branch.  */
       if (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_DISP16)
-        {
-          bfd_vma value = symval;
-
-          /* Deal with pc-relative gunk.  */
-          value -= (sec->output_section->vma + sec->output_offset);
-          value -= irel->r_offset;
-          value += irel->r_addend;
-
-          /* See if the value will fit in 8 bits, note the high value is
-             0xfc + 2 as the target will be two bytes closer if we are
-             able to relax.  */
-          /*if ((long) value < 0x1fa && (long) value > -0x100) REVISIT:range */
-          if ((long) value < 0xfa && (long) value > -0x100)
-            {
-              unsigned short code;
-
-              /* Get the opcode.  */
-              code = (unsigned short) bfd_get_16 (abfd, contents + irel->r_offset);
-
-              /* Verify it's a 'bcond' and fix the opcode.  */
-              if ((code & 0xff0f) == 0x1800)
-                bfd_put_16 (abfd, (code & 0xf0f0), contents + irel->r_offset);
-              else
-                continue;
-
-              /* Note that we've changed the relocs, section contents, etc.  */
-              elf_section_data (sec)->relocs = internal_relocs;
-              elf_section_data (sec)->this_hdr.contents = contents;
-              symtab_hdr->contents = (unsigned char *) isymbuf;
-
-              /* Fix the relocation's type.  */
-              irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
-                                           R_CR16_DISP8);
-
-              /* Delete two bytes of data.  */
-              if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
-                                                   irel->r_offset + 2, 2))
-                goto error_return;
-
-              /* That will change things, so, we should relax again.
-                 Note that this is not required, and it may be slow.  */
-              *again = TRUE;
-            }
-        }
+       {
+         bfd_vma value = symval;
+
+         /* Deal with pc-relative gunk.  */
+         value -= (sec->output_section->vma + sec->output_offset);
+         value -= irel->r_offset;
+         value += irel->r_addend;
+
+         /* See if the value will fit in 8 bits, note the high value is
+            0xfc + 2 as the target will be two bytes closer if we are
+            able to relax.  */
+         /*if ((long) value < 0x1fa && (long) value > -0x100) REVISIT:range */
+         if ((long) value < 0xfa && (long) value > -0x100)
+           {
+             unsigned short code;
+
+             /* Get the opcode.  */
+             code = (unsigned short) bfd_get_16 (abfd, contents + irel->r_offset);
+
+             /* Verify it's a 'bcond' and fix the opcode.  */
+             if ((code & 0xff0f) == 0x1800)
+               bfd_put_16 (abfd, (code & 0xf0f0), contents + irel->r_offset);
+             else
+               continue;
+
+             /* Note that we've changed the relocs, section contents, etc.  */
+             elf_section_data (sec)->relocs = internal_relocs;
+             elf_section_data (sec)->this_hdr.contents = contents;
+             symtab_hdr->contents = (unsigned char *) isymbuf;
+
+             /* Fix the relocation's type.  */
+             irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
+                                          R_CR16_DISP8);
+
+             /* Delete two bytes of data.  */
+             if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
+                                                  irel->r_offset + 2, 2))
+               goto error_return;
+
+             /* That will change things, so, we should relax again.
+                Note that this is not required, and it may be slow.  */
+             *again = TRUE;
+           }
+       }
 
       /* Try to turn a 32-bit IMM address into a 20/16-bit IMM address */
       if (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM32)
-        {
-          bfd_vma value = symval;
-          unsigned short is_add_mov = 0;
-          bfd_vma value1 = 0;
-          
-          /* Get the existing value from the mcode */
-          value1 = ((bfd_get_32 (abfd, contents + irel->r_offset + 2) >> 16)
-                   |(((bfd_get_32 (abfd, contents + irel->r_offset + 2) & 0xffff) << 16)));
-
-          /* See if the value will fit in 20 bits.  */
-          if ((long) (value + value1) < 0xfffff && (long) (value + value1) > 0)
-            {
-              unsigned short code;
-
-              /* Get the opcode.  */
-              code = (unsigned short) bfd_get_16 (abfd, contents + irel->r_offset);
-
-              /* Verify it's a 'arithmetic ADDD or MOVD instruction'.
-                 For ADDD and MOVD only, convert to IMM32 -> IMM20.  */
-     
-              if (((code & 0xfff0) == 0x0070) || ((code & 0xfff0) == 0x0020))
-                 is_add_mov = 1;
-
-              if (is_add_mov)
-                {
-                  /* Note that we've changed the relocs, section contents,
-                     etc.  */
-                  elf_section_data (sec)->relocs = internal_relocs;
-                  elf_section_data (sec)->this_hdr.contents = contents;
-                  symtab_hdr->contents = (unsigned char *) isymbuf;
-
-                  /* Fix the opcode.  */
-                  if ((code & 0xfff0) == 0x0070) /* For movd.  */
-                    bfd_put_8 (abfd, 0x05, contents + irel->r_offset + 1);
-                  else                           /* code == 0x0020 for addd.  */
-                    bfd_put_8 (abfd, 0x04, contents + irel->r_offset + 1);
-
-                  bfd_put_8 (abfd, (code & 0xf) << 4, contents + irel->r_offset);
-
-                  /* If existing value is nagavive adjust approriately 
-                     place the 16-20bits (ie 4 bit) in new opcode,
-                     as the 0xffffxxxx, the higher 2 byte values removed. */
-                  if (value1 & 0x80000000)
-                    bfd_put_8 (abfd, (0x0f | (bfd_get_8(abfd, contents + irel->r_offset))), contents + irel->r_offset);
-                  else
-                    bfd_put_8 (abfd, (((value1 >> 16)&0xf) | (bfd_get_8(abfd, contents + irel->r_offset))), contents + irel->r_offset);
-
-                  /* Fix the relocation's type.  */
-                  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
-                                               R_CR16_IMM20);
-
-                  /* Delete two bytes of data.  */
-                  if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
-                                                      irel->r_offset + 2, 2))
-                    goto error_return;
-
-                  /* That will change things, so, we should relax again.
-                     Note that this is not required, and it may be slow.  */
-                  *again = TRUE;
-                }
-            }
-
-          /* See if the value will fit in 16 bits.  */
-          if ((!is_add_mov) 
-              && ((long)(value + value1) < 0x7fff && (long)(value + value1) > 0))
-            {
-              unsigned short code;
-
-              /* Get the opcode.  */
-              code = (unsigned short) bfd_get_16 (abfd, contents + irel->r_offset);
-
-              /* Note that we've changed the relocs, section contents, etc.  */
-              elf_section_data (sec)->relocs = internal_relocs;
-              elf_section_data (sec)->this_hdr.contents = contents;
-              symtab_hdr->contents = (unsigned char *) isymbuf;
-
-              /* Fix the opcode.  */
-              if ((code & 0xf0) == 0x70)          /* For movd.  */
-                bfd_put_8 (abfd, 0x54, contents + irel->r_offset + 1);
-              else if ((code & 0xf0) == 0x20)     /* For addd.  */
-                bfd_put_8 (abfd, 0x60, contents + irel->r_offset + 1);
-              else if ((code & 0xf0) == 0x90)     /* For cmpd.  */
-                bfd_put_8 (abfd, 0x56, contents + irel->r_offset + 1);
-              else
-                continue;
-
-              bfd_put_8 (abfd, 0xb0 | (code & 0xf), contents + irel->r_offset);
-
-              /* If existing value is nagavive adjust approriately 
-                 place the 12-16bits (ie 4 bit) in new opcode,
-                 as the 0xfffffxxx, the higher 2 byte values removed. */
-              if (value1 & 0x80000000)
-                bfd_put_8 (abfd, (0x0f | (bfd_get_8(abfd, contents + irel->r_offset))), contents + irel->r_offset);
-              else
-                bfd_put_16 (abfd, value1, contents + irel->r_offset + 2);
-
-
-              /* Fix the relocation's type.  */
-              irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
-                                           R_CR16_IMM16);
-
-              /* Delete two bytes of data.  */
-              if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
-                                                  irel->r_offset + 2, 2))
-                goto error_return;
-
-              /* That will change things, so, we should relax again.
-                 Note that this is not required, and it may be slow.  */
-              *again = TRUE;
-            }
-        }
+       {
+         bfd_vma value = symval;
+         unsigned short is_add_mov = 0;
+         bfd_vma value1 = 0;
+
+         /* Get the existing value from the mcode */
+         value1 = ((bfd_get_32 (abfd, contents + irel->r_offset + 2) >> 16)
+                  |(((bfd_get_32 (abfd, contents + irel->r_offset + 2) & 0xffff) << 16)));
+
+         /* See if the value will fit in 20 bits.  */
+         if ((long) (value + value1) < 0xfffff && (long) (value + value1) > 0)
+           {
+             unsigned short code;
+
+             /* Get the opcode.  */
+             code = (unsigned short) bfd_get_16 (abfd, contents + irel->r_offset);
+
+             /* Verify it's a 'arithmetic ADDD or MOVD instruction'.
+                For ADDD and MOVD only, convert to IMM32 -> IMM20.  */
+
+             if (((code & 0xfff0) == 0x0070) || ((code & 0xfff0) == 0x0020))
+                is_add_mov = 1;
+
+             if (is_add_mov)
+               {
+                 /* Note that we've changed the relocs, section contents,
+                    etc.  */
+                 elf_section_data (sec)->relocs = internal_relocs;
+                 elf_section_data (sec)->this_hdr.contents = contents;
+                 symtab_hdr->contents = (unsigned char *) isymbuf;
+
+                 /* Fix the opcode.  */
+                 if ((code & 0xfff0) == 0x0070) /* For movd.  */
+                   bfd_put_8 (abfd, 0x05, contents + irel->r_offset + 1);
+                 else                           /* code == 0x0020 for addd.  */
+                   bfd_put_8 (abfd, 0x04, contents + irel->r_offset + 1);
+
+                 bfd_put_8 (abfd, (code & 0xf) << 4, contents + irel->r_offset);
+
+                 /* If existing value is nagavive adjust approriately
+                    place the 16-20bits (ie 4 bit) in new opcode,
+                    as the 0xffffxxxx, the higher 2 byte values removed. */
+                 if (value1 & 0x80000000)
+                   bfd_put_8 (abfd, (0x0f | (bfd_get_8(abfd, contents + irel->r_offset))), contents + irel->r_offset);
+                 else
+                   bfd_put_8 (abfd, (((value1 >> 16)&0xf) | (bfd_get_8(abfd, contents + irel->r_offset))), contents + irel->r_offset);
+
+                 /* Fix the relocation's type.  */
+                 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
+                                              R_CR16_IMM20);
+
+                 /* Delete two bytes of data.  */
+                 if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
+                                                     irel->r_offset + 2, 2))
+                   goto error_return;
+
+                 /* That will change things, so, we should relax again.
+                    Note that this is not required, and it may be slow.  */
+                 *again = TRUE;
+               }
+           }
+
+         /* See if the value will fit in 16 bits.  */
+         if ((!is_add_mov)
+             && ((long)(value + value1) < 0x7fff && (long)(value + value1) > 0))
+           {
+             unsigned short code;
+
+             /* Get the opcode.  */
+             code = (unsigned short) bfd_get_16 (abfd, contents + irel->r_offset);
+
+             /* Note that we've changed the relocs, section contents, etc.  */
+             elf_section_data (sec)->relocs = internal_relocs;
+             elf_section_data (sec)->this_hdr.contents = contents;
+             symtab_hdr->contents = (unsigned char *) isymbuf;
+
+             /* Fix the opcode.  */
+             if ((code & 0xf0) == 0x70)          /* For movd.  */
+               bfd_put_8 (abfd, 0x54, contents + irel->r_offset + 1);
+             else if ((code & 0xf0) == 0x20)     /* For addd.  */
+               bfd_put_8 (abfd, 0x60, contents + irel->r_offset + 1);
+             else if ((code & 0xf0) == 0x90)     /* For cmpd.  */
+               bfd_put_8 (abfd, 0x56, contents + irel->r_offset + 1);
+             else
+               continue;
+
+             bfd_put_8 (abfd, 0xb0 | (code & 0xf), contents + irel->r_offset);
+
+             /* If existing value is nagavive adjust approriately
+                place the 12-16bits (ie 4 bit) in new opcode,
+                as the 0xfffffxxx, the higher 2 byte values removed. */
+             if (value1 & 0x80000000)
+               bfd_put_8 (abfd, (0x0f | (bfd_get_8(abfd, contents + irel->r_offset))), contents + irel->r_offset);
+             else
+               bfd_put_16 (abfd, value1, contents + irel->r_offset + 2);
+
+
+             /* Fix the relocation's type.  */
+             irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
+                                          R_CR16_IMM16);
+
+             /* Delete two bytes of data.  */
+             if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
+                                                 irel->r_offset + 2, 2))
+               goto error_return;
+
+             /* That will change things, so, we should relax again.
+                Note that this is not required, and it may be slow.  */
+             *again = TRUE;
+           }
+       }
 
 #if 0
       /* Try to turn a 16bit immediate address into a 4bit
-         immediate address.  */
-      if ((ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM20) 
-          || (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM16))
-        {
-          bfd_vma value = symval;
-          bfd_vma value1 = 0;
-
-          /* Get the existing value from the mcode */
-          value1 = ((bfd_get_16 (abfd, contents + irel->r_offset + 2) & 0xffff));
-
-          if (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM20)
-            {
-              value1 |= ((bfd_get_16 (abfd, contents + irel->r_offset + 1) & 0xf000) << 0x4);
-            }
-
-          /* See if the value will fit in 4 bits.  */
-          if ((((long) (value + value1)) < 0xf)
-              && (((long) (value + value1)) > 0))
-            {
-              unsigned short code;
-
-              /* Get the opcode.  */
-              code = (unsigned short) bfd_get_16 (abfd, contents + irel->r_offset);
-
-              /* Note that we've changed the relocs, section contents, etc.  */
-              elf_section_data (sec)->relocs = internal_relocs;
-              elf_section_data (sec)->this_hdr.contents = contents;
-              symtab_hdr->contents = (unsigned char *) isymbuf;
-
-              /* Fix the opcode.  */
-              if (((code & 0x0f00) == 0x0400) || ((code & 0x0f00) == 0x0500))
-                {
-                  if ((code & 0x0f00) == 0x0400)      /* For movd imm20.  */
-                    bfd_put_8 (abfd, 0x60, contents + irel->r_offset);
-                  else                                /* For addd imm20.  */
-                    bfd_put_8 (abfd, 0x54, contents + irel->r_offset);
-                  bfd_put_8 (abfd, (code & 0xf0) >> 4, contents + irel->r_offset + 1);
-                }
-              else
-                {
-                  if ((code & 0xfff0) == 0x56b0)       /*  For cmpd imm16.  */
-                    bfd_put_8 (abfd, 0x56, contents + irel->r_offset);
-                  else if ((code & 0xfff0) == 0x54b0)  /*  For movd imm16.  */
-                    bfd_put_8 (abfd, 0x54, contents + irel->r_offset);
-                  else if ((code & 0xfff0) == 0x58b0)  /*  For movb imm16.  */
-                    bfd_put_8 (abfd, 0x58, contents + irel->r_offset);
-                  else if ((code & 0xfff0) == 0x5Ab0)  /*  For movw imm16.  */
-                    bfd_put_8 (abfd, 0x5A, contents + irel->r_offset);
-                  else if ((code & 0xfff0) == 0x60b0)  /*  For addd imm16.  */
-                    bfd_put_8 (abfd, 0x60, contents + irel->r_offset);
-                  else if ((code & 0xfff0) == 0x30b0)  /*  For addb imm16.  */
-                    bfd_put_8 (abfd, 0x30, contents + irel->r_offset);
-                  else if ((code & 0xfff0) == 0x2Cb0)  /*  For addub imm16.  */
-                    bfd_put_8 (abfd, 0x2C, contents + irel->r_offset);
-                  else if ((code & 0xfff0) == 0x32b0)  /*  For adduw imm16.  */
-                    bfd_put_8 (abfd, 0x32, contents + irel->r_offset);
-                  else if ((code & 0xfff0) == 0x38b0)  /*  For subb imm16.  */
-                    bfd_put_8 (abfd, 0x38, contents + irel->r_offset);
-                  else if ((code & 0xfff0) == 0x3Cb0)  /*  For subcb imm16.  */
-                    bfd_put_8 (abfd, 0x3C, contents + irel->r_offset);
-                  else if ((code & 0xfff0) == 0x3Fb0)  /*  For subcw imm16.  */
-                    bfd_put_8 (abfd, 0x3F, contents + irel->r_offset);
-                  else if ((code & 0xfff0) == 0x3Ab0)  /*  For subw imm16.  */
-                    bfd_put_8 (abfd, 0x3A, contents + irel->r_offset);
-                  else if ((code & 0xfff0) == 0x50b0)  /*  For cmpb imm16.  */
-                    bfd_put_8 (abfd, 0x50, contents + irel->r_offset);
-                  else if ((code & 0xfff0) == 0x52b0)  /*  For cmpw imm16.  */
-                    bfd_put_8 (abfd, 0x52, contents + irel->r_offset);
-                  else
-                    continue;
-
-                  bfd_put_8 (abfd, (code & 0xf), contents + irel->r_offset + 1);
-                }
-
-              /* Fix the relocation's type.  */
-              irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
-                                           R_CR16_IMM4);
-
-              /* Delete two bytes of data.  */
-              if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
-                                                  irel->r_offset + 2, 2))
-                goto error_return;
-
-              /* That will change things, so, we should relax again.
-                 Note that this is not required, and it may be slow.  */
-              *again = TRUE;
-            }
-        }
+        immediate address.  */
+      if ((ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM20)
+         || (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM16))
+       {
+         bfd_vma value = symval;
+         bfd_vma value1 = 0;
+
+         /* Get the existing value from the mcode */
+         value1 = ((bfd_get_16 (abfd, contents + irel->r_offset + 2) & 0xffff));
+
+         if (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM20)
+           {
+             value1 |= ((bfd_get_16 (abfd, contents + irel->r_offset + 1) & 0xf000) << 0x4);
+           }
+
+         /* See if the value will fit in 4 bits.  */
+         if ((((long) (value + value1)) < 0xf)
+             && (((long) (value + value1)) > 0))
+           {
+             unsigned short code;
+
+             /* Get the opcode.  */
+             code = (unsigned short) bfd_get_16 (abfd, contents + irel->r_offset);
+
+             /* Note that we've changed the relocs, section contents, etc.  */
+             elf_section_data (sec)->relocs = internal_relocs;
+             elf_section_data (sec)->this_hdr.contents = contents;
+             symtab_hdr->contents = (unsigned char *) isymbuf;
+
+             /* Fix the opcode.  */
+             if (((code & 0x0f00) == 0x0400) || ((code & 0x0f00) == 0x0500))
+               {
+                 if ((code & 0x0f00) == 0x0400)      /* For movd imm20.  */
+                   bfd_put_8 (abfd, 0x60, contents + irel->r_offset);
+                 else                                /* For addd imm20.  */
+                   bfd_put_8 (abfd, 0x54, contents + irel->r_offset);
+                 bfd_put_8 (abfd, (code & 0xf0) >> 4, contents + irel->r_offset + 1);
+               }
+             else
+               {
+                 if ((code & 0xfff0) == 0x56b0)       /*  For cmpd imm16.  */
+                   bfd_put_8 (abfd, 0x56, contents + irel->r_offset);
+                 else if ((code & 0xfff0) == 0x54b0)  /*  For movd imm16.  */
+                   bfd_put_8 (abfd, 0x54, contents + irel->r_offset);
+                 else if ((code & 0xfff0) == 0x58b0)  /*  For movb imm16.  */
+                   bfd_put_8 (abfd, 0x58, contents + irel->r_offset);
+                 else if ((code & 0xfff0) == 0x5Ab0)  /*  For movw imm16.  */
+                   bfd_put_8 (abfd, 0x5A, contents + irel->r_offset);
+                 else if ((code & 0xfff0) == 0x60b0)  /*  For addd imm16.  */
+                   bfd_put_8 (abfd, 0x60, contents + irel->r_offset);
+                 else if ((code & 0xfff0) == 0x30b0)  /*  For addb imm16.  */
+                   bfd_put_8 (abfd, 0x30, contents + irel->r_offset);
+                 else if ((code & 0xfff0) == 0x2Cb0)  /*  For addub imm16.  */
+                   bfd_put_8 (abfd, 0x2C, contents + irel->r_offset);
+                 else if ((code & 0xfff0) == 0x32b0)  /*  For adduw imm16.  */
+                   bfd_put_8 (abfd, 0x32, contents + irel->r_offset);
+                 else if ((code & 0xfff0) == 0x38b0)  /*  For subb imm16.  */
+                   bfd_put_8 (abfd, 0x38, contents + irel->r_offset);
+                 else if ((code & 0xfff0) == 0x3Cb0)  /*  For subcb imm16.  */
+                   bfd_put_8 (abfd, 0x3C, contents + irel->r_offset);
+                 else if ((code & 0xfff0) == 0x3Fb0)  /*  For subcw imm16.  */
+                   bfd_put_8 (abfd, 0x3F, contents + irel->r_offset);
+                 else if ((code & 0xfff0) == 0x3Ab0)  /*  For subw imm16.  */
+                   bfd_put_8 (abfd, 0x3A, contents + irel->r_offset);
+                 else if ((code & 0xfff0) == 0x50b0)  /*  For cmpb imm16.  */
+                   bfd_put_8 (abfd, 0x50, contents + irel->r_offset);
+                 else if ((code & 0xfff0) == 0x52b0)  /*  For cmpw imm16.  */
+                   bfd_put_8 (abfd, 0x52, contents + irel->r_offset);
+                 else
+                   continue;
+
+                 bfd_put_8 (abfd, (code & 0xf), contents + irel->r_offset + 1);
+               }
+
+             /* Fix the relocation's type.  */
+             irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
+                                          R_CR16_IMM4);
+
+             /* Delete two bytes of data.  */
+             if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
+                                                 irel->r_offset + 2, 2))
+               goto error_return;
+
+             /* That will change things, so, we should relax again.
+                Note that this is not required, and it may be slow.  */
+             *again = TRUE;
+           }
+       }
 #endif
     }
 
@@ -2188,7 +2151,7 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec,
       && symtab_hdr->contents != (unsigned char *) isymbuf)
     {
       if (! link_info->keep_memory)
-        free (isymbuf);
+       free (isymbuf);
       else
        /* Cache the symbols for elf_link_input_bfd.  */
        symtab_hdr->contents = (unsigned char *) isymbuf;
@@ -2198,28 +2161,24 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec,
       && elf_section_data (sec)->this_hdr.contents != contents)
     {
       if (! link_info->keep_memory)
-        free (contents);
+       free (contents);
       else
        /* Cache the section contents for elf_link_input_bfd.  */
        elf_section_data (sec)->this_hdr.contents = contents;
-       
+
     }
 
-  if (internal_relocs != NULL
-      && elf_section_data (sec)->relocs != internal_relocs)
+  if (elf_section_data (sec)->relocs != internal_relocs)
     free (internal_relocs);
 
   return TRUE;
 
  error_return:
-  if (isymbuf != NULL
-      && symtab_hdr->contents != (unsigned char *) isymbuf)
+  if (symtab_hdr->contents != (unsigned char *) isymbuf)
     free (isymbuf);
-  if (contents != NULL
-      && elf_section_data (sec)->this_hdr.contents != contents)
+  if (elf_section_data (sec)->this_hdr.contents != contents)
     free (contents);
-  if (internal_relocs != NULL
-      && elf_section_data (sec)->relocs != internal_relocs)
+  if (elf_section_data (sec)->relocs != internal_relocs)
     free (internal_relocs);
 
   return FALSE;
@@ -2227,26 +2186,14 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec,
 
 static asection *
 elf32_cr16_gc_mark_hook (asection *sec,
-                         struct bfd_link_info *info,
-                         Elf_Internal_Rela *rel,
-                         struct elf_link_hash_entry *h,
-                         Elf_Internal_Sym *sym)
+                        struct bfd_link_info *info,
+                        Elf_Internal_Rela *rel,
+                        struct elf_link_hash_entry *h,
+                        Elf_Internal_Sym *sym)
 {
   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
 }
 
-/* Update the got entry reference counts for the section being removed.  */
-
-static bfd_boolean
-elf32_cr16_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)
-{
-  /* We don't support garbage collection of GOT and PLT relocs yet.  */
-  return TRUE;
-}
-
 /* Create dynamic sections when linking against a dynamic object.  */
 
 static bfd_boolean
@@ -2255,6 +2202,7 @@ _bfd_cr16_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
   flagword   flags;
   asection * s;
   const struct elf_backend_data * bed = get_elf_backend_data (abfd);
+  struct elf_link_hash_table *htab = elf_hash_table (info);
   int ptralign = 0;
 
   switch (bed->s->arch_size)
@@ -2276,79 +2224,54 @@ _bfd_cr16_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
      .rel[a].bss sections.  */
 
   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
-           | SEC_LINKER_CREATED);
+          | SEC_LINKER_CREATED);
 
-  s = bfd_make_section_with_flags (abfd,
-                                   (bed->default_use_rela_p
-                                    ? ".rela.plt" : ".rel.plt"),
-                                   flags | SEC_READONLY);
+  s = bfd_make_section_anyway_with_flags (abfd,
+                                         (bed->default_use_rela_p
+                                          ? ".rela.plt" : ".rel.plt"),
+                                         flags | SEC_READONLY);
+  htab->srelplt = s;
   if (s == NULL
-      || ! bfd_set_section_alignment (abfd, s, ptralign))
+      || !bfd_set_section_alignment (s, ptralign))
     return FALSE;
 
   if (! _bfd_cr16_elf_create_got_section (abfd, info))
     return FALSE;
 
-  {
-    const char * secname;
-    char *       relname;
-    flagword     secflags;
-    asection *   sec;
-
-    for (sec = abfd->sections; sec; sec = sec->next)
-      {
-        secflags = bfd_get_section_flags (abfd, sec);
-        if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
-            || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
-          continue;
-
-        secname = bfd_get_section_name (abfd, sec);
-        relname = (char *) bfd_malloc (strlen (secname) + 6);
-        strcpy (relname, ".rela");
-        strcat (relname, secname);
-
-        s = bfd_make_section_with_flags (abfd, relname,
-                                         flags | SEC_READONLY);
-        if (s == NULL
-            || ! bfd_set_section_alignment (abfd, s, ptralign))
-          return FALSE;
-      }
-  }
-
   if (bed->want_dynbss)
     {
       /* The .dynbss section is a place to put symbols which are defined
-         by dynamic objects, are referenced by regular objects, and are
-         not functions.  We must allocate space for them in the process
-         image and use a R_*_COPY reloc to tell the dynamic linker to
-         initialize them at run time.  The linker script puts the .dynbss
-         section into the .bss section of the final image.  */
-      s = bfd_make_section_with_flags (abfd, ".dynbss",
-                                       SEC_ALLOC | SEC_LINKER_CREATED);
+        by dynamic objects, are referenced by regular objects, and are
+        not functions.  We must allocate space for them in the process
+        image and use a R_*_COPY reloc to tell the dynamic linker to
+        initialize them at run time.  The linker script puts the .dynbss
+        section into the .bss section of the final image.  */
+      s = bfd_make_section_anyway_with_flags (abfd, ".dynbss",
+                                             SEC_ALLOC | SEC_LINKER_CREATED);
       if (s == NULL)
-        return FALSE;
+       return FALSE;
 
       /* The .rel[a].bss section holds copy relocs.  This section is not
-         normally needed.  We need to create it here, though, so that the
-         linker will map it to an output section.  We can't just create it
-         only if we need it, because we will not know whether we need it
-         until we have seen all the input files, and the first time the
-         main linker code calls BFD after examining all the input files
-         (size_dynamic_sections) the input sections have already been
-         mapped to the output sections.  If the section turns out not to
-         be needed, we can discard it later.  We will never need this
-         section when generating a shared object, since they do not use
-         copy relocs.  */
-      if (! info->executable)
-        {
-          s = bfd_make_section_with_flags (abfd,
-                                           (bed->default_use_rela_p
-                                            ? ".rela.bss" : ".rel.bss"),
-                                           flags | SEC_READONLY);
-          if (s == NULL
-              || ! bfd_set_section_alignment (abfd, s, ptralign))
-            return FALSE;
-        }
+        normally needed.  We need to create it here, though, so that the
+        linker will map it to an output section.  We can't just create it
+        only if we need it, because we will not know whether we need it
+        until we have seen all the input files, and the first time the
+        main linker code calls BFD after examining all the input files
+        (size_dynamic_sections) the input sections have already been
+        mapped to the output sections.  If the section turns out not to
+        be needed, we can discard it later.  We will never need this
+        section when generating a shared object, since they do not use
+        copy relocs.  */
+      if (! bfd_link_executable (info))
+       {
+         s = bfd_make_section_anyway_with_flags (abfd,
+                                                 (bed->default_use_rela_p
+                                                  ? ".rela.bss" : ".rel.bss"),
+                                                 flags | SEC_READONLY);
+         if (s == NULL
+             || !bfd_set_section_alignment (s, ptralign))
+           return FALSE;
+       }
     }
 
   return TRUE;
@@ -2362,7 +2285,7 @@ _bfd_cr16_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
 
 static bfd_boolean
 _bfd_cr16_elf_adjust_dynamic_symbol (struct bfd_link_info * info,
-                                     struct elf_link_hash_entry * h)
+                                    struct elf_link_hash_entry * h)
 {
   bfd * dynobj;
   asection * s;
@@ -2371,11 +2294,11 @@ _bfd_cr16_elf_adjust_dynamic_symbol (struct bfd_link_info * info,
 
   /* Make sure we know what is going on here.  */
   BFD_ASSERT (dynobj != NULL
-              && (h->needs_plt
-                  || h->u.weakdef != NULL
-                  || (h->def_dynamic
-                      && h->ref_regular
-                      && !h->def_regular)));
+             && (h->needs_plt
+                 || h->is_weakalias
+                 || (h->def_dynamic
+                     && h->ref_regular
+                     && !h->def_regular)));
 
   /* If this is a function, put it in the procedure linkage table.  We
      will fill in the contents of the procedure linkage table later,
@@ -2383,36 +2306,36 @@ _bfd_cr16_elf_adjust_dynamic_symbol (struct bfd_link_info * info,
   if (h->type == STT_FUNC
       || h->needs_plt)
     {
-      if (! info->executable
-          && !h->def_dynamic
-          && !h->ref_dynamic)
-        {
-          /* This case can occur if we saw a PLT reloc in an input
-             file, but the symbol was never referred to by a dynamic
-             object.  In such a case, we don't actually need to build
-             a procedure linkage table, and we can just do a REL32
-             reloc instead.  */
-          BFD_ASSERT (h->needs_plt);
-          return TRUE;
-        }
+      if (! bfd_link_executable (info)
+         && !h->def_dynamic
+         && !h->ref_dynamic)
+       {
+         /* This case can occur if we saw a PLT reloc in an input
+            file, but the symbol was never referred to by a dynamic
+            object.  In such a case, we don't actually need to build
+            a procedure linkage table, and we can just do a REL32
+            reloc instead.  */
+         BFD_ASSERT (h->needs_plt);
+         return TRUE;
+       }
 
       /* Make sure this symbol is output as a dynamic symbol.  */
       if (h->dynindx == -1)
-        {
-          if (! bfd_elf_link_record_dynamic_symbol (info, h))
-            return FALSE;
-        }
+       {
+         if (! bfd_elf_link_record_dynamic_symbol (info, h))
+           return FALSE;
+       }
 
       /* We also need to make an entry in the .got.plt section, which
-         will be placed in the .got section by the linker script.  */
+        will be placed in the .got section by the linker script.  */
 
-      s = bfd_get_section_by_name (dynobj, ".got.plt");
+      s = elf_hash_table (info)->sgotplt;
       BFD_ASSERT (s != NULL);
       s->size += 4;
 
       /* We also need to make an entry in the .rela.plt section.  */
 
-      s = bfd_get_section_by_name (dynobj, ".rela.plt");
+      s = elf_hash_table (info)->srelplt;
       BFD_ASSERT (s != NULL);
       s->size += sizeof (Elf32_External_Rela);
 
@@ -2422,12 +2345,12 @@ _bfd_cr16_elf_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 (h->u.weakdef != NULL)
+  if (h->is_weakalias)
     {
-      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
-                  || h->u.weakdef->root.type == bfd_link_hash_defweak);
-      h->root.u.def.section = h->u.weakdef->root.u.def.section;
-      h->root.u.def.value = h->u.weakdef->root.u.def.value;
+      struct elf_link_hash_entry *def = weakdef (h);
+      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
+      h->root.u.def.section = def->root.u.def.section;
+      h->root.u.def.value = def->root.u.def.value;
       return TRUE;
     }
 
@@ -2438,7 +2361,7 @@ _bfd_cr16_elf_adjust_dynamic_symbol (struct bfd_link_info * info,
      only references to the symbol are via the global offset table.
      For such cases we need not do anything here; the relocations will
      be handled correctly by relocate_section.  */
-  if (info->executable)
+  if (bfd_link_executable (info))
     return TRUE;
 
   /* If there are no references to this symbol that do not use the
@@ -2456,7 +2379,7 @@ _bfd_cr16_elf_adjust_dynamic_symbol (struct bfd_link_info * info,
      both the dynamic object and the regular object will refer to the
      same memory location for the variable.  */
 
-  s = bfd_get_section_by_name (dynobj, ".dynbss");
+  s = bfd_get_linker_section (dynobj, ".dynbss");
   BFD_ASSERT (s != NULL);
 
   /* We must generate a R_CR16_COPY reloc to tell the dynamic linker to
@@ -2467,20 +2390,20 @@ _bfd_cr16_elf_adjust_dynamic_symbol (struct bfd_link_info * info,
     {
       asection * srel;
 
-      srel = bfd_get_section_by_name (dynobj, ".rela.bss");
+      srel = bfd_get_linker_section (dynobj, ".rela.bss");
       BFD_ASSERT (srel != NULL);
       srel->size += sizeof (Elf32_External_Rela);
       h->needs_copy = 1;
     }
 
-  return _bfd_elf_adjust_dynamic_copy (h, s);
+  return _bfd_elf_adjust_dynamic_copy (info, h, s);
 }
 
 /* Set the sizes of the dynamic sections.  */
 
 static bfd_boolean
 _bfd_cr16_elf_size_dynamic_sections (bfd * output_bfd,
-                                     struct bfd_link_info * info)
+                                    struct bfd_link_info * info)
 {
   bfd * dynobj;
   asection * s;
@@ -2494,26 +2417,26 @@ _bfd_cr16_elf_size_dynamic_sections (bfd * output_bfd,
   if (elf_hash_table (info)->dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
-      if (info->executable)
-        {
+      if (bfd_link_executable (info) && !info->nointerp)
+       {
 #if 0
-          s = bfd_get_section_by_name (dynobj, ".interp");
-          BFD_ASSERT (s != NULL);
-          s->size = sizeof ELF_DYNAMIC_INTERPRETER;
-          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
+         s = bfd_get_linker_section (dynobj, ".interp");
+         BFD_ASSERT (s != NULL);
+         s->size = sizeof ELF_DYNAMIC_INTERPRETER;
+         s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
 #endif
-        }
+       }
     }
   else
     {
       /* We may have created entries in the .rela.got section.
-         However, if we are not creating the dynamic sections, we will
-         not actually use these entries.  Reset the size of .rela.got,
-         which will cause it to get stripped from the output file
-         below.  */
-      s = bfd_get_section_by_name (dynobj, ".rela.got");
+        However, if we are not creating the dynamic sections, we will
+        not actually use these entries.  Reset the size of .rela.got,
+        which will cause it to get stripped from the output file
+        below.  */
+      s = elf_hash_table (info)->srelgot;
       if (s != NULL)
-        s->size = 0;
+       s->size = 0;
     }
 
   /* The check_relocs and adjust_dynamic_symbol entry points have
@@ -2527,119 +2450,118 @@ _bfd_cr16_elf_size_dynamic_sections (bfd * output_bfd,
       const char * name;
 
       if ((s->flags & SEC_LINKER_CREATED) == 0)
-        continue;
+       continue;
 
       /* It's OK to base decisions on the section name, because none
-         of the dynobj section names depend upon the input files.  */
-      name = bfd_get_section_name (dynobj, s);
+        of the dynobj section names depend upon the input files.  */
+      name = bfd_section_name (s);
 
       if (strcmp (name, ".plt") == 0)
-        {
-          /* Remember whether there is a PLT.  */
-          plt = s->size != 0;
-        }
+       {
+         /* Remember whether there is a PLT.  */
+         plt = s->size != 0;
+       }
       else if (CONST_STRNEQ (name, ".rela"))
-        {
-          if (s->size != 0)
-            {
-              asection * target;
-
-              /* Remember whether there are any reloc sections other
-                 than .rela.plt.  */
-              if (strcmp (name, ".rela.plt") != 0)
-                {
-                  const char * outname;
-
-                  relocs = TRUE;
-
-                  /* If this relocation section applies to a read only
-                     section, then we probably need a DT_TEXTREL
-                     entry.  The entries in the .rela.plt section
-                     really apply to the .got section, which we
-                     created ourselves and so know is not readonly.  */
-                  outname = bfd_get_section_name (output_bfd,
-                                                  s->output_section);
-                  target = bfd_get_section_by_name (output_bfd, outname + 5);
-                  if (target != NULL
-                      && (target->flags & SEC_READONLY) != 0
-                      && (target->flags & SEC_ALLOC) != 0)
-                    reltext = TRUE;
-                }
-
-              /* We use the reloc_count field as a counter if we need
-                 to copy relocs into the output file.  */
-              s->reloc_count = 0;
-            }
-        }
+       {
+         if (s->size != 0)
+           {
+             asection * target;
+
+             /* Remember whether there are any reloc sections other
+                than .rela.plt.  */
+             if (strcmp (name, ".rela.plt") != 0)
+               {
+                 const char * outname;
+
+                 relocs = TRUE;
+
+                 /* If this relocation section applies to a read only
+                    section, then we probably need a DT_TEXTREL
+                    entry.  The entries in the .rela.plt section
+                    really apply to the .got section, which we
+                    created ourselves and so know is not readonly.  */
+                 outname = bfd_section_name (s->output_section);
+                 target = bfd_get_section_by_name (output_bfd, outname + 5);
+                 if (target != NULL
+                     && (target->flags & SEC_READONLY) != 0
+                     && (target->flags & SEC_ALLOC) != 0)
+                   reltext = TRUE;
+               }
+
+             /* We use the reloc_count field as a counter if we need
+                to copy relocs into the output file.  */
+             s->reloc_count = 0;
+           }
+       }
       else if (! CONST_STRNEQ (name, ".got")
-               && strcmp (name, ".dynbss") != 0)
-        /* It's not one of our sections, so don't allocate space.  */
-        continue;
+              && strcmp (name, ".dynbss") != 0)
+       /* It's not one of our sections, so don't allocate space.  */
+       continue;
 
       if (s->size == 0)
-        {
-          /* If we don't need this section, strip it from the
-             output file.  This is mostly to handle .rela.bss and
-             .rela.plt.  We must create both sections in
-             create_dynamic_sections, because they must be created
-             before the linker maps input sections to output
-             sections.  The linker does that before
-             adjust_dynamic_symbol is called, and it is that
-             function which decides whether anything needs to go
-             into these sections.  */
-          s->flags |= SEC_EXCLUDE;
-          continue;
-        }
-
-        if ((s->flags & SEC_HAS_CONTENTS) == 0)
-          continue;
+       {
+         /* If we don't need this section, strip it from the
+            output file.  This is mostly to handle .rela.bss and
+            .rela.plt.  We must create both sections in
+            create_dynamic_sections, because they must be created
+            before the linker maps input sections to output
+            sections.  The linker does that before
+            adjust_dynamic_symbol is called, and it is that
+            function which decides whether anything needs to go
+            into these sections.  */
+         s->flags |= SEC_EXCLUDE;
+         continue;
+       }
+
+       if ((s->flags & SEC_HAS_CONTENTS) == 0)
+         continue;
 
       /* Allocate memory for the section contents.  We use bfd_zalloc
-         here in case unused entries are not reclaimed before the
-         section's contents are written out.  This should not happen,
-         but this way if it does, we get a R_CR16_NONE reloc
-         instead of garbage.  */
+        here in case unused entries are not reclaimed before the
+        section's contents are written out.  This should not happen,
+        but this way if it does, we get a R_CR16_NONE reloc
+        instead of garbage.  */
       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
       if (s->contents == NULL)
-        return FALSE;
+       return FALSE;
     }
 
   if (elf_hash_table (info)->dynamic_sections_created)
     {
       /* Add some entries to the .dynamic section.  We fill in the
-         values later, in _bfd_cr16_elf_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.  */
-      if (! info->executable)
-        {
-          if (!_bfd_elf_add_dynamic_entry (info, DT_DEBUG, 0))
-            return FALSE;
-        }
+        values later, in _bfd_cr16_elf_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.  */
+      if (! bfd_link_executable (info))
+       {
+         if (!_bfd_elf_add_dynamic_entry (info, DT_DEBUG, 0))
+           return FALSE;
+       }
 
       if (plt)
-        {
-          if (!_bfd_elf_add_dynamic_entry (info, DT_PLTGOT, 0)
-              || !_bfd_elf_add_dynamic_entry (info, DT_PLTRELSZ, 0)
-              || !_bfd_elf_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
-              || !_bfd_elf_add_dynamic_entry (info, DT_JMPREL, 0))
-            return FALSE;
-        }
+       {
+         if (!_bfd_elf_add_dynamic_entry (info, DT_PLTGOT, 0)
+             || !_bfd_elf_add_dynamic_entry (info, DT_PLTRELSZ, 0)
+             || !_bfd_elf_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
+             || !_bfd_elf_add_dynamic_entry (info, DT_JMPREL, 0))
+           return FALSE;
+       }
 
       if (relocs)
-        {
-          if (!_bfd_elf_add_dynamic_entry (info, DT_RELA, 0)
-              || !_bfd_elf_add_dynamic_entry (info, DT_RELASZ, 0)
-              || !_bfd_elf_add_dynamic_entry (info, DT_RELAENT,
-                                              sizeof (Elf32_External_Rela)))
-            return FALSE;
-        }
+       {
+         if (!_bfd_elf_add_dynamic_entry (info, DT_RELA, 0)
+             || !_bfd_elf_add_dynamic_entry (info, DT_RELASZ, 0)
+             || !_bfd_elf_add_dynamic_entry (info, DT_RELAENT,
+                                             sizeof (Elf32_External_Rela)))
+           return FALSE;
+       }
 
       if (reltext)
-        {
-          if (!_bfd_elf_add_dynamic_entry (info, DT_TEXTREL, 0))
-            return FALSE;
-        }
+       {
+         if (!_bfd_elf_add_dynamic_entry (info, DT_TEXTREL, 0))
+           return FALSE;
+       }
     }
 
   return TRUE;
@@ -2650,9 +2572,9 @@ _bfd_cr16_elf_size_dynamic_sections (bfd * output_bfd,
 
 static bfd_boolean
 _bfd_cr16_elf_finish_dynamic_symbol (bfd * output_bfd,
-                                     struct bfd_link_info * info,
-                                     struct elf_link_hash_entry * h,
-                                     Elf_Internal_Sym * sym)
+                                    struct bfd_link_info * info,
+                                    struct elf_link_hash_entry * h,
+                                    Elf_Internal_Sym * sym)
 {
   bfd * dynobj;
 
@@ -2660,74 +2582,73 @@ _bfd_cr16_elf_finish_dynamic_symbol (bfd * output_bfd,
 
   if (h->got.offset != (bfd_vma) -1)
     {
-      asection *        sgot;
-      asection *        srel;
+      asection *       sgot;
+      asection *       srel;
       Elf_Internal_Rela rel;
 
       /* This symbol has an entry in the global offset table.  Set it up.  */
 
-      sgot = bfd_get_section_by_name (dynobj, ".got");
-      srel = bfd_get_section_by_name (dynobj, ".rela.got");
+      sgot = elf_hash_table (info)->sgot;
+      srel = elf_hash_table (info)->srelgot;
       BFD_ASSERT (sgot != NULL && srel != NULL);
 
       rel.r_offset = (sgot->output_section->vma
-                      + sgot->output_offset
-                      + (h->got.offset & ~1));
+                     + sgot->output_offset
+                     + (h->got.offset & ~1));
 
       /* If this is a -Bsymbolic link, and the symbol is defined
-         locally, we just want to emit a RELATIVE reloc.  Likewise if
-         the symbol was forced to be local because of a version file.
-         The entry in the global offset table will already have been
-         initialized in the relocate_section function.  */
-      if (info->executable
-          && (info->symbolic || h->dynindx == -1)
-          && h->def_regular)
-        {
-          rel.r_info = ELF32_R_INFO (0, R_CR16_GOT_REGREL20);
-          rel.r_addend = (h->root.u.def.value
-                          + h->root.u.def.section->output_section->vma
-                          + h->root.u.def.section->output_offset);
-        }
+        locally, we just want to emit a RELATIVE reloc.  Likewise if
+        the symbol was forced to be local because of a version file.
+        The entry in the global offset table will already have been
+        initialized in the relocate_section function.  */
+      if (bfd_link_executable (info)
+         && (info->symbolic || h->dynindx == -1)
+         && h->def_regular)
+       {
+         rel.r_info = ELF32_R_INFO (0, R_CR16_GOT_REGREL20);
+         rel.r_addend = (h->root.u.def.value
+                         + h->root.u.def.section->output_section->vma
+                         + h->root.u.def.section->output_offset);
+       }
       else
-        {
-          bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
-          rel.r_info = ELF32_R_INFO (h->dynindx, R_CR16_GOT_REGREL20);
-          rel.r_addend = 0;
-        }
+       {
+         bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
+         rel.r_info = ELF32_R_INFO (h->dynindx, R_CR16_GOT_REGREL20);
+         rel.r_addend = 0;
+       }
 
       bfd_elf32_swap_reloca_out (output_bfd, &rel,
-                                 (bfd_byte *) ((Elf32_External_Rela *) srel->contents
-                                               + srel->reloc_count));
+                                (bfd_byte *) ((Elf32_External_Rela *) srel->contents
+                                              + srel->reloc_count));
       ++ srel->reloc_count;
     }
 
   if (h->needs_copy)
     {
-      asection *        s;
+      asection *       s;
       Elf_Internal_Rela rel;
 
       /* This symbol needs a copy reloc.  Set it up.  */
       BFD_ASSERT (h->dynindx != -1
-                  && (h->root.type == bfd_link_hash_defined
-                      || h->root.type == bfd_link_hash_defweak));
+                 && (h->root.type == bfd_link_hash_defined
+                     || h->root.type == bfd_link_hash_defweak));
 
-      s = bfd_get_section_by_name (h->root.u.def.section->owner,
-                                   ".rela.bss");
+      s = bfd_get_linker_section (dynobj, ".rela.bss");
       BFD_ASSERT (s != NULL);
 
       rel.r_offset = (h->root.u.def.value
-                      + h->root.u.def.section->output_section->vma
-                      + h->root.u.def.section->output_offset);
+                     + h->root.u.def.section->output_section->vma
+                     + h->root.u.def.section->output_offset);
       rel.r_info = ELF32_R_INFO (h->dynindx, R_CR16_GOT_REGREL20);
       rel.r_addend = 0;
       bfd_elf32_swap_reloca_out (output_bfd, &rel,
-                                 (bfd_byte *) ((Elf32_External_Rela *) s->contents
-                                               + s->reloc_count));
+                                (bfd_byte *) ((Elf32_External_Rela *) s->contents
+                                              + s->reloc_count));
      ++ s->reloc_count;
     }
 
   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
-  if (strcmp (h->root.root.string, "_DYNAMIC") == 0
+  if (h == elf_hash_table (info)->hdynamic
       || h == elf_hash_table (info)->hgot)
     sym->st_shndx = SHN_ABS;
 
@@ -2738,7 +2659,7 @@ _bfd_cr16_elf_finish_dynamic_symbol (bfd * output_bfd,
 
 static bfd_boolean
 _bfd_cr16_elf_finish_dynamic_sections (bfd * output_bfd,
-                                       struct bfd_link_info * info)
+                                      struct bfd_link_info * info)
 {
   bfd *      dynobj;
   asection * sgot;
@@ -2746,9 +2667,9 @@ _bfd_cr16_elf_finish_dynamic_sections (bfd * output_bfd,
 
   dynobj = elf_hash_table (info)->dynobj;
 
-  sgot = bfd_get_section_by_name (dynobj, ".got.plt");
+  sgot = elf_hash_table (info)->sgotplt;
   BFD_ASSERT (sgot != NULL);
-  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
+  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
 
   if (elf_hash_table (info)->dynamic_sections_created)
     {
@@ -2761,55 +2682,35 @@ _bfd_cr16_elf_finish_dynamic_sections (bfd * output_bfd,
       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
 
       for (; dyncon < dynconend; dyncon++)
-        {
-          Elf_Internal_Dyn dyn;
-          const char * name;
-          asection * s;
-
-          bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
-
-          switch (dyn.d_tag)
-            {
-            default:
-              break;
-
-            case DT_PLTGOT:
-              name = ".got";
-              goto get_vma;
-
-            case DT_JMPREL:
-              name = ".rela.plt";
-            get_vma:
-              s = bfd_get_section_by_name (output_bfd, name);
-              BFD_ASSERT (s != NULL);
-              dyn.d_un.d_ptr = s->vma;
-              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
-              break;
-
-            case DT_PLTRELSZ:
-              s = bfd_get_section_by_name (output_bfd, ".rela.plt");
-              BFD_ASSERT (s != NULL);
-              dyn.d_un.d_val = s->size;
-              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
-              break;
-
-            case DT_RELASZ:
-              /* My reading of the SVR4 ABI indicates that the
-                 procedure linkage table relocs (DT_JMPREL) should be
-                 included in the overall relocs (DT_RELA).  This is
-                 what Solaris does.  However, UnixWare can not handle
-                 that case.  Therefore, we override the DT_RELASZ entry
-                 here to make it not include the JMPREL relocs.  Since
-                 the linker script arranges for .rela.plt to follow all
-                 other relocation sections, we don't have to worry
-                 about changing the DT_RELA entry.  */
-              s = bfd_get_section_by_name (output_bfd, ".rela.plt");
-              if (s != NULL)
-                dyn.d_un.d_val -= s->size;
-              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
-              break;
-            }
-        }
+       {
+         Elf_Internal_Dyn dyn;
+         asection * s;
+
+         bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
+
+         switch (dyn.d_tag)
+           {
+           default:
+             break;
+
+           case DT_PLTGOT:
+             s = elf_hash_table (info)->sgotplt;
+             goto get_vma;
+
+           case DT_JMPREL:
+             s = elf_hash_table (info)->srelplt;
+           get_vma:
+             dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
+             bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
+             break;
+
+           case DT_PLTRELSZ:
+             s = elf_hash_table (info)->srelplt;
+             dyn.d_un.d_val = s->size;
+             bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
+             break;
+           }
+       }
 
     }
 
@@ -2817,11 +2718,11 @@ _bfd_cr16_elf_finish_dynamic_sections (bfd * output_bfd,
   if (sgot->size > 0)
     {
       if (sdyn == NULL)
-        bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
+       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
       else
-        bfd_put_32 (output_bfd,
-                    sdyn->output_section->vma + sdyn->output_offset,
-                    sgot->contents);
+       bfd_put_32 (output_bfd,
+                   sdyn->output_section->vma + sdyn->output_offset,
+                   sgot->contents);
     }
 
   elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
@@ -2838,10 +2739,10 @@ _bfd_cr16_elf_finish_dynamic_sections (bfd * output_bfd,
 
 bfd_boolean
 bfd_cr16_elf32_create_embedded_relocs (bfd *abfd,
-                                       struct bfd_link_info *info,
-                                       asection *datasec,
-                                       asection *relsec,
-                                       char **errmsg)
+                                      struct bfd_link_info *info,
+                                      asection *datasec,
+                                      asection *relsec,
+                                      char **errmsg)
 {
   Elf_Internal_Shdr *symtab_hdr;
   Elf_Internal_Sym *isymbuf = NULL;
@@ -2850,7 +2751,7 @@ bfd_cr16_elf32_create_embedded_relocs (bfd *abfd,
   bfd_byte *p;
   bfd_size_type amt;
 
-  BFD_ASSERT (! info->relocatable);
+  BFD_ASSERT (! bfd_link_relocatable (info));
 
   *errmsg = NULL;
 
@@ -2861,7 +2762,7 @@ bfd_cr16_elf32_create_embedded_relocs (bfd *abfd,
 
   /* Get a copy of the native relocations.  */
   internal_relocs = (_bfd_elf_link_read_relocs
-                     (abfd, datasec, NULL, NULL, info->keep_memory));
+                    (abfd, datasec, NULL, NULL, info->keep_memory));
   if (internal_relocs == NULL)
     goto error_return;
 
@@ -2885,69 +2786,67 @@ bfd_cr16_elf32_create_embedded_relocs (bfd *abfd,
 
       /* We can only relocate absolute longword relocs at run time.  */
       if (!((ELF32_R_TYPE (irel->r_info) == (int) R_CR16_NUM32a)
-          || (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_NUM32)))
-        {
-          *errmsg = _("unsupported reloc type");
-          bfd_set_error (bfd_error_bad_value);
-          goto error_return;
-        }
+         || (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_NUM32)))
+       {
+         *errmsg = _("unsupported relocation type");
+         bfd_set_error (bfd_error_bad_value);
+         goto error_return;
+       }
 
       /* Get the target section referred to by the reloc.  */
       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
-        {
-          /* A local symbol.  */
-          Elf_Internal_Sym *isym;
-
-          /* Read this BFD's local symbols if we haven't done so already.  */
-          if (isymbuf == NULL)
-            {
-              isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
-              if (isymbuf == NULL)
-                isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
-                                                symtab_hdr->sh_info, 0,
-                                                NULL, NULL, NULL);
-              if (isymbuf == NULL)
-                goto error_return;
-            }
-
-          isym = isymbuf + ELF32_R_SYM (irel->r_info);
-          targetsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
-        }
+       {
+         /* A local symbol.  */
+         Elf_Internal_Sym *isym;
+
+         /* Read this BFD's local symbols if we haven't done so already.  */
+         if (isymbuf == NULL)
+           {
+             isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
+             if (isymbuf == NULL)
+               isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
+                                               symtab_hdr->sh_info, 0,
+                                               NULL, NULL, NULL);
+             if (isymbuf == NULL)
+               goto error_return;
+           }
+
+         isym = isymbuf + ELF32_R_SYM (irel->r_info);
+         targetsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
+       }
       else
-        {
-          unsigned long indx;
-          struct elf_link_hash_entry *h;
-
-          /* An external symbol.  */
-          indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
-          h = elf_sym_hashes (abfd)[indx];
-          BFD_ASSERT (h != NULL);
-          if (h->root.type == bfd_link_hash_defined
-              || h->root.type == bfd_link_hash_defweak)
-            targetsec = h->root.u.def.section;
-          else
-            targetsec = NULL;
-        }
+       {
+         unsigned long indx;
+         struct elf_link_hash_entry *h;
+
+         /* An external symbol.  */
+         indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
+         h = elf_sym_hashes (abfd)[indx];
+         BFD_ASSERT (h != NULL);
+         if (h->root.type == bfd_link_hash_defined
+             || h->root.type == bfd_link_hash_defweak)
+           targetsec = h->root.u.def.section;
+         else
+           targetsec = NULL;
+       }
 
       bfd_put_32 (abfd, irel->r_offset + datasec->output_offset, p);
       memset (p + 4, 0, 4);
       if ((ELF32_R_TYPE (irel->r_info) == (int) R_CR16_NUM32a)
-          && (targetsec != NULL) )
-         strncpy ((char *) p + 4, targetsec->output_section->name, 4);
+         && (targetsec != NULL) )
+        strncpy ((char *) p + 4, targetsec->output_section->name, 4);
     }
 
-  if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
+  if (symtab_hdr->contents != (unsigned char *) isymbuf)
     free (isymbuf);
-  if (internal_relocs != NULL
-      && elf_section_data (datasec)->relocs != internal_relocs)
+  if (elf_section_data (datasec)->relocs != internal_relocs)
     free (internal_relocs);
   return TRUE;
 
-error_return:
-  if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
+ error_return:
+  if (symtab_hdr->contents != (unsigned char *) isymbuf)
     free (isymbuf);
-  if (internal_relocs != NULL
-      && elf_section_data (datasec)->relocs != internal_relocs)
+  if (elf_section_data (datasec)->relocs != internal_relocs)
     free (internal_relocs);
   return FALSE;
 }
@@ -2957,7 +2856,9 @@ error_return:
    properly.  */
 
 static enum elf_reloc_type_class
-_bfd_cr16_elf_reloc_type_class (const Elf_Internal_Rela *rela)
+_bfd_cr16_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
+                               const asection *rel_sec ATTRIBUTE_UNUSED,
+                               const Elf_Internal_Rela *rela)
 {
   switch ((int) ELF32_R_TYPE (rela->r_info))
     {
@@ -2970,60 +2871,57 @@ _bfd_cr16_elf_reloc_type_class (const Elf_Internal_Rela *rela)
 }
 
 /* Definitions for setting CR16 target vector.  */
-#define TARGET_LITTLE_SYM                 bfd_elf32_cr16_vec
-#define TARGET_LITTLE_NAME                "elf32-cr16"
-#define ELF_ARCH                          bfd_arch_cr16
-#define ELF_MACHINE_CODE                  EM_CR16
-#define ELF_MACHINE_ALT1                  EM_CR16_OLD
-#define ELF_MAXPAGESIZE                   0x1
-#define elf_symbol_leading_char           '_'
-
-#define bfd_elf32_bfd_reloc_type_lookup   elf_cr16_reloc_type_lookup
-#define bfd_elf32_bfd_reloc_name_lookup   elf_cr16_reloc_name_lookup
-#define elf_info_to_howto                 elf_cr16_info_to_howto
-#define elf_info_to_howto_rel             0
-#define elf_backend_relocate_section      elf32_cr16_relocate_section
-#define bfd_elf32_bfd_relax_section       elf32_cr16_relax_section
+#define TARGET_LITTLE_SYM                cr16_elf32_vec
+#define TARGET_LITTLE_NAME               "elf32-cr16"
+#define ELF_ARCH                         bfd_arch_cr16
+#define ELF_MACHINE_CODE                 EM_CR16
+#define ELF_MACHINE_ALT1                 EM_CR16_OLD
+#define ELF_MAXPAGESIZE                          0x1
+#define elf_symbol_leading_char                  '_'
+
+#define bfd_elf32_bfd_reloc_type_lookup          elf_cr16_reloc_type_lookup
+#define bfd_elf32_bfd_reloc_name_lookup          elf_cr16_reloc_name_lookup
+#define elf_info_to_howto                elf_cr16_info_to_howto
+#define elf_info_to_howto_rel            NULL
+#define elf_backend_relocate_section     elf32_cr16_relocate_section
+#define bfd_elf32_bfd_relax_section      elf32_cr16_relax_section
 #define bfd_elf32_bfd_get_relocated_section_contents \
-                                elf32_cr16_get_relocated_section_contents
-#define elf_backend_gc_mark_hook          elf32_cr16_gc_mark_hook
-#define elf_backend_gc_sweep_hook         elf32_cr16_gc_sweep_hook
-#define elf_backend_can_gc_sections       1
-#define elf_backend_rela_normal           1
-#define elf_backend_check_relocs          cr16_elf_check_relocs
+                               elf32_cr16_get_relocated_section_contents
+#define elf_backend_gc_mark_hook         elf32_cr16_gc_mark_hook
+#define elf_backend_can_gc_sections      1
+#define elf_backend_rela_normal                  1
+#define elf_backend_check_relocs         cr16_elf_check_relocs
 /* So we can set bits in e_flags.  */
 #define elf_backend_final_write_processing \
-                                 _bfd_cr16_elf_final_write_processing
-#define elf_backend_object_p     _bfd_cr16_elf_object_p
+                                _bfd_cr16_elf_final_write_processing
+#define elf_backend_object_p    _bfd_cr16_elf_object_p
 
 #define bfd_elf32_bfd_merge_private_bfd_data \
-                                 _bfd_cr16_elf_merge_private_bfd_data
+                                _bfd_cr16_elf_merge_private_bfd_data
 
 
 #define bfd_elf32_bfd_link_hash_table_create \
-                                  elf32_cr16_link_hash_table_create
-#define bfd_elf32_bfd_link_hash_table_free \
-                                  elf32_cr16_link_hash_table_free
+                                 elf32_cr16_link_hash_table_create
 
 #define elf_backend_create_dynamic_sections \
-                                  _bfd_cr16_elf_create_dynamic_sections
+                                 _bfd_cr16_elf_create_dynamic_sections
 #define elf_backend_adjust_dynamic_symbol \
-                                  _bfd_cr16_elf_adjust_dynamic_symbol
+                                 _bfd_cr16_elf_adjust_dynamic_symbol
 #define elf_backend_size_dynamic_sections \
-                                  _bfd_cr16_elf_size_dynamic_sections
-#define elf_backend_omit_section_dynsym \
-      ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
+                                 _bfd_cr16_elf_size_dynamic_sections
+#define elf_backend_omit_section_dynsym _bfd_elf_omit_section_dynsym_all
 #define elf_backend_finish_dynamic_symbol \
-                                   _bfd_cr16_elf_finish_dynamic_symbol
+                                  _bfd_cr16_elf_finish_dynamic_symbol
 #define elf_backend_finish_dynamic_sections \
-                                   _bfd_cr16_elf_finish_dynamic_sections
+                                  _bfd_cr16_elf_finish_dynamic_sections
 
 #define elf_backend_reloc_type_class   _bfd_cr16_elf_reloc_type_class
 
 
-#define elf_backend_want_got_plt        1
-#define elf_backend_plt_readonly        1
-#define elf_backend_want_plt_sym        0
-#define elf_backend_got_header_size     12
+#define elf_backend_want_got_plt       1
+#define elf_backend_plt_readonly       1
+#define elf_backend_want_plt_sym       0
+#define elf_backend_got_header_size    12
+#define elf_backend_dtrel_excludes_plt 1
 
 #include "elf32-target.h"