Automatic date update in version.in
[deliverable/binutils-gdb.git] / bfd / elf32-bfin.c
index eb06e140961bf9da8d3a0dab9985226828ec3fb0..931041227837312e17abd4f30727d170d1fbc137 100644 (file)
@@ -1,5 +1,5 @@
 /* ADI Blackfin BFD support for 32-bit ELF.
-   Copyright (C) 2005-2016 Free Software Foundation, Inc.
+   Copyright (C) 2005-2021 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
@@ -25,6 +25,7 @@
 #include "elf/bfin.h"
 #include "dwarf2.h"
 #include "hashtab.h"
+#include "elf32-bfin.h"
 
 /* FUNCTION : bfin_pltpc_reloc
    ABSTRACT : TODO : figure out how to handle pltpc relocs.  */
@@ -45,19 +46,19 @@ bfin_pltpc_reloc (
 
 static bfd_reloc_status_type
 bfin_pcrel24_reloc (bfd *abfd,
-                    arelent *reloc_entry,
-                    asymbol *symbol,
-                    void * data,
-                    asection *input_section,
-                    bfd *output_bfd,
-                    char **error_message ATTRIBUTE_UNUSED)
+                   arelent *reloc_entry,
+                   asymbol *symbol,
+                   void * data,
+                   asection *input_section,
+                   bfd *output_bfd,
+                   char **error_message ATTRIBUTE_UNUSED)
 {
   bfd_vma relocation;
   bfd_size_type addr = reloc_entry->address;
   bfd_vma output_base = 0;
   reloc_howto_type *howto = reloc_entry->howto;
   asection *output_section;
-  bfd_boolean relocatable = (output_bfd != NULL);
+  bool relocatable = (output_bfd != NULL);
 
   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
     return bfd_reloc_outofrange;
@@ -142,19 +143,19 @@ bfin_pcrel24_reloc (bfd *abfd,
 
 static bfd_reloc_status_type
 bfin_imm16_reloc (bfd *abfd,
-                 arelent *reloc_entry,
-                 asymbol *symbol,
-                 void * data,
-                 asection *input_section,
-                 bfd *output_bfd,
-                 char **error_message ATTRIBUTE_UNUSED)
+                 arelent *reloc_entry,
+                 asymbol *symbol,
+                 void * data,
+                 asection *input_section,
+                 bfd *output_bfd,
+                 char **error_message ATTRIBUTE_UNUSED)
 {
   bfd_vma relocation, x;
   bfd_size_type reloc_addr = reloc_entry->address;
   bfd_vma output_base = 0;
   reloc_howto_type *howto = reloc_entry->howto;
   asection *output_section;
-  bfd_boolean relocatable = (output_bfd != NULL);
+  bool relocatable = (output_bfd != NULL);
 
   /* Is the address of the relocation really within the section?  */
   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
@@ -214,18 +215,18 @@ bfin_imm16_reloc (bfd *abfd,
 
 static bfd_reloc_status_type
 bfin_byte4_reloc (bfd *abfd,
-                  arelent *reloc_entry,
-                  asymbol *symbol,
-                  void * data,
-                  asection *input_section,
-                  bfd *output_bfd,
-                  char **error_message ATTRIBUTE_UNUSED)
+                 arelent *reloc_entry,
+                 asymbol *symbol,
+                 void * data,
+                 asection *input_section,
+                 bfd *output_bfd,
+                 char **error_message ATTRIBUTE_UNUSED)
 {
   bfd_vma relocation, x;
   bfd_size_type addr = reloc_entry->address;
   bfd_vma output_base = 0;
   asection *output_section;
-  bfd_boolean relocatable = (output_bfd != NULL);
+  bool relocatable = (output_bfd != NULL);
 
   /* Is the address of the relocation really within the section?  */
   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
@@ -281,18 +282,18 @@ bfin_byte4_reloc (bfd *abfd,
 static bfd_reloc_status_type
 bfin_bfd_reloc (bfd *abfd,
                arelent *reloc_entry,
-               asymbol *symbol,
-               void * data,
-               asection *input_section,
-               bfd *output_bfd,
-               char **error_message ATTRIBUTE_UNUSED)
+               asymbol *symbol,
+               void * data,
+               asection *input_section,
+               bfd *output_bfd,
+               char **error_message ATTRIBUTE_UNUSED)
 {
   bfd_vma relocation;
   bfd_size_type addr = reloc_entry->address;
   bfd_vma output_base = 0;
   reloc_howto_type *howto = reloc_entry->howto;
   asection *output_section;
-  bfd_boolean relocatable = (output_bfd != NULL);
+  bool relocatable = (output_bfd != NULL);
 
   /* Is the address of the relocation really within the section?  */
   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
@@ -329,12 +330,12 @@ bfin_bfd_reloc (bfd *abfd,
   /* Here the variable relocation holds the final address of the
      symbol we are relocating against, plus any addend.  */
 
-  if (howto->pc_relative == TRUE)
+  if (howto->pc_relative)
     {
       relocation -= input_section->output_section->vma + input_section->output_offset;
 
-      if (howto->pcrel_offset == TRUE)
-        relocation -= reloc_entry->address;
+      if (howto->pcrel_offset)
+       relocation -= reloc_entry->address;
     }
 
   if (relocatable)
@@ -348,10 +349,10 @@ bfin_bfd_reloc (bfd *abfd,
       bfd_reloc_status_type status;
 
       status = bfd_check_overflow (howto->complain_on_overflow,
-                                  howto->bitsize,
-                                  howto->rightshift,
-                                  bfd_arch_bits_per_address(abfd),
-                                  relocation);
+                                 howto->bitsize,
+                                 howto->rightshift,
+                                 bfd_arch_bits_per_address(abfd),
+                                 relocation);
       if (status != bfd_reloc_ok)
        return status;
     }
@@ -377,17 +378,17 @@ bfin_bfd_reloc (bfd *abfd,
     {
     case 0:
       {
-        char x = bfd_get_8 (abfd, (char *) data + addr);
-        DOIT (x);
-        bfd_put_8 (abfd, x, (unsigned char *) data + addr);
+       char x = bfd_get_8 (abfd, (char *) data + addr);
+       DOIT (x);
+       bfd_put_8 (abfd, x, (unsigned char *) data + addr);
       }
       break;
 
     case 1:
       {
-        unsigned short x = bfd_get_16 (abfd, (bfd_byte *) data + addr);
-        DOIT (x);
-        bfd_put_16 (abfd, (bfd_vma) x, (unsigned char *) data + addr);
+       unsigned short x = bfd_get_16 (abfd, (bfd_byte *) data + addr);
+       DOIT (x);
+       bfd_put_16 (abfd, (bfd_vma) x, (unsigned char *) data + addr);
       }
       break;
 
@@ -425,57 +426,57 @@ static reloc_howto_type bfin_howto_table [] =
         0,                     /* rightshift.  */
         3,                     /* size (0 = byte, 1 = short, 2 = long).  */
         0,                     /* bitsize.  */
-        FALSE,                 /* pc_relative.  */
+        false,                 /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_dont, /* complain_on_overflow.  */
         bfd_elf_generic_reloc, /* special_function.  */
         "R_BFIN_UNUSED0",      /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0,                     /* dst_mask.  */
-        FALSE),                /* pcrel_offset.  */
+        false),                /* pcrel_offset.  */
 
   HOWTO (R_BFIN_PCREL5M2,      /* type.  */
         1,                     /* rightshift.  */
         1,                     /* size (0 = byte, 1 = short, 2 = long)..  */
         4,                     /* bitsize.  */
-        TRUE,                  /* pc_relative.  */
+        true,                  /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_unsigned, /* complain_on_overflow.  */
         bfin_bfd_reloc,        /* special_function.  */
         "R_BFIN_PCREL5M2",     /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0x0000000F,            /* dst_mask.  */
-        FALSE),                /* pcrel_offset.  */
+        false),                /* pcrel_offset.  */
 
   HOWTO (R_BFIN_UNUSED1,       /* type.  */
         0,                     /* rightshift.  */
         3,                     /* size (0 = byte, 1 = short, 2 = long).  */
         0,                     /* bitsize.  */
-        FALSE,                 /* pc_relative.  */
+        false,                 /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_dont, /* complain_on_overflow.  */
         bfd_elf_generic_reloc, /* special_function.  */
         "R_BFIN_UNUSED1",      /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0,                     /* dst_mask.  */
-        FALSE),                /* pcrel_offset.  */
+        false),                /* pcrel_offset.  */
 
   HOWTO (R_BFIN_PCREL10,       /* type.  */
         1,                     /* rightshift.  */
         1,                     /* size (0 = byte, 1 = short, 2 = long).  */
         10,                    /* bitsize.  */
-        TRUE,                  /* pc_relative.  */
+        true,                  /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_signed, /* complain_on_overflow.  */
         bfin_bfd_reloc,        /* special_function.  */
         "R_BFIN_PCREL10",      /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0x000003FF,            /* dst_mask.  */
-        TRUE),                 /* pcrel_offset.  */
+        true),                 /* pcrel_offset.  */
 
   HOWTO (R_BFIN_PCREL12_JUMP,  /* type.  */
         1,                     /* rightshift.  */
@@ -485,289 +486,289 @@ static reloc_howto_type bfin_howto_table [] =
                                   Right shift the rightmost bit..  */
         1,                     /* size (0 = byte, 1 = short, 2 = long).  */
         12,                    /* bitsize.  */
-        TRUE,                  /* pc_relative.  */
+        true,                  /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_signed, /* complain_on_overflow.  */
         bfin_bfd_reloc,        /* special_function.  */
         "R_BFIN_PCREL12_JUMP", /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0x0FFF,                /* dst_mask.  */
-        TRUE),                 /* pcrel_offset.  */
+        true),                 /* pcrel_offset.  */
 
   HOWTO (R_BFIN_RIMM16,                /* type.  */
         0,                     /* rightshift.  */
         1,                     /* size (0 = byte, 1 = short, 2 = long).  */
         16,                    /* bitsize.  */
-        FALSE,                 /* pc_relative.  */
+        false,                 /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_signed, /* complain_on_overflow.  */
         bfin_imm16_reloc,      /* special_function.  */
         "R_BFIN_RIMM16",       /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0x0000FFFF,            /* dst_mask.  */
-        TRUE),                 /* pcrel_offset.  */
+        true),                 /* pcrel_offset.  */
 
   HOWTO (R_BFIN_LUIMM16,       /* type.  */
         0,                     /* rightshift.  */
         1,                     /* size (0 = byte, 1 = short, 2 = long).  */
         16,                    /* bitsize.  */
-        FALSE,                 /* pc_relative.  */
+        false,                 /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_dont, /* complain_on_overflow.  */
         bfin_imm16_reloc,      /* special_function.  */
         "R_BFIN_LUIMM16",      /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0x0000FFFF,            /* dst_mask.  */
-        TRUE),                 /* pcrel_offset.  */
+        true),                 /* pcrel_offset.  */
 
   HOWTO (R_BFIN_HUIMM16,       /* type.  */
         16,                    /* rightshift.  */
         1,                     /* size (0 = byte, 1 = short, 2 = long).  */
         16,                    /* bitsize.  */
-        FALSE,                 /* pc_relative.  */
+        false,                 /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_unsigned, /* complain_on_overflow.  */
         bfin_imm16_reloc,      /* special_function.  */
         "R_BFIN_HUIMM16",      /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0x0000FFFF,            /* dst_mask.  */
-        TRUE),                 /* pcrel_offset.  */
+        true),                 /* pcrel_offset.  */
 
   HOWTO (R_BFIN_PCREL12_JUMP_S,        /* type.  */
         1,                     /* rightshift.  */
         1,                     /* size (0 = byte, 1 = short, 2 = long).  */
         12,                    /* bitsize.  */
-        TRUE,                  /* pc_relative.  */
+        true,                  /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_signed, /* complain_on_overflow.  */
         bfin_bfd_reloc,        /* special_function.  */
         "R_BFIN_PCREL12_JUMP_S", /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0x00000FFF,            /* dst_mask.  */
-        TRUE),                 /* pcrel_offset.  */
+        true),                 /* pcrel_offset.  */
 
   HOWTO (R_BFIN_PCREL24_JUMP_X,        /* type.  */
-         1,                    /* rightshift.  */
-         2,                    /* size (0 = byte, 1 = short, 2 = long).  */
-         24,                   /* bitsize.  */
-         TRUE,                 /* pc_relative.  */
-         0,                    /* bitpos.  */
-         complain_overflow_signed, /* complain_on_overflow.  */
-         bfin_pcrel24_reloc,   /* special_function.  */
+        1,                     /* rightshift.  */
+        2,                     /* size (0 = byte, 1 = short, 2 = long).  */
+        24,                    /* bitsize.  */
+        true,                  /* pc_relative.  */
+        0,                     /* bitpos.  */
+        complain_overflow_signed, /* complain_on_overflow.  */
+        bfin_pcrel24_reloc,    /* special_function.  */
        "R_BFIN_PCREL24_JUMP_X", /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0x00FFFFFF,            /* dst_mask.  */
-        TRUE),                 /* pcrel_offset.  */
+        true),                 /* pcrel_offset.  */
 
   HOWTO (R_BFIN_PCREL24,       /* type.  */
         1,                     /* rightshift.  */
         2,                     /* size (0 = byte, 1 = short, 2 = long).  */
         24,                    /* bitsize.  */
-        TRUE,                  /* pc_relative.  */
+        true,                  /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_signed, /* complain_on_overflow.  */
         bfin_pcrel24_reloc,    /* special_function.  */
         "R_BFIN_PCREL24",      /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0x00FFFFFF,            /* dst_mask.  */
-        TRUE),                 /* pcrel_offset.  */
+        true),                 /* pcrel_offset.  */
 
   HOWTO (R_BFIN_UNUSEDB,       /* type.  */
         0,                     /* rightshift.  */
         3,                     /* size (0 = byte, 1 = short, 2 = long).  */
         0,                     /* bitsize.  */
-        FALSE,                 /* pc_relative.  */
+        false,                 /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_dont, /* complain_on_overflow.  */
         bfd_elf_generic_reloc, /* special_function.  */
         "R_BFIN_UNUSEDB",      /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0,                     /* dst_mask.  */
-        FALSE),                /* pcrel_offset.  */
+        false),                /* pcrel_offset.  */
 
   HOWTO (R_BFIN_UNUSEDC,       /* type.  */
         0,                     /* rightshift.  */
         3,                     /* size (0 = byte, 1 = short, 2 = long).  */
         0,                     /* bitsize.  */
-        FALSE,                 /* pc_relative.  */
+        false,                 /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_dont, /* complain_on_overflow.  */
         bfd_elf_generic_reloc, /* special_function.  */
         "R_BFIN_UNUSEDC",      /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0,                     /* dst_mask.  */
-        FALSE),                /* pcrel_offset.  */
+        false),                /* pcrel_offset.  */
 
   HOWTO (R_BFIN_PCREL24_JUMP_L,        /* type.  */
         1,                     /* rightshift.  */
         2,                     /* size (0 = byte, 1 = short, 2 = long).  */
         24,                    /* bitsize.  */
-        TRUE,                  /* pc_relative.  */
+        true,                  /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_signed, /* complain_on_overflow.  */
         bfin_pcrel24_reloc,    /* special_function.  */
         "R_BFIN_PCREL24_JUMP_L", /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0x00FFFFFF,            /* dst_mask.  */
-        TRUE),                 /* pcrel_offset.  */
+        true),                 /* pcrel_offset.  */
 
   HOWTO (R_BFIN_PCREL24_CALL_X,        /* type.  */
         1,                     /* rightshift.  */
         2,                     /* size (0 = byte, 1 = short, 2 = long).  */
         24,                    /* bitsize.  */
-        TRUE,                  /* pc_relative.  */
+        true,                  /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_signed, /* complain_on_overflow.  */
         bfin_pcrel24_reloc,    /* special_function.  */
         "R_BFIN_PCREL24_CALL_X", /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0x00FFFFFF,            /* dst_mask.  */
-        TRUE),                 /* pcrel_offset.  */
+        true),                 /* pcrel_offset.  */
 
   HOWTO (R_BFIN_VAR_EQ_SYMB,   /* type.  */
         0,                     /* rightshift.  */
         2,                     /* size (0 = byte, 1 = short, 2 = long).  */
         32,                    /* bitsize.  */
-        FALSE,                 /* pc_relative.  */
+        false,                 /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_bitfield, /* complain_on_overflow.  */
         bfin_bfd_reloc,        /* special_function.  */
         "R_BFIN_VAR_EQ_SYMB",  /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0,                     /* dst_mask.  */
-        FALSE),                /* pcrel_offset.  */
+        false),                /* pcrel_offset.  */
 
   HOWTO (R_BFIN_BYTE_DATA,     /* type.  */
         0,                     /* rightshift.  */
         0,                     /* size (0 = byte, 1 = short, 2 = long).  */
         8,                     /* bitsize.  */
-        FALSE,                 /* pc_relative.  */
+        false,                 /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_unsigned, /* complain_on_overflow.  */
         bfin_bfd_reloc,        /* special_function.  */
         "R_BFIN_BYTE_DATA",    /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0xFF,                  /* dst_mask.  */
-        TRUE),                 /* pcrel_offset.  */
+        true),                 /* pcrel_offset.  */
 
   HOWTO (R_BFIN_BYTE2_DATA,    /* type.  */
         0,                     /* rightshift.  */
         1,                     /* size (0 = byte, 1 = short, 2 = long).  */
         16,                    /* bitsize.  */
-        FALSE,                 /* pc_relative.  */
+        false,                 /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_signed, /* complain_on_overflow.  */
         bfin_bfd_reloc,        /* special_function.  */
         "R_BFIN_BYTE2_DATA",   /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0xFFFF,                /* dst_mask.  */
-        TRUE),                 /* pcrel_offset.  */
+        true),                 /* pcrel_offset.  */
 
   HOWTO (R_BFIN_BYTE4_DATA,    /* type.  */
         0,                     /* rightshift.  */
         2,                     /* size (0 = byte, 1 = short, 2 = long).  */
         32,                    /* bitsize.  */
-        FALSE,                 /* pc_relative.  */
+        false,                 /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_unsigned, /* complain_on_overflow.  */
         bfin_byte4_reloc,      /* special_function.  */
         "R_BFIN_BYTE4_DATA",   /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0xFFFFFFFF,            /* dst_mask.  */
-        TRUE),                 /* pcrel_offset.  */
+        true),                 /* pcrel_offset.  */
 
   HOWTO (R_BFIN_PCREL11,       /* type.  */
         1,                     /* rightshift.  */
         1,                     /* size (0 = byte, 1 = short, 2 = long).  */
         10,                    /* bitsize.  */
-        TRUE,                  /* pc_relative.  */
+        true,                  /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_unsigned, /* complain_on_overflow.  */
         bfin_bfd_reloc,        /* special_function.  */
         "R_BFIN_PCREL11",      /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0,                     /* src_mask.  */
         0x000003FF,            /* dst_mask.  */
-        FALSE),                /* pcrel_offset.  */
+        false),                /* pcrel_offset.  */
 
 
   /* A 18-bit signed operand with the GOT offset for the address of
      the symbol.  */
-  HOWTO (R_BFIN_GOT17M4,        /* type */
+  HOWTO (R_BFIN_GOT17M4,       /* type */
         2,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_BFIN_GOT17M4",      /* name */
-        FALSE,                 /* partial_inplace */
-        0xffff,                /* src_mask */
-        0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false,                 /* partial_inplace */
+        0xffff,                /* src_mask */
+        0xffff,                /* dst_mask */
+        false),                /* pcrel_offset */
 
   /* The upper 16 bits of the GOT offset for the address of the
      symbol.  */
-  HOWTO (R_BFIN_GOTHI,         /* type */
+  HOWTO (R_BFIN_GOTHI,         /* type */
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_BFIN_GOTHI",                /* name */
-        FALSE,                 /* partial_inplace */
-        0xffff,                        /* src_mask */
+        false,                 /* partial_inplace */
+        0xffff,                        /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* The lower 16 bits of the GOT offset for the address of the
      symbol.  */
-  HOWTO (R_BFIN_GOTLO,         /* type */
+  HOWTO (R_BFIN_GOTLO,         /* type */
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_BFIN_GOTLO",                /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* The 32-bit address of the canonical descriptor of a function.  */
   HOWTO (R_BFIN_FUNCDESC,      /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_BFIN_FUNCDESC",     /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* A 12-bit signed operand with the GOT offset for the address of
      canonical descriptor of a function.  */
@@ -775,15 +776,15 @@ static reloc_howto_type bfin_howto_table [] =
         2,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_BFIN_FUNCDESC_GOT17M4", /* name */
-        FALSE,                 /* partial_inplace */
-        0xffff,                /* src_mask */
-        0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false,                 /* partial_inplace */
+        0xffff,                /* src_mask */
+        0xffff,                /* dst_mask */
+        false),                /* pcrel_offset */
 
   /* The upper 16 bits of the GOT offset for the address of the
      canonical descriptor of a function.  */
@@ -791,15 +792,15 @@ static reloc_howto_type bfin_howto_table [] =
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_BFIN_FUNCDESC_GOTHI", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* The lower 16 bits of the GOT offset for the address of the
      canonical descriptor of a function.  */
@@ -807,30 +808,30 @@ static reloc_howto_type bfin_howto_table [] =
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_BFIN_FUNCDESC_GOTLO", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* The 32-bit address of the canonical descriptor of a function.  */
   HOWTO (R_BFIN_FUNCDESC_VALUE,        /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         64,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_BFIN_FUNCDESC_VALUE", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* A 12-bit signed operand with the GOT offset for the address of
      canonical descriptor of a function.  */
@@ -838,15 +839,15 @@ static reloc_howto_type bfin_howto_table [] =
         2,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_BFIN_FUNCDESC_GOTOFF17M4", /* name */
-        FALSE,                 /* partial_inplace */
-        0xffff,                /* src_mask */
-        0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false,                 /* partial_inplace */
+        0xffff,                /* src_mask */
+        0xffff,                /* dst_mask */
+        false),                /* pcrel_offset */
 
   /* The upper 16 bits of the GOT offset for the address of the
      canonical descriptor of a function.  */
@@ -854,15 +855,15 @@ static reloc_howto_type bfin_howto_table [] =
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_BFIN_FUNCDESC_GOTOFFHI", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* The lower 16 bits of the GOT offset for the address of the
      canonical descriptor of a function.  */
@@ -870,47 +871,47 @@ static reloc_howto_type bfin_howto_table [] =
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_BFIN_FUNCDESC_GOTOFFLO", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* A 12-bit signed operand with the GOT offset for the address of
      the symbol.  */
-  HOWTO (R_BFIN_GOTOFF17M4,     /* type */
+  HOWTO (R_BFIN_GOTOFF17M4,    /* type */
         2,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_BFIN_GOTOFF17M4",   /* name */
-        FALSE,                 /* partial_inplace */
-        0xffff,                /* src_mask */
-        0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false,                 /* partial_inplace */
+        0xffff,                /* src_mask */
+        0xffff,                /* dst_mask */
+        false),                /* pcrel_offset */
 
   /* The upper 16 bits of the GOT offset for the address of the
      symbol.  */
-  HOWTO (R_BFIN_GOTOFFHI,        /* type */
+  HOWTO (R_BFIN_GOTOFFHI,       /* type */
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_BFIN_GOTOFFHI",     /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* The lower 16 bits of the GOT offset for the address of the
      symbol.  */
@@ -918,15 +919,15 @@ static reloc_howto_type bfin_howto_table [] =
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_BFIN_GOTOFFLO",     /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 };
 
 static reloc_howto_type bfin_gnuext_howto_table [] =
@@ -935,64 +936,64 @@ static reloc_howto_type bfin_gnuext_howto_table [] =
         0,                     /* rightshift.  */
         1,                     /* size (0 = byte, 1 = short, 2 = long).  */
         16,                    /* bitsize.  */
-        FALSE,                 /* pc_relative.  */
+        false,                 /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_bitfield, /* complain_on_overflow.  */
         bfin_pltpc_reloc,      /* special_function.  */
         "R_BFIN_PLTPC",        /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0xffff,                /* src_mask.  */
         0xffff,                /* dst_mask.  */
-        FALSE),                /* pcrel_offset.  */
+        false),                /* pcrel_offset.  */
 
   HOWTO (R_BFIN_GOT,           /* type.  */
         0,                     /* rightshift.  */
         1,                     /* size (0 = byte, 1 = short, 2 = long).  */
         16,                    /* bitsize.  */
-        FALSE,                 /* pc_relative.  */
+        false,                 /* pc_relative.  */
         0,                     /* bitpos.  */
         complain_overflow_bitfield, /* complain_on_overflow.  */
         bfd_elf_generic_reloc, /* special_function.  */
         "R_BFIN_GOT",          /* name.  */
-        FALSE,                 /* partial_inplace.  */
+        false,                 /* partial_inplace.  */
         0x7fff,                /* src_mask.  */
         0x7fff,                /* dst_mask.  */
-        FALSE),                /* pcrel_offset.  */
+        false),                /* pcrel_offset.  */
 
 /* GNU extension to record C++ vtable hierarchy.  */
-  HOWTO (R_BFIN_GNU_VTINHERIT, /* type.  */
-         0,                     /* rightshift.  */
-         2,                     /* size (0 = byte, 1 = short, 2 = long).  */
-         0,                     /* bitsize.  */
-         FALSE,                 /* pc_relative.  */
-         0,                     /* bitpos.  */
-         complain_overflow_dont, /* complain_on_overflow.  */
-         NULL,                  /* special_function.  */
-         "R_BFIN_GNU_VTINHERIT", /* name.  */
-         FALSE,                 /* partial_inplace.  */
-         0,                     /* src_mask.  */
-         0,                     /* dst_mask.  */
-         FALSE),                /* pcrel_offset.  */
+  HOWTO (R_BFIN_GNU_VTINHERIT, /* type.  */
+        0,                     /* rightshift.  */
+        2,                     /* size (0 = byte, 1 = short, 2 = long).  */
+        0,                     /* bitsize.  */
+        false,                 /* pc_relative.  */
+        0,                     /* bitpos.  */
+        complain_overflow_dont, /* complain_on_overflow.  */
+        NULL,                  /* special_function.  */
+        "R_BFIN_GNU_VTINHERIT", /* name.  */
+        false,                 /* partial_inplace.  */
+        0,                     /* src_mask.  */
+        0,                     /* dst_mask.  */
+        false),                /* pcrel_offset.  */
 
 /* GNU extension to record C++ vtable member usage.  */
   HOWTO (R_BFIN_GNU_VTENTRY,   /* type.  */
-         0,                     /* rightshift.  */
-         2,                     /* size (0 = byte, 1 = short, 2 = long).  */
-         0,                     /* bitsize.  */
-         FALSE,                 /* pc_relative.  */
-         0,                    /* bitpos.  */
-         complain_overflow_dont, /* complain_on_overflow.  */
-         _bfd_elf_rel_vtable_reloc_fn, /* special_function.  */
-         "R_BFIN_GNU_VTENTRY", /* name.  */
-         FALSE,                 /* partial_inplace.  */
-         0,                     /* src_mask.  */
-         0,                     /* dst_mask.  */
-         FALSE)                 /* pcrel_offset.  */
+        0,                     /* rightshift.  */
+        2,                     /* size (0 = byte, 1 = short, 2 = long).  */
+        0,                     /* bitsize.  */
+        false,                 /* pc_relative.  */
+        0,                     /* bitpos.  */
+        complain_overflow_dont, /* complain_on_overflow.  */
+        _bfd_elf_rel_vtable_reloc_fn, /* special_function.  */
+        "R_BFIN_GNU_VTENTRY",  /* name.  */
+        false,                 /* partial_inplace.  */
+        0,                     /* src_mask.  */
+        0,                     /* dst_mask.  */
+        false)                 /* pcrel_offset.  */
 };
 
 struct bfin_reloc_map
 {
-  bfd_reloc_code_real_type     bfd_reloc_val;
+  bfd_reloc_code_real_type     bfd_reloc_val;
   unsigned int                 bfin_reloc_val;
 };
 
@@ -1040,10 +1041,10 @@ static const struct bfin_reloc_map bfin_reloc_map [] =
 };
 
 
-static void
-bfin_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
-                    arelent *cache_ptr,
-                    Elf_Internal_Rela *dst)
+static bool
+bfin_info_to_howto (bfd *abfd,
+                   arelent *cache_ptr,
+                   Elf_Internal_Rela *dst)
 {
   unsigned int r_type;
 
@@ -1056,7 +1057,15 @@ bfin_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
     cache_ptr->howto = &bfin_gnuext_howto_table [r_type - BFIN_GNUEXT_RELOC_MIN];
 
   else
-    cache_ptr->howto = (reloc_howto_type *) NULL;
+    {
+      /* xgettext:c-format */
+      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+                         abfd, r_type);
+      bfd_set_error (bfd_error_bad_value);
+      return false;
+    }
+
+  return true;
 }
 
 /* Given a BFD reloc type, return the howto.  */
@@ -1120,28 +1129,28 @@ bfin_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
 }
 
 /* Set by ld emulation if --code-in-l1.  */
-bfd_boolean elf32_bfin_code_in_l1 = 0;
+bool elf32_bfin_code_in_l1 = 0;
 
 /* Set by ld emulation if --data-in-l1.  */
-bfd_boolean elf32_bfin_data_in_l1 = 0;
+bool elf32_bfin_data_in_l1 = 0;
 
-static void
-elf32_bfin_final_write_processing (bfd *abfd,
-                                  bfd_boolean linker ATTRIBUTE_UNUSED)
+static bool
+elf32_bfin_final_write_processing (bfd *abfd)
 {
   if (elf32_bfin_code_in_l1)
     elf_elfheader (abfd)->e_flags |= EF_BFIN_CODE_IN_L1;
   if (elf32_bfin_data_in_l1)
     elf_elfheader (abfd)->e_flags |= EF_BFIN_DATA_IN_L1;
+  return _bfd_elf_final_write_processing (abfd);
 }
 
 /* Return TRUE if the name is a local label.
    bfin local labels begin with L$.  */
-static bfd_boolean
+static bool
 bfin_is_local_label_name (bfd *abfd, const char *label)
 {
   if (label[0] == 'L' && label[1] == '$' )
-    return TRUE;
+    return true;
 
   return _bfd_elf_is_local_label_name (abfd, label);
 }
@@ -1150,11 +1159,11 @@ bfin_is_local_label_name (bfd *abfd, const char *label)
    allocate space in the global offset table or procedure linkage
    table.  */
 
-static bfd_boolean
+static bool
 bfin_check_relocs (bfd * abfd,
                   struct bfd_link_info *info,
                   asection *sec,
-                   const Elf_Internal_Rela *relocs)
+                  const Elf_Internal_Rela *relocs)
 {
   bfd *dynobj;
   Elf_Internal_Shdr *symtab_hdr;
@@ -1166,7 +1175,7 @@ bfin_check_relocs (bfd * abfd,
   asection *srelgot;
 
   if (bfd_link_relocatable (info))
-    return TRUE;
+    return true;
 
   dynobj = elf_hash_table (info)->dynobj;
   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
@@ -1188,29 +1197,26 @@ bfin_check_relocs (bfd * abfd,
       else
        {
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
-
-         /* PR15323, ref flags aren't set for references in the same
-            object.  */
-         h->root.non_ir_ref = 1;
+         while (h->root.type == bfd_link_hash_indirect
+                || h->root.type == bfd_link_hash_warning)
+           h = (struct elf_link_hash_entry *)h->root.u.i.link;
        }
 
       switch (ELF32_R_TYPE (rel->r_info))
        {
        /* This relocation describes the C++ object vtable hierarchy.
-           Reconstruct it for later use during GC.  */
-        case R_BFIN_GNU_VTINHERIT:
-          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
-            return FALSE;
-          break;
-
-        /* This relocation describes which C++ vtable entries
-           are actually used.  Record for later use during GC.  */
-        case R_BFIN_GNU_VTENTRY:
-          BFD_ASSERT (h != NULL);
-          if (h != NULL
-              && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
-            return FALSE;
-          break;
+          Reconstruct it for later use during GC.  */
+       case R_BFIN_GNU_VTINHERIT:
+         if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
+           return false;
+         break;
+
+       /* This relocation describes which C++ vtable entries
+          are actually used.  Record for later use during GC.  */
+       case R_BFIN_GNU_VTENTRY:
+         if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
+           return false;
+         break;
 
        case R_BFIN_GOT:
          if (h != NULL
@@ -1223,31 +1229,12 @@ bfin_check_relocs (bfd * abfd,
              /* Create the .got section.  */
              elf_hash_table (info)->dynobj = dynobj = abfd;
              if (!_bfd_elf_create_got_section (dynobj, info))
-               return FALSE;
-           }
-
-         if (sgot == NULL)
-           {
-             sgot = bfd_get_linker_section (dynobj, ".got");
-             BFD_ASSERT (sgot != NULL);
+               return false;
            }
 
-         if (srelgot == NULL && (h != NULL || bfd_link_pic (info)))
-           {
-             srelgot = bfd_get_linker_section (dynobj, ".rela.got");
-             if (srelgot == NULL)
-               {
-                 flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
-                                   | SEC_IN_MEMORY | SEC_LINKER_CREATED
-                                   | SEC_READONLY);
-                 srelgot = bfd_make_section_anyway_with_flags (dynobj,
-                                                               ".rela.got",
-                                                               flags);
-                 if (srelgot == NULL
-                     || !bfd_set_section_alignment (dynobj, srelgot, 2))
-                   return FALSE;
-               }
-           }
+         sgot = elf_hash_table (info)->sgot;
+         srelgot = elf_hash_table (info)->srelgot;
+         BFD_ASSERT (sgot != NULL);
 
          if (h != NULL)
            {
@@ -1257,7 +1244,7 @@ bfin_check_relocs (bfd * abfd,
                  if (h->dynindx == -1 && !h->forced_local)
                    {
                      if (!bfd_elf_link_record_dynamic_symbol (info, h))
-                       return FALSE;
+                       return false;
                    }
 
                  /* Allocate space in the .got section.  */
@@ -1279,7 +1266,7 @@ bfin_check_relocs (bfd * abfd,
                  local_got_refcounts = ((bfd_signed_vma *)
                                         bfd_zalloc (abfd, size));
                  if (local_got_refcounts == NULL)
-                   return FALSE;
+                   return false;
                  elf_local_got_refcounts (abfd) = local_got_refcounts;
                }
              if (local_got_refcounts[r_symndx] == 0)
@@ -1288,8 +1275,8 @@ bfin_check_relocs (bfd * abfd,
                  if (bfd_link_pic (info))
                    {
                      /* If we are generating a shared object, we need to
-                        output a R_68K_RELATIVE reloc so that the dynamic
-                        linker can adjust this GOT entry.  */
+                        output a R_68K_RELATIVE reloc so that the dynamic
+                        linker can adjust this GOT entry.  */
                      srelgot->size += sizeof (Elf32_External_Rela);
                    }
                }
@@ -1302,7 +1289,7 @@ bfin_check_relocs (bfd * abfd,
        }
     }
 
-  return TRUE;
+  return true;
 }
 
 static enum elf_reloc_type_class
@@ -1370,7 +1357,7 @@ bfin_final_link_relocate (Elf_Internal_Rela *rel, reloc_howto_type *howto,
 
 }
 
-static bfd_boolean
+static int
 bfin_relocate_section (bfd * output_bfd,
                       struct bfd_link_info *info,
                       bfd * input_bfd,
@@ -1407,7 +1394,7 @@ bfin_relocate_section (bfd * output_bfd,
       Elf_Internal_Sym *sym;
       asection *sec;
       bfd_vma relocation = 0;
-      bfd_boolean unresolved_reloc;
+      bool unresolved_reloc;
       bfd_reloc_status_type r;
       bfd_vma address;
 
@@ -1415,25 +1402,25 @@ bfin_relocate_section (bfd * output_bfd,
       if (r_type < 0 || r_type >= 243)
        {
          bfd_set_error (bfd_error_bad_value);
-         return FALSE;
+         return false;
        }
 
       if (r_type == R_BFIN_GNU_VTENTRY
-          || r_type == R_BFIN_GNU_VTINHERIT)
+         || r_type == R_BFIN_GNU_VTINHERIT)
        continue;
 
       howto = bfin_reloc_type_lookup (input_bfd, r_type);
       if (howto == NULL)
        {
          bfd_set_error (bfd_error_bad_value);
-         return FALSE;
+         return false;
        }
       r_symndx = ELF32_R_SYM (rel->r_info);
 
       h = NULL;
       sym = NULL;
       sec = NULL;
-      unresolved_reloc = FALSE;
+      unresolved_reloc = false;
 
       if (r_symndx < symtab_hdr->sh_info)
        {
@@ -1443,7 +1430,7 @@ bfin_relocate_section (bfd * output_bfd,
        }
       else
        {
-         bfd_boolean warned, ignored;
+         bool warned, ignored;
 
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
                                   r_symndx, symtab_hdr, sym_hashes,
@@ -1480,23 +1467,20 @@ bfin_relocate_section (bfd * output_bfd,
          {
            bfd_vma off;
 
-         if (dynobj == NULL)
-           {
-             /* Create the .got section.  */
-             elf_hash_table (info)->dynobj = dynobj = output_bfd;
-             if (!_bfd_elf_create_got_section (dynobj, info))
-               return FALSE;
-           }
-
-           if (sgot == NULL)
+           if (dynobj == NULL)
              {
-               sgot = bfd_get_linker_section (dynobj, ".got");
-               BFD_ASSERT (sgot != NULL);
+               /* Create the .got section.  */
+               elf_hash_table (info)->dynobj = dynobj = output_bfd;
+               if (!_bfd_elf_create_got_section (dynobj, info))
+                 return false;
              }
 
+           sgot = elf_hash_table (info)->sgot;
+           BFD_ASSERT (sgot != NULL);
+
            if (h != NULL)
              {
-               bfd_boolean dyn;
+               bool dyn;
 
                off = h->got.offset;
                BFD_ASSERT (off != (bfd_vma) - 1);
@@ -1533,7 +1517,7 @@ bfin_relocate_section (bfd * output_bfd,
                      }
                  }
                else
-                 unresolved_reloc = FALSE;
+                 unresolved_reloc = false;
              }
            else
              {
@@ -1556,7 +1540,7 @@ bfin_relocate_section (bfd * output_bfd,
                        Elf_Internal_Rela outrel;
                        bfd_byte *loc;
 
-                       s = bfd_get_linker_section (dynobj, ".rela.got");
+                       s = elf_hash_table (info)->srelgot;
                        BFD_ASSERT (s != NULL);
 
                        outrel.r_offset = (sgot->output_section->vma
@@ -1576,8 +1560,8 @@ bfin_relocate_section (bfd * output_bfd,
 
            relocation = sgot->output_offset + off;
            rel->r_addend = 0;
-            /* bfin : preg = [preg + 17bitdiv4offset] relocation is div by 4.  */
-            relocation /= 4;
+           /* bfin : preg = [preg + 17bitdiv4offset] relocation is div by 4.  */
+           relocation /= 4;
          }
          goto do_default;
 
@@ -1591,18 +1575,20 @@ bfin_relocate_section (bfd * output_bfd,
        }
 
       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
-         because such sections are not SEC_ALLOC and thus ld.so will
-         not process them.  */
+        because such sections are not SEC_ALLOC and thus ld.so will
+        not process them.  */
       if (unresolved_reloc
          && !((input_section->flags & SEC_DEBUGGING) != 0 && h->def_dynamic)
          && _bfd_elf_section_offset (output_bfd, info, input_section,
                                      rel->r_offset) != (bfd_vma) -1)
        {
          _bfd_error_handler
-           (_("%B(%A+0x%lx): unresolvable relocation against symbol `%s'"),
-            input_bfd,
-            input_section, (long) rel->r_offset, h->root.root.string);
-         return FALSE;
+           /* xgettext:c-format */
+           (_("%pB(%pA+%#" PRIx64 "): "
+              "unresolvable relocation against symbol `%s'"),
+            input_bfd, input_section, (uint64_t) rel->r_offset,
+            h->root.root.string);
+         return false;
        }
 
       if (r != bfd_reloc_ok)
@@ -1617,9 +1603,9 @@ bfin_relocate_section (bfd * output_bfd,
                                                      symtab_hdr->sh_link,
                                                      sym->st_name);
              if (name == NULL)
-               return FALSE;
+               return false;
              if (*name == '\0')
-               name = bfd_section_name (input_bfd, sec);
+               name = bfd_section_name (sec);
            }
 
          if (r == bfd_reloc_overflow)
@@ -1629,15 +1615,16 @@ bfin_relocate_section (bfd * output_bfd,
          else
            {
              _bfd_error_handler
-               (_("%B(%A+0x%lx): reloc against `%s': error %d"),
-                input_bfd, input_section,
-                (long) rel->r_offset, name, (int) r);
-             return FALSE;
+               /* xgettext:c-format */
+               (_("%pB(%pA+%#" PRIx64 "): reloc against `%s': error %d"),
+                input_bfd, input_section, (uint64_t) rel->r_offset,
+                name, (int) r);
+             return false;
            }
        }
     }
 
-  return TRUE;
+  return true;
 }
 
 static asection *
@@ -1645,7 +1632,7 @@ bfin_gc_mark_hook (asection * sec,
                   struct bfd_link_info *info,
                   Elf_Internal_Rela * rel,
                   struct elf_link_hash_entry *h,
-                   Elf_Internal_Sym * sym)
+                  Elf_Internal_Sym * sym)
 {
   if (h != NULL)
     switch (ELF32_R_TYPE (rel->r_info))
@@ -1657,79 +1644,6 @@ bfin_gc_mark_hook (asection * sec,
 
   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
-bfin_gc_sweep_hook (bfd * abfd,
-                   struct bfd_link_info *info,
-                   asection * sec,
-                    const Elf_Internal_Rela * relocs)
-{
-  Elf_Internal_Shdr *symtab_hdr;
-  struct elf_link_hash_entry **sym_hashes;
-  bfd_signed_vma *local_got_refcounts;
-  const Elf_Internal_Rela *rel, *relend;
-  bfd *dynobj;
-  asection *sgot;
-  asection *srelgot;
-
-  dynobj = elf_hash_table (info)->dynobj;
-  if (dynobj == NULL)
-    return TRUE;
-
-  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
-  sym_hashes = elf_sym_hashes (abfd);
-  local_got_refcounts = elf_local_got_refcounts (abfd);
-
-  sgot = bfd_get_linker_section (dynobj, ".got");
-  srelgot = bfd_get_linker_section (dynobj, ".rela.got");
-
-  relend = relocs + sec->reloc_count;
-  for (rel = relocs; rel < relend; rel++)
-    {
-      unsigned long r_symndx;
-      struct elf_link_hash_entry *h;
-
-      switch (ELF32_R_TYPE (rel->r_info))
-       {
-       case R_BFIN_GOT:
-         r_symndx = ELF32_R_SYM (rel->r_info);
-         if (r_symndx >= symtab_hdr->sh_info)
-           {
-             h = sym_hashes[r_symndx - symtab_hdr->sh_info];
-             if (h->got.refcount > 0)
-               {
-                 --h->got.refcount;
-                 if (h->got.refcount == 0)
-                   {
-                     /* We don't need the .got entry any more.  */
-                     sgot->size -= 4;
-                     srelgot->size -= sizeof (Elf32_External_Rela);
-                   }
-               }
-           }
-         else if (local_got_refcounts != NULL)
-           {
-             if (local_got_refcounts[r_symndx] > 0)
-               {
-                 --local_got_refcounts[r_symndx];
-                 if (local_got_refcounts[r_symndx] == 0)
-                   {
-                     /* We don't need the .got entry any more.  */
-                     sgot->size -= 4;
-                     if (bfd_link_pic (info))
-                       srelgot->size -= sizeof (Elf32_External_Rela);
-                   }
-               }
-           }
-         break;
-       default:
-         break;
-       }
-    }
-  return TRUE;
-}
 \f
 extern const bfd_target bfin_elf32_fdpic_vec;
 #define IS_FDPIC(bfd) ((bfd)->xvec == &bfin_elf32_fdpic_vec)
@@ -1740,16 +1654,8 @@ struct bfinfdpic_elf_link_hash_table
 {
   struct elf_link_hash_table elf;
 
-  /* A pointer to the .got section.  */
-  asection *sgot;
-  /* A pointer to the .rel.got section.  */
-  asection *sgotrel;
   /* A pointer to the .rofixup section.  */
   asection *sgotfixup;
-  /* A pointer to the .plt section.  */
-  asection *splt;
-  /* A pointer to the .rel.plt section.  */
-  asection *spltrel;
   /* GOT base offset.  */
   bfd_vma got0;
   /* Location of the first non-lazy PLT entry, i.e., the number of
@@ -1765,20 +1671,21 @@ struct bfinfdpic_elf_link_hash_table
 
 /* Get the Blackfin ELF linker hash table from a link_info structure.  */
 
-#define bfinfdpic_hash_table(info) \
-  (elf_hash_table_id ((struct elf_link_hash_table *) ((info)->hash)) \
-  == BFIN_ELF_DATA ? ((struct bfinfdpic_elf_link_hash_table *) ((info)->hash)) : NULL)
+#define bfinfdpic_hash_table(p) \
+  ((is_elf_hash_table ((p)->hash)                                      \
+    && elf_hash_table_id (elf_hash_table (p)) == BFIN_ELF_DATA)                \
+   ? (struct bfinfdpic_elf_link_hash_table *) (p)->hash : NULL)
 
 #define bfinfdpic_got_section(info) \
-  (bfinfdpic_hash_table (info)->sgot)
+  (bfinfdpic_hash_table (info)->elf.sgot)
 #define bfinfdpic_gotrel_section(info) \
-  (bfinfdpic_hash_table (info)->sgotrel)
+  (bfinfdpic_hash_table (info)->elf.srelgot)
 #define bfinfdpic_gotfixup_section(info) \
   (bfinfdpic_hash_table (info)->sgotfixup)
 #define bfinfdpic_plt_section(info) \
-  (bfinfdpic_hash_table (info)->splt)
+  (bfinfdpic_hash_table (info)->elf.splt)
 #define bfinfdpic_pltrel_section(info) \
-  (bfinfdpic_hash_table (info)->spltrel)
+  (bfinfdpic_hash_table (info)->elf.srelplt)
 #define bfinfdpic_relocs_info(info) \
   (bfinfdpic_hash_table (info)->relocs_info)
 #define bfinfdpic_got_initial_offset(info) \
@@ -1825,7 +1732,7 @@ static struct bfd_link_hash_table *
 bfinfdpic_elf_link_hash_table_create (bfd *abfd)
 {
   struct bfinfdpic_elf_link_hash_table *ret;
-  bfd_size_type amt = sizeof (struct bfinfdpic_elf_link_hash_table);
+  size_t amt = sizeof (struct bfinfdpic_elf_link_hash_table);
 
   ret = bfd_zmalloc (amt);
   if (ret == NULL)
@@ -1907,7 +1814,7 @@ struct bfinfdpic_relocs_info
      for symbol+addend.  Should be implied by something like:
      (plt || fdgotoff17m4 || fdgotofflohi
       || ((fd || fdgot17m4 || fdgothilo)
-          && (symndx != -1 || BFINFDPIC_FUNCDESC_LOCAL (info, d.h))))  */
+         && (symndx != -1 || BFINFDPIC_FUNCDESC_LOCAL (info, d.h))))  */
   unsigned privfd:1;
   /* Whether a lazy PLT entry is needed for this symbol+addend.
      Should be implied by something like:
@@ -2143,7 +2050,7 @@ _bfinfdpic_osec_to_segment (bfd *output_bfd, asection *osec)
   return (p != NULL) ? p - elf_tdata (output_bfd)->phdr : -1;
 }
 
-inline static bfd_boolean
+inline static bool
 _bfinfdpic_osec_readonly_p (bfd *output_bfd, asection *osec)
 {
   unsigned seg = _bfinfdpic_osec_to_segment (output_bfd, osec);
@@ -2154,7 +2061,7 @@ _bfinfdpic_osec_readonly_p (bfd *output_bfd, asection *osec)
 /* Generate relocations for GOT entries, function descriptors, and
    code for PLT and lazy PLT entries.  */
 
-inline static bfd_boolean
+inline static bool
 _bfinfdpic_emit_got_relocs_plt_entries (struct bfinfdpic_relocs_info *entry,
                                        bfd *output_bfd,
                                        struct bfd_link_info *info,
@@ -2166,7 +2073,7 @@ _bfinfdpic_emit_got_relocs_plt_entries (struct bfinfdpic_relocs_info *entry,
   int dynindx = -1;
 
   if (entry->done)
-    return TRUE;
+    return true;
   entry->done = 1;
 
   if (entry->got_entry || entry->fdgot_entry || entry->fd_entry)
@@ -2282,7 +2189,7 @@ _bfinfdpic_emit_got_relocs_plt_entries (struct bfinfdpic_relocs_info *entry,
              idx = dynindx;
              ad = addend;
              if (ad)
-               return FALSE;
+               return false;
            }
          else
            {
@@ -2426,7 +2333,7 @@ _bfinfdpic_emit_got_relocs_plt_entries (struct bfinfdpic_relocs_info *entry,
       else if (entry->lazyplt)
        {
          if (ad)
-           return FALSE;
+           return false;
 
          fd_lazy_rel_offset = ofst;
 
@@ -2547,7 +2454,7 @@ _bfinfdpic_emit_got_relocs_plt_entries (struct bfinfdpic_relocs_info *entry,
        }
     }
 
-  return TRUE;
+  return true;
 }
 \f
 /* Relocate an Blackfin ELF section.
@@ -2580,7 +2487,7 @@ _bfinfdpic_emit_got_relocs_plt_entries (struct bfinfdpic_relocs_info *entry,
    section, which means that the addend must be adjusted
    accordingly.  */
 
-static bfd_boolean
+static int
 bfinfdpic_relocate_section (bfd * output_bfd,
                            struct bfd_link_info *info,
                            bfd * input_bfd,
@@ -2643,12 +2550,13 @@ bfinfdpic_relocate_section (bfd * output_bfd,
       if (howto == NULL)
        {
          bfd_set_error (bfd_error_bad_value);
-         return FALSE;
+         return false;
        }
 
       h      = NULL;
       sym    = NULL;
       sec    = NULL;
+      picrel = NULL;
 
       if (r_symndx < symtab_hdr->sh_info)
        {
@@ -2658,12 +2566,12 @@ bfinfdpic_relocate_section (bfd * output_bfd,
 
          name = bfd_elf_string_from_elf_section
            (input_bfd, symtab_hdr->sh_link, sym->st_name);
-         name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
+         name = name == NULL ? bfd_section_name (sec) : name;
        }
       else
        {
-         bfd_boolean warned, ignored;
-         bfd_boolean unresolved_reloc;
+         bool warned, ignored;
+         bool unresolved_reloc;
 
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
                                   r_symndx, symtab_hdr, sym_hashes,
@@ -2711,6 +2619,9 @@ bfinfdpic_relocate_section (bfd * output_bfd,
        case R_BFIN_FUNCDESC_GOTOFFLO:
        case R_BFIN_FUNCDESC:
        case R_BFIN_FUNCDESC_VALUE:
+         if ((input_section->flags & SEC_ALLOC) == 0)
+           break;
+
          if (h != NULL)
            picrel = bfinfdpic_relocs_info_for_global (bfinfdpic_relocs_info
                                                       (info), input_bfd, h,
@@ -2723,16 +2634,18 @@ bfinfdpic_relocate_section (bfd * output_bfd,
                                                      (info), input_bfd, r_symndx,
                                                      orig_addend, INSERT);
          if (! picrel)
-           return FALSE;
+           return false;
 
          if (!_bfinfdpic_emit_got_relocs_plt_entries (picrel, output_bfd, info,
                                                       osec, sym,
                                                       rel->r_addend))
            {
              _bfd_error_handler
-               (_("%B: relocation at `%A+0x%x' references symbol `%s' with nonzero addend"),
-                input_bfd, input_section, rel->r_offset, name);
-             return FALSE;
+               /* xgettext:c-format */
+               (_("%pB: relocation at `%pA+%#" PRIx64 "' "
+                  "references symbol `%s' with nonzero addend"),
+                input_bfd, input_section, (uint64_t) rel->r_offset, name);
+             return false;
 
            }
 
@@ -2748,7 +2661,7 @@ bfinfdpic_relocate_section (bfd * output_bfd,
              info->callbacks->warning
                (info, _("relocation references symbol not defined in the module"),
                 name, input_bfd, input_section, rel->r_offset);
-             return FALSE;
+             return false;
            }
          break;
        }
@@ -2814,131 +2727,130 @@ bfinfdpic_relocate_section (bfd * output_bfd,
          break;
 
        case R_BFIN_FUNCDESC:
-         {
-           int dynindx;
-           bfd_vma addend = rel->r_addend;
-
-           if (! (h && h->root.type == bfd_link_hash_undefweak
-                  && BFINFDPIC_SYM_LOCAL (info, h)))
-             {
-               /* If the symbol is dynamic and there may be dynamic
-                  symbol resolution because we are or are linked with a
-                  shared library, emit a FUNCDESC relocation such that
-                  the dynamic linker will allocate the function
-                  descriptor.  If the symbol needs a non-local function
-                  descriptor but binds locally (e.g., its visibility is
-                  protected, emit a dynamic relocation decayed to
-                  section+offset.  */
-               if (h && ! BFINFDPIC_FUNCDESC_LOCAL (info, h)
-                   && BFINFDPIC_SYM_LOCAL (info, h)
-                   && !bfd_link_pde (info))
-                 {
-                   dynindx = elf_section_data (h->root.u.def.section
-                                               ->output_section)->dynindx;
-                   addend += h->root.u.def.section->output_offset
-                     + h->root.u.def.value;
-                 }
-               else if (h && ! BFINFDPIC_FUNCDESC_LOCAL (info, h))
-                 {
-                   if (addend)
-                     {
-                       info->callbacks->warning
-                         (info, _("R_BFIN_FUNCDESC references dynamic symbol with nonzero addend"),
-                          name, input_bfd, input_section, rel->r_offset);
-                       return FALSE;
-                     }
-                   dynindx = h->dynindx;
-                 }
-               else
-                 {
-                   /* Otherwise, we know we have a private function
-                      descriptor, so reference it directly.  */
-                   BFD_ASSERT (picrel->privfd);
-                   r_type = R_BFIN_BYTE4_DATA;
-                   dynindx = elf_section_data (bfinfdpic_got_section (info)
-                                               ->output_section)->dynindx;
-                   addend = bfinfdpic_got_section (info)->output_offset
-                     + bfinfdpic_got_initial_offset (info)
-                     + picrel->fd_entry;
-                 }
-
-               /* If there is room for dynamic symbol resolution, emit
-                  the dynamic relocation.  However, if we're linking an
-                  executable at a fixed location, we won't have emitted a
-                  dynamic symbol entry for the got section, so idx will
-                  be zero, which means we can and should compute the
-                  address of the private descriptor ourselves.  */
-               if (bfd_link_pde (info)
-                   && (!h || BFINFDPIC_FUNCDESC_LOCAL (info, h)))
-                 {
-                   bfd_vma offset;
-
-                   addend += bfinfdpic_got_section (info)->output_section->vma;
-                   if ((bfd_get_section_flags (output_bfd,
-                                               input_section->output_section)
-                        & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
-                     {
-                       if (_bfinfdpic_osec_readonly_p (output_bfd,
-                                                      input_section
-                                                      ->output_section))
-                         {
-                           info->callbacks->warning
-                             (info,
-                              _("cannot emit fixups in read-only section"),
-                              name, input_bfd, input_section, rel->r_offset);
-                           return FALSE;
-                         }
+         if ((input_section->flags & SEC_ALLOC) != 0)
+           {
+             int dynindx;
+             bfd_vma addend = rel->r_addend;
 
-                       offset = _bfd_elf_section_offset
-                         (output_bfd, info,
-                          input_section, rel->r_offset);
+             if (! (h && h->root.type == bfd_link_hash_undefweak
+                    && BFINFDPIC_SYM_LOCAL (info, h)))
+               {
+                 /* If the symbol is dynamic and there may be dynamic
+                    symbol resolution because we are or are linked with a
+                    shared library, emit a FUNCDESC relocation such that
+                    the dynamic linker will allocate the function
+                    descriptor.  If the symbol needs a non-local function
+                    descriptor but binds locally (e.g., its visibility is
+                    protected, emit a dynamic relocation decayed to
+                    section+offset.  */
+                 if (h && ! BFINFDPIC_FUNCDESC_LOCAL (info, h)
+                     && BFINFDPIC_SYM_LOCAL (info, h)
+                     && !bfd_link_pde (info))
+                   {
+                     dynindx = elf_section_data (h->root.u.def.section
+                                                 ->output_section)->dynindx;
+                     addend += h->root.u.def.section->output_offset
+                       + h->root.u.def.value;
+                   }
+                 else if (h && ! BFINFDPIC_FUNCDESC_LOCAL (info, h))
+                   {
+                     if (addend)
+                       {
+                         info->callbacks->warning
+                           (info, _("R_BFIN_FUNCDESC references dynamic symbol with nonzero addend"),
+                            name, input_bfd, input_section, rel->r_offset);
+                         return false;
+                       }
+                     dynindx = h->dynindx;
+                   }
+                 else
+                   {
+                     /* Otherwise, we know we have a private function
+                        descriptor, so reference it directly.  */
+                     BFD_ASSERT (picrel->privfd);
+                     r_type = R_BFIN_BYTE4_DATA;
+                     dynindx = elf_section_data (bfinfdpic_got_section (info)
+                                                 ->output_section)->dynindx;
+                     addend = bfinfdpic_got_section (info)->output_offset
+                       + bfinfdpic_got_initial_offset (info)
+                       + picrel->fd_entry;
+                   }
 
-                       if (offset != (bfd_vma)-1)
-                         _bfinfdpic_add_rofixup (output_bfd,
-                                                 bfinfdpic_gotfixup_section
-                                                 (info),
+                 /* If there is room for dynamic symbol resolution, emit
+                    the dynamic relocation.  However, if we're linking an
+                    executable at a fixed location, we won't have emitted a
+                    dynamic symbol entry for the got section, so idx will
+                    be zero, which means we can and should compute the
+                    address of the private descriptor ourselves.  */
+                 if (bfd_link_pde (info)
+                     && (!h || BFINFDPIC_FUNCDESC_LOCAL (info, h)))
+                   {
+                     bfd_vma offset;
+
+                     addend += bfinfdpic_got_section (info)->output_section->vma;
+                     if ((bfd_section_flags (input_section->output_section)
+                          & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
+                       {
+                         if (_bfinfdpic_osec_readonly_p (output_bfd,
+                                                         input_section
+                                                         ->output_section))
+                           {
+                             info->callbacks->warning
+                               (info,
+                                _("cannot emit fixups in read-only section"),
+                                name, input_bfd, input_section, rel->r_offset);
+                             return false;
+                           }
+
+                         offset = _bfd_elf_section_offset
+                           (output_bfd, info,
+                            input_section, rel->r_offset);
+
+                         if (offset != (bfd_vma)-1)
+                           _bfinfdpic_add_rofixup (output_bfd,
+                                                   bfinfdpic_gotfixup_section
+                                                   (info),
+                                                   offset + input_section
+                                                   ->output_section->vma
+                                                   + input_section->output_offset,
+                                                   picrel);
+                       }
+                   }
+                 else if ((bfd_section_flags (input_section->output_section)
+                           & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
+                   {
+                     bfd_vma offset;
+
+                     if (_bfinfdpic_osec_readonly_p (output_bfd,
+                                                     input_section
+                                                     ->output_section))
+                       {
+                         info->callbacks->warning
+                           (info,
+                            _("cannot emit dynamic relocations in read-only section"),
+                            name, input_bfd, input_section, rel->r_offset);
+                         return false;
+                       }
+                     offset = _bfd_elf_section_offset (output_bfd, info,
+                                                       input_section, rel->r_offset);
+
+                     if (offset != (bfd_vma)-1)
+                       _bfinfdpic_add_dyn_reloc (output_bfd,
+                                                 bfinfdpic_gotrel_section (info),
                                                  offset + input_section
                                                  ->output_section->vma
                                                  + input_section->output_offset,
-                                                 picrel);
-                     }
-                 }
-               else if ((bfd_get_section_flags (output_bfd,
-                                                input_section->output_section)
-                         & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
-                 {
-                   bfd_vma offset;
-
-                   if (_bfinfdpic_osec_readonly_p (output_bfd,
-                                                  input_section
-                                                  ->output_section))
-                     {
-                       info->callbacks->warning
-                         (info,
-                          _("cannot emit dynamic relocations in read-only section"),
-                          name, input_bfd, input_section, rel->r_offset);
-                       return FALSE;
-                     }
-                   offset = _bfd_elf_section_offset (output_bfd, info,
-                                                     input_section, rel->r_offset);
-
-                   if (offset != (bfd_vma)-1)
-                     _bfinfdpic_add_dyn_reloc (output_bfd,
-                                               bfinfdpic_gotrel_section (info),
-                                               offset + input_section
-                                               ->output_section->vma
-                                               + input_section->output_offset,
-                                               r_type,
-                                               dynindx, addend, picrel);
-                 }
-               else
-                 addend += bfinfdpic_got_section (info)->output_section->vma;
-             }
+                                                 r_type,
+                                                 dynindx, addend, picrel);
+                   }
+                 else
+                   addend += bfinfdpic_got_section (info)->output_section->vma;
+               }
 
-           /* We want the addend in-place because dynamic
-              relocations are REL.  Setting relocation to it should
-              arrange for it to be installed.  */
-           relocation = addend - rel->r_addend;
+             /* We want the addend in-place because dynamic
+                relocations are REL.  Setting relocation to it should
+                arrange for it to be installed.  */
+             relocation = addend - rel->r_addend;
          }
          check_segment[0] = check_segment[1] = got_segment;
          break;
@@ -2967,7 +2879,7 @@ bfinfdpic_relocate_section (bfd * output_bfd,
                    info->callbacks->warning
                      (info, _("R_BFIN_FUNCDESC_VALUE references dynamic symbol with nonzero addend"),
                       name, input_bfd, input_section, rel->r_offset);
-                   return FALSE;
+                   return false;
                  }
                dynindx = h->dynindx;
              }
@@ -2997,8 +2909,7 @@ bfinfdpic_relocate_section (bfd * output_bfd,
                if (osec)
                  addend += osec->output_section->vma;
                if (IS_FDPIC (input_bfd)
-                   && (bfd_get_section_flags (output_bfd,
-                                              input_section->output_section)
+                   && (bfd_section_flags (input_section->output_section)
                        & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
                  {
                    if (_bfinfdpic_osec_readonly_p (output_bfd,
@@ -3009,7 +2920,7 @@ bfinfdpic_relocate_section (bfd * output_bfd,
                          (info,
                           _("cannot emit fixups in read-only section"),
                           name, input_bfd, input_section, rel->r_offset);
-                       return FALSE;
+                       return false;
                      }
                    if (!h || h->root.type != bfd_link_hash_undefweak)
                      {
@@ -3035,8 +2946,7 @@ bfinfdpic_relocate_section (bfd * output_bfd,
              }
            else
              {
-               if ((bfd_get_section_flags (output_bfd,
-                                           input_section->output_section)
+               if ((bfd_section_flags (input_section->output_section)
                     & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
                  {
                    if (_bfinfdpic_osec_readonly_p (output_bfd,
@@ -3047,7 +2957,7 @@ bfinfdpic_relocate_section (bfd * output_bfd,
                          (info,
                           _("cannot emit dynamic relocations in read-only section"),
                           name, input_bfd, input_section, rel->r_offset);
-                       return FALSE;
+                       return false;
                      }
 
                    if (offset != (bfd_vma)-1)
@@ -3114,11 +3024,11 @@ bfinfdpic_relocate_section (bfd * output_bfd,
             input file basename is crt0.o only once.  */
          if (silence_segment_error == 1)
            silence_segment_error =
-             (strlen (input_bfd->filename) == 6
-              && filename_cmp (input_bfd->filename, "crt0.o") == 0)
-             || (strlen (input_bfd->filename) > 6
-                 && filename_cmp (input_bfd->filename
-                                  + strlen (input_bfd->filename) - 7,
+             (strlen (bfd_get_filename (input_bfd)) == 6
+              && filename_cmp (bfd_get_filename (input_bfd), "crt0.o") == 0)
+             || (strlen (bfd_get_filename (input_bfd)) > 6
+                 && filename_cmp (bfd_get_filename (input_bfd)
+                                  + strlen (bfd_get_filename (input_bfd)) - 7,
                             "/crt0.o") == 0)
              ? -1 : 0;
 #endif
@@ -3134,7 +3044,7 @@ bfinfdpic_relocate_section (bfd * output_bfd,
               : _("warning: relocation references a different segment"),
               name, input_bfd, input_section, rel->r_offset);
          if (!silence_segment_error && bfd_link_pic (info))
-           return FALSE;
+           return false;
          elf_elfheader (output_bfd)->e_flags |= EF_BFIN_PIC;
        }
 
@@ -3214,7 +3124,7 @@ bfinfdpic_relocate_section (bfd * output_bfd,
 
            case bfd_reloc_undefined:
              (*info->callbacks->undefined_symbol)
-               (info, name, input_bfd, input_section, rel->r_offset, TRUE);
+               (info, name, input_bfd, input_section, rel->r_offset, true);
              break;
 
            case bfd_reloc_outofrange:
@@ -3240,124 +3150,12 @@ bfinfdpic_relocate_section (bfd * output_bfd,
        }
     }
 
-  return TRUE;
-}
-
-/* Update the relocation information for the relocations of the section
-   being removed.  */
-
-static bfd_boolean
-bfinfdpic_gc_sweep_hook (bfd *abfd,
-                        struct bfd_link_info *info,
-                        asection *sec,
-                        const Elf_Internal_Rela *relocs)
-{
-  Elf_Internal_Shdr *symtab_hdr;
-  struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
-  const Elf_Internal_Rela *rel;
-  const Elf_Internal_Rela *rel_end;
-  struct bfinfdpic_relocs_info *picrel;
-
-  BFD_ASSERT (IS_FDPIC (abfd));
-
-  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
-  sym_hashes = elf_sym_hashes (abfd);
-  sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof(Elf32_External_Sym);
-  if (!elf_bad_symtab (abfd))
-    sym_hashes_end -= symtab_hdr->sh_info;
-
-  rel_end = relocs + sec->reloc_count;
-  for (rel = relocs; rel < rel_end; rel++)
-    {
-      struct elf_link_hash_entry *h;
-      unsigned long r_symndx;
-
-      r_symndx = ELF32_R_SYM (rel->r_info);
-      if (r_symndx < symtab_hdr->sh_info)
-        h = NULL;
-      else
-        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
-
-      if (h != NULL)
-       picrel = bfinfdpic_relocs_info_for_global (bfinfdpic_relocs_info (info),
-                                                  abfd, h,
-                                                  rel->r_addend, NO_INSERT);
-      else
-       picrel = bfinfdpic_relocs_info_for_local (bfinfdpic_relocs_info
-                                                 (info), abfd, r_symndx,
-                                                 rel->r_addend, NO_INSERT);
-
-      if (!picrel)
-       return TRUE;
-
-      switch (ELF32_R_TYPE (rel->r_info))
-        {
-       case R_BFIN_PCREL24:
-       case R_BFIN_PCREL24_JUMP_L:
-         picrel->call--;
-         break;
-
-       case R_BFIN_FUNCDESC_VALUE:
-         picrel->relocsfdv--;
-         if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
-           picrel->relocs32++;
-         /* Fall through.  */
-
-       case R_BFIN_BYTE4_DATA:
-         picrel->sym--;
-         if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
-           picrel->relocs32--;
-         break;
-
-       case R_BFIN_GOT17M4:
-         picrel->got17m4--;
-         break;
-
-       case R_BFIN_GOTHI:
-       case R_BFIN_GOTLO:
-         picrel->gothilo--;
-         break;
-
-       case R_BFIN_FUNCDESC_GOT17M4:
-         picrel->fdgot17m4--;
-         break;
-
-       case R_BFIN_FUNCDESC_GOTHI:
-       case R_BFIN_FUNCDESC_GOTLO:
-         picrel->fdgothilo--;
-         break;
-
-       case R_BFIN_GOTOFF17M4:
-       case R_BFIN_GOTOFFHI:
-       case R_BFIN_GOTOFFLO:
-         picrel->gotoff--;
-         break;
-
-       case R_BFIN_FUNCDESC_GOTOFF17M4:
-         picrel->fdgoff17m4--;
-         break;
-
-       case R_BFIN_FUNCDESC_GOTOFFHI:
-       case R_BFIN_FUNCDESC_GOTOFFLO:
-         picrel->fdgoffhilo--;
-         break;
-
-       case R_BFIN_FUNCDESC:
-         picrel->fd--;
-         picrel->relocsfd--;
-         break;
-
-       default:
-         break;
-        }
-    }
-
-  return TRUE;
+  return true;
 }
 
 /* We need dynamic symbols for every section, since segments can
    relocate independently.  */
-static bfd_boolean
+static bool
 _bfinfdpic_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
                                    struct bfd_link_info *info ATTRIBUTE_UNUSED,
                                    asection *p)
@@ -3369,12 +3167,12 @@ _bfinfdpic_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
       /* If sh_type is yet undecided, assume it could be
         SHT_PROGBITS/SHT_NOBITS.  */
     case SHT_NULL:
-      return FALSE;
+      return false;
 
       /* There shouldn't be section relative relocations
         against any other section.  */
     default:
-      return TRUE;
+      return true;
     }
 }
 
@@ -3382,7 +3180,7 @@ _bfinfdpic_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
    is almost entirely copied from
    elflink.c:_bfd_elf_create_got_section().  */
 
-static bfd_boolean
+static bool
 _bfin_create_got_section (bfd *abfd, struct bfd_link_info *info)
 {
   flagword flags, pltflags;
@@ -3392,9 +3190,9 @@ _bfin_create_got_section (bfd *abfd, struct bfd_link_info *info)
   int ptralign;
 
   /* This function may be called more than once.  */
-  s = bfd_get_linker_section (abfd, ".got");
+  s = elf_hash_table (info)->sgot;
   if (s != NULL)
-    return TRUE;
+    return true;
 
   /* Machine specific: although pointers are 32-bits wide, we want the
      GOT to be aligned to a 64-bit boundary, such that function
@@ -3407,17 +3205,10 @@ _bfin_create_got_section (bfd *abfd, struct bfd_link_info *info)
   pltflags = flags;
 
   s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
+  elf_hash_table (info)->sgot = s;
   if (s == NULL
-      || !bfd_set_section_alignment (abfd, s, ptralign))
-    return FALSE;
-
-  if (bed->want_got_plt)
-    {
-      s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
-      if (s == NULL
-         || !bfd_set_section_alignment (abfd, s, ptralign))
-       return FALSE;
-    }
+      || !bfd_set_section_alignment (s, ptralign))
+    return false;
 
   if (bed->want_got_sym)
     {
@@ -3428,12 +3219,12 @@ _bfin_create_got_section (bfd *abfd, struct bfd_link_info *info)
       h = _bfd_elf_define_linkage_sym (abfd, info, s, "__GLOBAL_OFFSET_TABLE_");
       elf_hash_table (info)->hgot = h;
       if (h == NULL)
-       return FALSE;
+       return false;
 
       /* Machine-specific: we want the symbol for executables as
         well.  */
       if (! bfd_elf_link_record_dynamic_symbol (info, h))
-       return FALSE;
+       return false;
     }
 
   /* The first bit of the global offset table is the header.  */
@@ -3443,19 +3234,18 @@ _bfin_create_got_section (bfd *abfd, struct bfd_link_info *info)
      data for the got.  */
   if (IS_FDPIC (abfd))
     {
-      bfinfdpic_got_section (info) = s;
       bfinfdpic_relocs_info (info) = htab_try_create (1,
                                                      bfinfdpic_relocs_info_hash,
                                                      bfinfdpic_relocs_info_eq,
                                                      (htab_del) NULL);
       if (! bfinfdpic_relocs_info (info))
-       return FALSE;
+       return false;
 
       s = bfd_make_section_anyway_with_flags (abfd, ".rel.got",
                                              (flags | SEC_READONLY));
       if (s == NULL
-         || ! bfd_set_section_alignment (abfd, s, 2))
-       return FALSE;
+         || !bfd_set_section_alignment (s, 2))
+       return false;
 
       bfinfdpic_gotrel_section (info) = s;
 
@@ -3463,8 +3253,8 @@ _bfin_create_got_section (bfd *abfd, struct bfd_link_info *info)
       s = bfd_make_section_anyway_with_flags (abfd, ".rofixup",
                                              (flags | SEC_READONLY));
       if (s == NULL
-         || ! bfd_set_section_alignment (abfd, s, 2))
-       return FALSE;
+         || !bfd_set_section_alignment (s, 2))
+       return false;
 
       bfinfdpic_gotfixup_section (info) = s;
     }
@@ -3477,8 +3267,8 @@ _bfin_create_got_section (bfd *abfd, struct bfd_link_info *info)
 
   s = bfd_make_section_anyway_with_flags (abfd, ".plt", pltflags);
   if (s == NULL
-      || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
-    return FALSE;
+      || !bfd_set_section_alignment (s, bed->plt_alignment))
+    return false;
   /* Blackfin-specific: remember it.  */
   bfinfdpic_plt_section (info) = s;
 
@@ -3490,33 +3280,33 @@ _bfin_create_got_section (bfd *abfd, struct bfd_link_info *info)
 
       if (! (_bfd_generic_link_add_one_symbol
             (info, abfd, "__PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s, 0, NULL,
-             FALSE, get_elf_backend_data (abfd)->collect, &bh)))
-       return FALSE;
+             false, get_elf_backend_data (abfd)->collect, &bh)))
+       return false;
       h = (struct elf_link_hash_entry *) bh;
       h->def_regular = 1;
       h->type = STT_OBJECT;
 
       if (! bfd_link_executable (info)
          && ! bfd_elf_link_record_dynamic_symbol (info, h))
-       return FALSE;
+       return false;
     }
 
   /* Blackfin-specific: we want rel relocations for the plt.  */
   s = bfd_make_section_anyway_with_flags (abfd, ".rel.plt",
                                          flags | SEC_READONLY);
   if (s == NULL
-      || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
-    return FALSE;
+      || !bfd_set_section_alignment (s, bed->s->log_file_align))
+    return false;
   /* Blackfin-specific: remember it.  */
   bfinfdpic_pltrel_section (info) = s;
 
-  return TRUE;
+  return true;
 }
 
 /* Make sure the got and plt sections exist, and that our pointers in
    the link hash table point to them.  */
 
-static bfd_boolean
+static bool
 elf32_bfinfdpic_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
 {
   /* This is mostly copied from
@@ -3533,7 +3323,7 @@ elf32_bfinfdpic_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
 
   /* Blackfin-specific: we want to create the GOT in the Blackfin way.  */
   if (! _bfin_create_got_section (abfd, info))
-    return FALSE;
+    return false;
 
   /* Blackfin-specific: make sure we created everything we wanted.  */
   BFD_ASSERT (bfinfdpic_got_section (info) && bfinfdpic_gotrel_section (info)
@@ -3552,7 +3342,7 @@ elf32_bfinfdpic_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
       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
@@ -3571,12 +3361,12 @@ elf32_bfinfdpic_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
                                                  ".rela.bss",
                                                  flags | SEC_READONLY);
          if (s == NULL
-             || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
-           return FALSE;
+             || !bfd_set_section_alignment (s, bed->s->log_file_align))
+           return false;
        }
     }
 
-  return TRUE;
+  return true;
 }
 
 /* Compute the total GOT size required by each symbol in each range.
@@ -3644,7 +3434,7 @@ _bfinfdpic_count_nontls_entries (struct bfinfdpic_relocs_info *entry,
 static void
 _bfinfdpic_count_relocs_fixups (struct bfinfdpic_relocs_info *entry,
                                struct _bfinfdpic_dynamic_got_info *dinfo,
-                               bfd_boolean subtract)
+                               bool subtract)
 {
   bfd_vma relocs = 0, fixups = 0;
 
@@ -3697,7 +3487,7 @@ _bfinfdpic_count_got_plt_entries (void **entryp, void *dinfo_)
 
   _bfinfdpic_count_nontls_entries (entry, dinfo);
 
-  _bfinfdpic_count_relocs_fixups (entry, dinfo, FALSE);
+  _bfinfdpic_count_relocs_fixups (entry, dinfo, false);
 
   return 1;
 }
@@ -4070,7 +3860,7 @@ _bfinfdpic_resolve_final_relocs_info (void **entryp, void *p)
    section and the rofixup section.  Assign locations for GOT and PLT
    entries.  */
 
-static bfd_boolean
+static bool
 _bfinfdpic_size_got_plt (bfd *output_bfd,
                         struct _bfinfdpic_dynamic_got_plt_info *gpinfop)
 {
@@ -4136,7 +3926,7 @@ _bfinfdpic_size_got_plt (bfd *output_bfd,
        (bfd_byte *) bfd_zalloc (dynobj,
                                 bfinfdpic_got_section (info)->size);
       if (bfinfdpic_got_section (info)->contents == NULL)
-       return FALSE;
+       return false;
     }
 
   if (elf_hash_table (info)->dynamic_sections_created)
@@ -4155,7 +3945,7 @@ _bfinfdpic_size_got_plt (bfd *output_bfd,
        (bfd_byte *) bfd_zalloc (dynobj,
                                 bfinfdpic_gotrel_section (info)->size);
       if (bfinfdpic_gotrel_section (info)->contents == NULL)
-       return FALSE;
+       return false;
     }
 
   bfinfdpic_gotfixup_section (info)->size = (gpinfop->g.fixups + 1) * 4;
@@ -4167,7 +3957,7 @@ _bfinfdpic_size_got_plt (bfd *output_bfd,
        (bfd_byte *) bfd_zalloc (dynobj,
                                 bfinfdpic_gotfixup_section (info)->size);
       if (bfinfdpic_gotfixup_section (info)->contents == NULL)
-       return FALSE;
+       return false;
     }
 
   if (elf_hash_table (info)->dynamic_sections_created)
@@ -4181,7 +3971,7 @@ _bfinfdpic_size_got_plt (bfd *output_bfd,
        (bfd_byte *) bfd_zalloc (dynobj,
                                 bfinfdpic_pltrel_section (info)->size);
       if (bfinfdpic_pltrel_section (info)->contents == NULL)
-       return FALSE;
+       return false;
     }
 
   /* Add 4 bytes for every block of at most 65535 lazy PLT entries,
@@ -4226,15 +4016,15 @@ _bfinfdpic_size_got_plt (bfd *output_bfd,
        (bfd_byte *) bfd_zalloc (dynobj,
                                 bfinfdpic_plt_section (info)->size);
       if (bfinfdpic_plt_section (info)->contents == NULL)
-       return FALSE;
+       return false;
     }
 
-  return TRUE;
+  return true;
 }
 
 /* Set the sizes of the dynamic sections.  */
 
-static bfd_boolean
+static bool
 elf32_bfinfdpic_size_dynamic_sections (bfd *output_bfd,
                                      struct bfd_link_info *info)
 {
@@ -4280,27 +4070,7 @@ elf32_bfinfdpic_size_dynamic_sections (bfd *output_bfd,
   bfinfdpic_dynamic_got_plt_info (info) = bfd_alloc (dynobj, sizeof (gpinfo.g));
 
   if (!_bfinfdpic_size_got_plt (output_bfd, &gpinfo))
-      return FALSE;
-
-  if (elf_hash_table (info)->dynamic_sections_created)
-    {
-      if (bfinfdpic_got_section (info)->size)
-       if (!_bfd_elf_add_dynamic_entry (info, DT_PLTGOT, 0))
-         return FALSE;
-
-      if (bfinfdpic_pltrel_section (info)->size)
-       if (!_bfd_elf_add_dynamic_entry (info, DT_PLTRELSZ, 0)
-           || !_bfd_elf_add_dynamic_entry (info, DT_PLTREL, DT_REL)
-           || !_bfd_elf_add_dynamic_entry (info, DT_JMPREL, 0))
-         return FALSE;
-
-      if (bfinfdpic_gotrel_section (info)->size)
-       if (!_bfd_elf_add_dynamic_entry (info, DT_REL, 0)
-           || !_bfd_elf_add_dynamic_entry (info, DT_RELSZ, 0)
-           || !_bfd_elf_add_dynamic_entry (info, DT_RELENT,
-                                           sizeof (Elf32_External_Rel)))
-         return FALSE;
-    }
+      return false;
 
   s = bfd_get_linker_section (dynobj, ".dynbss");
   if (s && s->size == 0)
@@ -4310,27 +4080,27 @@ elf32_bfinfdpic_size_dynamic_sections (bfd *output_bfd,
   if (s && s->size == 0)
     s->flags |= SEC_EXCLUDE;
 
-  return TRUE;
+  return _bfd_elf_add_dynamic_tags (output_bfd, info, true);
 }
 
-static bfd_boolean
+static bool
 elf32_bfinfdpic_always_size_sections (bfd *output_bfd,
                                     struct bfd_link_info *info)
 {
   if (!bfd_link_relocatable (info)
       && !bfd_elf_stack_segment_size (output_bfd, info,
                                      "__stacksize", DEFAULT_STACK_SIZE))
-    return FALSE;
+    return false;
 
-  return TRUE;
+  return true;
 }
 
 /* Check whether any of the relocations was optimized away, and
    subtract it from the relocation or fixup count.  */
-static bfd_boolean
+static bool
 _bfinfdpic_check_discarded_relocs (bfd *abfd, asection *sec,
                                   struct bfd_link_info *info,
-                                  bfd_boolean *changed)
+                                  bool *changed)
 {
   Elf_Internal_Shdr *symtab_hdr;
   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
@@ -4338,7 +4108,7 @@ _bfinfdpic_check_discarded_relocs (bfd *abfd, asection *sec,
 
   if ((sec->flags & SEC_RELOC) == 0
       || sec->reloc_count == 0)
-    return TRUE;
+    return true;
 
   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   sym_hashes = elf_sym_hashes (abfd);
@@ -4386,28 +4156,28 @@ _bfinfdpic_check_discarded_relocs (bfd *abfd, asection *sec,
                                                 rel->r_addend, NO_INSERT);
 
       if (! picrel)
-       return FALSE;
+       return false;
 
-      *changed = TRUE;
+      *changed = true;
       dinfo = bfinfdpic_dynamic_got_plt_info (info);
 
-      _bfinfdpic_count_relocs_fixups (picrel, dinfo, TRUE);
+      _bfinfdpic_count_relocs_fixups (picrel, dinfo, true);
       if (ELF32_R_TYPE (rel->r_info) == R_BFIN_BYTE4_DATA)
        picrel->relocs32--;
       else /* we know (ELF32_R_TYPE (rel->r_info) == R_BFIN_FUNCDESC) */
        picrel->relocsfd--;
-      _bfinfdpic_count_relocs_fixups (picrel, dinfo, FALSE);
+      _bfinfdpic_count_relocs_fixups (picrel, dinfo, false);
     }
 
-  return TRUE;
+  return true;
 }
 
-static bfd_boolean
+static bool
 bfinfdpic_elf_discard_info (bfd *ibfd,
                           struct elf_reloc_cookie *cookie ATTRIBUTE_UNUSED,
                           struct bfd_link_info *info)
 {
-  bfd_boolean changed = FALSE;
+  bool changed = false;
   asection *s;
   bfd *obfd = NULL;
 
@@ -4416,7 +4186,7 @@ bfinfdpic_elf_discard_info (bfd *ibfd,
     if (s->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
       {
        if (!_bfinfdpic_check_discarded_relocs (ibfd, s, info, &changed))
-         return FALSE;
+         return false;
        obfd = s->output_section->owner;
       }
 
@@ -4434,13 +4204,13 @@ bfinfdpic_elf_discard_info (bfd *ibfd,
                     NULL);
 
       if (!_bfinfdpic_size_got_plt (obfd, &gpinfo))
-       return FALSE;
+       return false;
     }
 
-  return TRUE;
+  return true;
 }
 
-static bfd_boolean
+static bool
 elf32_bfinfdpic_finish_dynamic_sections (bfd *output_bfd,
                                        struct bfd_link_info *info)
 {
@@ -4476,7 +4246,7 @@ elf32_bfinfdpic_finish_dynamic_sections (bfd *output_bfd,
            {
              _bfd_error_handler
                ("LINKER BUG: .rofixup section size mismatch");
-             return FALSE;
+             return false;
            }
        }
     }
@@ -4532,13 +4302,13 @@ elf32_bfinfdpic_finish_dynamic_sections (bfd *output_bfd,
        }
     }
 
-  return TRUE;
+  return true;
 }
 
 /* Adjust a symbol defined by a dynamic object and referenced by a
    regular object.  */
 
-static bfd_boolean
+static bool
 elf32_bfinfdpic_adjust_dynamic_symbol (struct bfd_link_info *info,
                                       struct elf_link_hash_entry *h)
 {
@@ -4548,7 +4318,7 @@ elf32_bfinfdpic_adjust_dynamic_symbol (struct bfd_link_info *info,
 
   /* Make sure we know what is going on here.  */
   BFD_ASSERT (dynobj != NULL
-             && (h->u.weakdef != NULL
+             && (h->is_weakalias
                  || (h->def_dynamic
                      && h->ref_regular
                      && !h->def_regular)));
@@ -4556,40 +4326,40 @@ elf32_bfinfdpic_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;
+  return true;
 }
 
 /* Perform any actions needed for dynamic symbols.  */
 
-static bfd_boolean
+static bool
 elf32_bfinfdpic_finish_dynamic_symbol
 (bfd *output_bfd ATTRIBUTE_UNUSED,
  struct bfd_link_info *info ATTRIBUTE_UNUSED,
  struct elf_link_hash_entry *h ATTRIBUTE_UNUSED,
  Elf_Internal_Sym *sym ATTRIBUTE_UNUSED)
 {
-  return TRUE;
+  return true;
 }
 
 /* Decide whether to attempt to turn absptr or lsda encodings in
    shared libraries into pcrel within the given input section.  */
 
-static bfd_boolean
+static bool
 bfinfdpic_elf_use_relative_eh_frame
 (bfd *input_bfd ATTRIBUTE_UNUSED,
  struct bfd_link_info *info ATTRIBUTE_UNUSED,
  asection *eh_frame_section ATTRIBUTE_UNUSED)
 {
   /* We can't use PC-relative encodings in FDPIC binaries, in general.  */
-  return FALSE;
+  return false;
 }
 
 /* Adjust the contents of an eh_frame_hdr section before they're output.  */
@@ -4729,7 +4499,7 @@ bfinfdpic_elf_encode_eh_address (bfd *abfd,
    PLT entry should be faster), or taking hints from the compiler.
    Given infinite time and money... :-)  */
 
-static bfd_boolean
+static bool
 bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info,
                        asection *sec, const Elf_Internal_Rela *relocs)
 {
@@ -4741,7 +4511,7 @@ bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info,
   struct bfinfdpic_relocs_info *picrel;
 
   if (bfd_link_relocatable (info))
-    return TRUE;
+    return true;
 
   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   sym_hashes = elf_sym_hashes (abfd);
@@ -4755,9 +4525,14 @@ bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info,
 
       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];
+       {
+         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+         while (h->root.type == bfd_link_hash_indirect
+                || h->root.type == bfd_link_hash_warning)
+           h = (struct elf_link_hash_entry *) h->root.u.i.link;
+       }
 
       switch (ELF32_R_TYPE (rel->r_info))
        {
@@ -4785,7 +4560,7 @@ bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info,
            {
              elf_hash_table (info)->dynobj = dynobj = abfd;
              if (! _bfin_create_got_section (abfd, info))
-               return FALSE;
+               return false;
            }
          if (! IS_FDPIC (abfd))
            {
@@ -4814,7 +4589,7 @@ bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info,
                                                     (info), abfd, r_symndx,
                                                     rel->r_addend, INSERT);
          if (! picrel)
-           return FALSE;
+           return false;
          break;
 
        default:
@@ -4823,7 +4598,7 @@ bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info,
        }
 
       switch (ELF32_R_TYPE (rel->r_info))
-        {
+       {
        case R_BFIN_PCREL24:
        case R_BFIN_PCREL24_JUMP_L:
          if (IS_FDPIC (abfd))
@@ -4832,7 +4607,7 @@ bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info,
 
        case R_BFIN_FUNCDESC_VALUE:
          picrel->relocsfdv++;
-         if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
+         if (bfd_section_flags (sec) & SEC_ALLOC)
            picrel->relocs32--;
          /* Fall through.  */
 
@@ -4841,7 +4616,7 @@ bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info,
            break;
 
          picrel->sym++;
-         if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
+         if (bfd_section_flags (sec) & SEC_ALLOC)
            picrel->relocs32++;
          break;
 
@@ -4883,21 +4658,21 @@ bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info,
          picrel->relocsfd++;
          break;
 
-        /* This relocation describes the C++ object vtable hierarchy.
-           Reconstruct it for later use during GC.  */
-        case R_BFIN_GNU_VTINHERIT:
-          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
-            return FALSE;
-          break;
-
-        /* This relocation describes which C++ vtable entries are actually
-           used.  Record for later use during GC.  */
-        case R_BFIN_GNU_VTENTRY:
-          BFD_ASSERT (h != NULL);
-          if (h != NULL
-              && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
-            return FALSE;
-          break;
+       /* This relocation describes the C++ object vtable hierarchy.
+          Reconstruct it for later use during GC.  */
+       case R_BFIN_GNU_VTINHERIT:
+         if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
+           return false;
+         break;
+
+       /* This relocation describes which C++ vtable entries are actually
+          used.  Record for later use during GC.  */
+       case R_BFIN_GNU_VTENTRY:
+         BFD_ASSERT (h != NULL);
+         if (h != NULL
+             && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
+           return false;
+         break;
 
        case R_BFIN_HUIMM16:
        case R_BFIN_LUIMM16:
@@ -4908,18 +4683,19 @@ bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info,
        default:
        bad_reloc:
          _bfd_error_handler
-           (_("%B: unsupported relocation type %i"),
-            abfd, ELF32_R_TYPE (rel->r_info));
-         return FALSE;
-        }
+           /* xgettext:c-format */
+           (_("%pB: unsupported relocation type %#x"),
+            abfd, (int) ELF32_R_TYPE (rel->r_info));
+         return false;
+       }
     }
 
-  return TRUE;
+  return true;
 }
 
 /* Set the right machine number for a Blackfin ELF file.  */
 
-static bfd_boolean
+static bool
 elf32_bfin_object_p (bfd *abfd)
 {
   bfd_default_set_arch_mach (abfd, bfd_arch_bfin, 0);
@@ -4927,16 +4703,16 @@ elf32_bfin_object_p (bfd *abfd)
          == (IS_FDPIC (abfd)));
 }
 
-static bfd_boolean
+static bool
 elf32_bfin_set_private_flags (bfd * abfd, flagword flags)
 {
   elf_elfheader (abfd)->e_flags = flags;
-  elf_flags_init (abfd) = TRUE;
-  return TRUE;
+  elf_flags_init (abfd) = true;
+  return true;
 }
 
 /* Display the flags field.  */
-static bfd_boolean
+static bool
 elf32_bfin_print_private_bfd_data (bfd * abfd, void * ptr)
 {
   FILE *file = (FILE *) ptr;
@@ -4960,18 +4736,22 @@ elf32_bfin_print_private_bfd_data (bfd * abfd, void * ptr)
 
   fputc ('\n', file);
 
-  return TRUE;
+  return true;
 }
 
 /* Merge backend specific data from an object file to the output
    object file when linking.  */
 
-static bfd_boolean
+static bool
 elf32_bfin_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
 {
   bfd *obfd = info->output_bfd;
   flagword old_flags, new_flags;
-  bfd_boolean error = FALSE;
+  bool error = false;
+
+  /* FIXME: What should be checked when linking shared libraries?  */
+  if ((ibfd->flags & DYNAMIC) != 0)
+    return true;
 
   new_flags = elf_elfheader (ibfd)->e_flags;
   old_flags = elf_elfheader (obfd)->e_flags;
@@ -4983,27 +4763,26 @@ elf32_bfin_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
   if (0)
 #endif
   _bfd_error_handler
-    ("old_flags = 0x%.8lx, new_flags = 0x%.8lx, init = %s, filename = %s",
-     old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no",
-     bfd_get_filename (ibfd));
+    ("old_flags = 0x%.8x, new_flags = 0x%.8x, init = %s, filename = %pB",
+     old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no", ibfd);
 
   if (!elf_flags_init (obfd))                  /* First call, no flags set.  */
     {
-      elf_flags_init (obfd) = TRUE;
+      elf_flags_init (obfd) = true;
       elf_elfheader (obfd)->e_flags = new_flags;
     }
 
   if (((new_flags & EF_BFIN_FDPIC) == 0) != (! IS_FDPIC (obfd)))
     {
-      error = TRUE;
+      error = true;
       if (IS_FDPIC (obfd))
        _bfd_error_handler
-         (_("%s: cannot link non-fdpic object file into fdpic executable"),
-          bfd_get_filename (ibfd));
+         (_("%pB: cannot link non-fdpic object file into fdpic executable"),
+          ibfd);
       else
        _bfd_error_handler
-         (_("%s: cannot link fdpic object file into non-fdpic executable"),
-          bfd_get_filename (ibfd));
+         (_("%pB: cannot link fdpic object file into non-fdpic executable"),
+          ibfd);
     }
 
   if (error)
@@ -5022,16 +4801,6 @@ struct bfin_link_hash_entry
   struct bfin_pcrel_relocs_copied *pcrel_relocs_copied;
 };
 
-/* bfin ELF linker hash table.  */
-
-struct bfin_link_hash_table
-{
-  struct elf_link_hash_table root;
-
-  /* Small local sym cache.  */
-  struct sym_cache sym_cache;
-};
-
 #define bfin_hash_entry(ent) ((struct bfin_link_hash_entry *) (ent))
 
 static struct bfd_hash_entry *
@@ -5060,15 +4829,14 @@ bfin_link_hash_newfunc (struct bfd_hash_entry *entry,
 static struct bfd_link_hash_table *
 bfin_link_hash_table_create (bfd * abfd)
 {
-  struct bfin_link_hash_table *ret;
-  bfd_size_type amt = sizeof (struct bfin_link_hash_table);
+  struct elf_link_hash_table *ret;
+  size_t amt = sizeof (struct elf_link_hash_table);
 
   ret = bfd_zmalloc (amt);
   if (ret == NULL)
     return NULL;
 
-  if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
-                                     bfin_link_hash_newfunc,
+  if (!_bfd_elf_link_hash_table_init (ret, abfd, bfin_link_hash_newfunc,
                                      sizeof (struct elf_link_hash_entry),
                                      BFIN_ELF_DATA))
     {
@@ -5076,16 +4844,14 @@ bfin_link_hash_table_create (bfd * abfd)
       return NULL;
     }
 
-  ret->sym_cache.abfd = NULL;
-
-  return &ret->root.root;
+  return &ret->root;
 }
 
 /* The size in bytes of an entry in the procedure linkage table.  */
 
 /* Finish up the dynamic sections.  */
 
-static bfd_boolean
+static bool
 bfin_finish_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
                              struct bfd_link_info *info)
 {
@@ -5113,22 +4879,18 @@ bfin_finish_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
        }
 
     }
-  return TRUE;
+  return true;
 }
 
 /* Finish up dynamic symbol handling.  We set the contents of various
    dynamic sections here.  */
 
-static bfd_boolean
+static bool
 bfin_finish_dynamic_symbol (bfd * output_bfd,
                            struct bfd_link_info *info,
                            struct elf_link_hash_entry *h,
                            Elf_Internal_Sym * sym)
 {
-  bfd *dynobj;
-
-  dynobj = elf_hash_table (info)->dynobj;
-
   if (h->got.offset != (bfd_vma) - 1)
     {
       asection *sgot;
@@ -5137,10 +4899,10 @@ bfin_finish_dynamic_symbol (bfd * output_bfd,
       bfd_byte *loc;
 
       /* This symbol has an entry in the global offset table.
-         Set it up.  */
+        Set it up.  */
 
-      sgot = bfd_get_linker_section (dynobj, ".got");
-      srela = bfd_get_linker_section (dynobj, ".rela.got");
+      sgot = elf_hash_table (info)->sgot;
+      srela = elf_hash_table (info)->srelgot;
       BFD_ASSERT (sgot != NULL && srela != NULL);
 
       rela.r_offset = (sgot->output_section->vma
@@ -5148,10 +4910,10 @@ bfin_finish_dynamic_symbol (bfd * output_bfd,
                       + (h->got.offset & ~(bfd_vma) 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.  */
+        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_pic (info)
          && (info->symbolic
              || h->dynindx == -1 || h->forced_local) && h->def_regular)
@@ -5187,7 +4949,7 @@ bfin_finish_dynamic_symbol (bfd * output_bfd,
       || h == elf_hash_table (info)->hgot)
     sym->st_shndx = SHN_ABS;
 
-  return TRUE;
+  return true;
 }
 
 /* Adjust a symbol defined by a dynamic object and referenced by a
@@ -5196,7 +4958,7 @@ bfin_finish_dynamic_symbol (bfd * output_bfd,
    change the definition to something the rest of the link can
    understand.  */
 
-static bfd_boolean
+static bool
 bfin_adjust_dynamic_symbol (struct bfd_link_info *info,
                            struct elf_link_hash_entry *h)
 {
@@ -5209,7 +4971,7 @@ bfin_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->is_weakalias
                  || (h->def_dynamic && h->ref_regular && !h->def_regular)));
 
   /* If this is a function, put it in the procedure linkage table.  We
@@ -5223,13 +4985,13 @@ bfin_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;
-      return TRUE;
+      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;
     }
 
   /* This is a reference to a symbol defined by a dynamic object which
@@ -5240,7 +5002,7 @@ bfin_adjust_dynamic_symbol (struct bfd_link_info *info,
      For such cases we need not do anything here; the relocations will
      be handled correctly by relocate_section.  */
   if (bfd_link_pic (info))
-    return TRUE;
+    return true;
 
   /* We must allocate the symbol in our .dynbss section, which will
      become part of the .bss section of the executable.  There will be
@@ -5273,7 +5035,7 @@ bfin_adjust_dynamic_symbol (struct bfd_link_info *info,
   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
     {
       _bfd_error_handler (_("the bfin target does not currently support the generation of copy relocations"));
-      return FALSE;
+      return false;
     }
 #endif
   /* We need to figure out the alignment required for this symbol.  I
@@ -5284,10 +5046,10 @@ bfin_adjust_dynamic_symbol (struct bfd_link_info *info,
 
   /* Apply the required alignment.  */
   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
-  if (power_of_two > bfd_get_section_alignment (dynobj, s))
+  if (power_of_two > bfd_section_alignment (s))
     {
-      if (!bfd_set_section_alignment (dynobj, s, power_of_two))
-       return FALSE;
+      if (!bfd_set_section_alignment (s, power_of_two))
+       return false;
     }
 
   /* Define the symbol as being at this point in the section.  */
@@ -5297,7 +5059,7 @@ bfin_adjust_dynamic_symbol (struct bfd_link_info *info,
   /* Increment the section size to make room for the symbol.  */
   s->size += h->size;
 
-  return TRUE;
+  return true;
 }
 
 /* The bfin linker needs to keep track of the number of relocs that it
@@ -5332,7 +5094,7 @@ struct bfin_pcrel_relocs_copied
    against a readonly section, and set the DF_TEXTREL flag in this
    case.  */
 
-static bfd_boolean
+static bool
 bfin_discard_copies (struct elf_link_hash_entry *h, void * inf)
 {
   struct bfd_link_info *info = (struct bfd_link_info *) inf;
@@ -5352,23 +5114,23 @@ bfin_discard_copies (struct elf_link_hash_entry *h, void * inf)
              }
        }
 
-      return TRUE;
+      return true;
     }
 
   for (s = bfin_hash_entry (h)->pcrel_relocs_copied;
        s != NULL; s = s->next)
     s->section->size -= s->count * sizeof (Elf32_External_Rela);
 
-  return TRUE;
+  return true;
 }
 
-static bfd_boolean
+static bool
 bfin_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
                            struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *s;
-  bfd_boolean relocs;
+  bool relocs;
 
   dynobj = elf_hash_table (info)->dynobj;
   BFD_ASSERT (dynobj != NULL);
@@ -5376,7 +5138,7 @@ bfin_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
   if (elf_hash_table (info)->dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
-      if (bfd_link_executable (info))
+      if (bfd_link_executable (info) && !info->nointerp)
        {
          s = bfd_get_linker_section (dynobj, ".interp");
          BFD_ASSERT (s != NULL);
@@ -5387,11 +5149,11 @@ bfin_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
   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_linker_section (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;
     }
@@ -5409,46 +5171,46 @@ bfin_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
   /* The check_relocs and adjust_dynamic_symbol entry points have
      determined the sizes of the various dynamic sections.  Allocate
      memory for them.  */
-  relocs = FALSE;
+  relocs = false;
   for (s = dynobj->sections; s != NULL; s = s->next)
     {
       const char *name;
-      bfd_boolean strip;
+      bool strip;
 
       if ((s->flags & SEC_LINKER_CREATED) == 0)
        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);
 
-      strip = FALSE;
+      strip = false;
 
-       if (CONST_STRNEQ (name, ".rela"))
+       if (startswith (name, ".rela"))
        {
          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.  */
-             strip = TRUE;
+                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.  */
+             strip = true;
            }
          else
            {
-             relocs = TRUE;
+             relocs = true;
 
              /* We use the reloc_count field as a counter if we need
-                to copy relocs into the output file.  */
+                to copy relocs into the output file.  */
              s->reloc_count = 0;
            }
        }
-      else if (! CONST_STRNEQ (name, ".got"))
+      else if (! startswith (name, ".got"))
        {
          /* It's not one of our sections, so don't allocate space.  */
          continue;
@@ -5462,29 +5224,29 @@ bfin_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
 
       /* Allocate memory for the section contents.  */
       /* FIXME: This should be a call to bfd_alloc not bfd_zalloc.
-         Unused entries should be reclaimed before the section's contents
-         are written out, but at the moment this does not happen.  Thus in
-         order to prevent writing out garbage, we initialise the section's
-         contents to zero.  */
+        Unused entries should be reclaimed before the section's contents
+        are written out, but at the moment this does not happen.  Thus in
+        order to prevent writing out garbage, we initialise the section's
+        contents to zero.  */
       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
       if (s->contents == NULL && s->size != 0)
-       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 bfin_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.  */
+        values later, in bfin_finish_dynamic_sections, but we
+        must add the entries now so that we get the correct size for
+        the .dynamic section.  The DT_DEBUG entry is filled in by the
+        dynamic linker and used by the debugger.  */
 #define add_dynamic_entry(TAG, VAL) \
   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
 
       if (!bfd_link_pic (info))
        {
          if (!add_dynamic_entry (DT_DEBUG, 0))
-           return FALSE;
+           return false;
        }
 
 
@@ -5494,18 +5256,18 @@ bfin_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
              || !add_dynamic_entry (DT_RELASZ, 0)
              || !add_dynamic_entry (DT_RELAENT,
                                     sizeof (Elf32_External_Rela)))
-           return FALSE;
+           return false;
        }
 
       if ((info->flags & DF_TEXTREL) != 0)
        {
          if (!add_dynamic_entry (DT_TEXTREL, 0))
-           return FALSE;
+           return false;
        }
     }
 #undef add_dynamic_entry
 
-  return TRUE;
+  return true;
 }
 \f
 /* Given a .data section and a .emreloc in-memory section, store
@@ -5515,7 +5277,7 @@ bfin_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
    after the add_symbols entry point has been called for all the
    objects, and before the final_link entry point is called.  */
 
-bfd_boolean
+bool
 bfd_bfin_elf32_create_embedded_relocs (bfd *abfd,
                                       struct bfd_link_info *info,
                                       asection *datasec,
@@ -5534,7 +5296,7 @@ bfd_bfin_elf32_create_embedded_relocs (bfd *abfd,
   *errmsg = NULL;
 
   if (datasec->reloc_count == 0)
-    return TRUE;
+    return true;
 
   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
 
@@ -5566,7 +5328,7 @@ bfd_bfin_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_BFIN_BYTE4_DATA)
        {
-         *errmsg = _("unsupported reloc type");
+         *errmsg = _("unsupported relocation type");
          bfd_set_error (bfd_error_bad_value);
          goto error_return;
        }
@@ -5614,27 +5376,25 @@ bfd_bfin_elf32_create_embedded_relocs (bfd *abfd,
        strncpy ((char *) p + 4, targetsec->output_section->name, 8);
     }
 
-  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;
+  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;
+  return false;
 }
 
 struct bfd_elf_special_section const elf32_bfin_special_sections[] =
 {
   { ".l1.text",                8, -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
   { ".l1.data",                8, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
-  { NULL,              0,  0, 0,            0 }
+  { NULL,              0,  0, 0,            0 }
 };
 
 \f
@@ -5650,43 +5410,38 @@ struct bfd_elf_special_section const elf32_bfin_special_sections[] =
 #define bfd_elf32_bfd_reloc_name_lookup \
                                        bfin_bfd_reloc_name_lookup
 #define elf_info_to_howto              bfin_info_to_howto
-#define elf_info_to_howto_rel          0
+#define elf_info_to_howto_rel          NULL
 #define elf_backend_object_p           elf32_bfin_object_p
 
 #define bfd_elf32_bfd_is_local_label_name \
-                                        bfin_is_local_label_name
-#define bfin_hash_table(p) \
-  ((struct bfin_link_hash_table *) (p)->hash)
-
-
+                                       bfin_is_local_label_name
 
 #define elf_backend_create_dynamic_sections \
-                                        _bfd_elf_create_dynamic_sections
+                                       _bfd_elf_create_dynamic_sections
 #define bfd_elf32_bfd_link_hash_table_create \
-                                        bfin_link_hash_table_create
-#define bfd_elf32_bfd_final_link        bfd_elf_gc_common_final_link
+                                       bfin_link_hash_table_create
+#define bfd_elf32_bfd_final_link       bfd_elf_gc_common_final_link
 
-#define elf_backend_check_relocs        bfin_check_relocs
+#define elf_backend_check_relocs       bfin_check_relocs
 #define elf_backend_adjust_dynamic_symbol \
-                                        bfin_adjust_dynamic_symbol
+                                       bfin_adjust_dynamic_symbol
 #define elf_backend_size_dynamic_sections \
-                                        bfin_size_dynamic_sections
-#define elf_backend_relocate_section    bfin_relocate_section
+                                       bfin_size_dynamic_sections
+#define elf_backend_relocate_section   bfin_relocate_section
 #define elf_backend_finish_dynamic_symbol \
-                                        bfin_finish_dynamic_symbol
+                                       bfin_finish_dynamic_symbol
 #define elf_backend_finish_dynamic_sections \
-                                        bfin_finish_dynamic_sections
-#define elf_backend_gc_mark_hook        bfin_gc_mark_hook
-#define elf_backend_gc_sweep_hook       bfin_gc_sweep_hook
+                                       bfin_finish_dynamic_sections
+#define elf_backend_gc_mark_hook       bfin_gc_mark_hook
 #define bfd_elf32_bfd_merge_private_bfd_data \
-                                        elf32_bfin_merge_private_bfd_data
+                                       elf32_bfin_merge_private_bfd_data
 #define bfd_elf32_bfd_set_private_flags \
-                                        elf32_bfin_set_private_flags
+                                       elf32_bfin_set_private_flags
 #define bfd_elf32_bfd_print_private_bfd_data \
-                                        elf32_bfin_print_private_bfd_data
+                                       elf32_bfin_print_private_bfd_data
 #define elf_backend_final_write_processing \
-                                        elf32_bfin_final_write_processing
-#define elf_backend_reloc_type_class    elf32_bfin_reloc_type_class
+                                       elf32_bfin_final_write_processing
+#define elf_backend_reloc_type_class   elf32_bfin_reloc_type_class
 #define elf_backend_stack_align                8
 #define elf_backend_can_gc_sections 1
 #define elf_backend_special_sections   elf32_bfin_special_sections
@@ -5694,28 +5449,25 @@ struct bfd_elf_special_section const elf32_bfin_special_sections[] =
 #define elf_backend_want_got_plt 0
 #define elf_backend_plt_readonly 1
 #define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size     12
-#define elf_backend_rela_normal         1
+#define elf_backend_got_header_size    12
+#define elf_backend_rela_normal                1
 
 #include "elf32-target.h"
 
 #undef TARGET_LITTLE_SYM
-#define TARGET_LITTLE_SYM          bfin_elf32_fdpic_vec
+#define TARGET_LITTLE_SYM              bfin_elf32_fdpic_vec
 #undef TARGET_LITTLE_NAME
 #define TARGET_LITTLE_NAME             "elf32-bfinfdpic"
 #undef elf32_bed
-#define        elf32_bed               elf32_bfinfdpic_bed
-
-#undef elf_backend_gc_sweep_hook
-#define elf_backend_gc_sweep_hook       bfinfdpic_gc_sweep_hook
+#define        elf32_bed                       elf32_bfinfdpic_bed
 
 #undef elf_backend_got_header_size
-#define elf_backend_got_header_size     0
+#define elf_backend_got_header_size    0
 
 #undef elf_backend_relocate_section
-#define elf_backend_relocate_section    bfinfdpic_relocate_section
+#define elf_backend_relocate_section   bfinfdpic_relocate_section
 #undef elf_backend_check_relocs
-#define elf_backend_check_relocs        bfinfdpic_check_relocs
+#define elf_backend_check_relocs       bfinfdpic_check_relocs
 
 #undef bfd_elf32_bfd_link_hash_table_create
 #define bfd_elf32_bfd_link_hash_table_create \
@@ -5754,12 +5506,12 @@ struct bfd_elf_special_section const elf32_bfin_special_sections[] =
                bfinfdpic_elf_encode_eh_address
 
 #undef elf_backend_may_use_rel_p
-#define elf_backend_may_use_rel_p       1
+#define elf_backend_may_use_rel_p      1
 #undef elf_backend_may_use_rela_p
-#define elf_backend_may_use_rela_p      1
+#define elf_backend_may_use_rela_p     1
 /* We use REL for dynamic relocations only.  */
 #undef elf_backend_default_use_rela_p
-#define elf_backend_default_use_rela_p  1
+#define elf_backend_default_use_rela_p 1
 
 #undef elf_backend_omit_section_dynsym
 #define elf_backend_omit_section_dynsym _bfinfdpic_link_omit_section_dynsym
This page took 0.075291 seconds and 4 git commands to generate.