PR21441, Unnecessary padding of .eh_frame section
[deliverable/binutils-gdb.git] / bfd / elf32-sh.c
index f92cdff3e201d0350f59c6952a4583568ecffaea..8f9157998548ae2690f2bdae4d86f7aa09ca8350 100644 (file)
@@ -1,5 +1,5 @@
 /* Renesas / SuperH SH specific support for 32-bit ELF
 /* Renesas / SuperH SH specific support for 32-bit ELF
-   Copyright (C) 1996-2015 Free Software Foundation, Inc.
+   Copyright (C) 1996-2017 Free Software Foundation, Inc.
    Contributed by Ian Lance Taylor, Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
    Contributed by Ian Lance Taylor, Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -487,8 +487,9 @@ sh_elf_info_to_howto (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
       || (r >= R_SH_FIRST_INVALID_RELOC_5 && r <= R_SH_LAST_INVALID_RELOC_5)
       || (r >= R_SH_FIRST_INVALID_RELOC_6 && r <= R_SH_LAST_INVALID_RELOC_6))
     {
       || (r >= R_SH_FIRST_INVALID_RELOC_5 && r <= R_SH_LAST_INVALID_RELOC_5)
       || (r >= R_SH_FIRST_INVALID_RELOC_6 && r <= R_SH_LAST_INVALID_RELOC_6))
     {
-      (*_bfd_error_handler) (_("%A: unrecognised SH reloc number: %d"),
-                            abfd, r);
+      /* xgettext:c-format */
+      _bfd_error_handler (_("%B: unrecognised SH reloc number: %d"),
+                         abfd, r);
       bfd_set_error (bfd_error_bad_value);
       r = R_SH_NONE;
     }
       bfd_set_error (bfd_error_bad_value);
       r = R_SH_NONE;
     }
@@ -519,7 +520,7 @@ sh_elf_relax_section (bfd *abfd, asection *sec,
 
   *again = FALSE;
 
 
   *again = FALSE;
 
-  if (link_info->relocatable
+  if (bfd_link_relocatable (link_info)
       || (sec->flags & SEC_RELOC) == 0
       || sec->reloc_count == 0)
     return TRUE;
       || (sec->flags & SEC_RELOC) == 0
       || sec->reloc_count == 0)
     return TRUE;
@@ -575,9 +576,9 @@ sh_elf_relax_section (bfd *abfd, asection *sec,
       laddr = irel->r_offset + 4 + irel->r_addend;
       if (laddr >= sec->size)
        {
       laddr = irel->r_offset + 4 + irel->r_addend;
       if (laddr >= sec->size)
        {
-         (*_bfd_error_handler) (_("%B: 0x%lx: warning: bad R_SH_USES offset"),
-                                abfd,
-                                (unsigned long) irel->r_offset);
+         /* xgettext:c-format */
+         _bfd_error_handler (_("%B: %#Lx: warning: bad R_SH_USES offset"),
+                             abfd, irel->r_offset);
          continue;
        }
       insn = bfd_get_16 (abfd, contents + laddr);
          continue;
        }
       insn = bfd_get_16 (abfd, contents + laddr);
@@ -586,9 +587,10 @@ sh_elf_relax_section (bfd *abfd, asection *sec,
         do.  */
       if ((insn & 0xf000) != 0xd000)
        {
         do.  */
       if ((insn & 0xf000) != 0xd000)
        {
-         ((*_bfd_error_handler)
-          (_("%B: 0x%lx: warning: R_SH_USES points to unrecognized insn 0x%x"),
-           abfd, (unsigned long) irel->r_offset, insn));
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%B: %#Lx: warning: R_SH_USES points to unrecognized insn 0x%x"),
+            abfd, irel->r_offset, insn);
          continue;
        }
 
          continue;
        }
 
@@ -603,9 +605,10 @@ sh_elf_relax_section (bfd *abfd, asection *sec,
       paddr += (laddr + 4) &~ (bfd_vma) 3;
       if (paddr >= sec->size)
        {
       paddr += (laddr + 4) &~ (bfd_vma) 3;
       if (paddr >= sec->size)
        {
-         ((*_bfd_error_handler)
-          (_("%B: 0x%lx: warning: bad R_SH_USES load offset"),
-           abfd, (unsigned long) irel->r_offset));
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%B: %#Lx: warning: bad R_SH_USES load offset"),
+            abfd, irel->r_offset);
          continue;
        }
 
          continue;
        }
 
@@ -618,9 +621,10 @@ sh_elf_relax_section (bfd *abfd, asection *sec,
          break;
       if (irelfn >= irelend)
        {
          break;
       if (irelfn >= irelend)
        {
-         ((*_bfd_error_handler)
-          (_("%B: 0x%lx: warning: could not find expected reloc"),
-           abfd, (unsigned long) paddr));
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%B: %#Lx: warning: could not find expected reloc"),
+            abfd, paddr);
          continue;
        }
 
          continue;
        }
 
@@ -646,9 +650,10 @@ sh_elf_relax_section (bfd *abfd, asection *sec,
          if (isym->st_shndx
              != (unsigned int) _bfd_elf_section_from_bfd_section (abfd, sec))
            {
          if (isym->st_shndx
              != (unsigned int) _bfd_elf_section_from_bfd_section (abfd, sec))
            {
-             ((*_bfd_error_handler)
-              (_("%B: 0x%lx: warning: symbol in unexpected section"),
-               abfd, (unsigned long) paddr));
+             _bfd_error_handler
+               /* xgettext:c-format */
+               (_("%B: %#Lx: warning: symbol in unexpected section"),
+                abfd, paddr);
              continue;
            }
 
              continue;
            }
 
@@ -775,9 +780,10 @@ sh_elf_relax_section (bfd *abfd, asection *sec,
       /* Now check whether we got a COUNT reloc.  */
       if (irelcount >= irelend)
        {
       /* Now check whether we got a COUNT reloc.  */
       if (irelcount >= irelend)
        {
-         ((*_bfd_error_handler)
-          (_("%B: 0x%lx: warning: could not find expected COUNT reloc"),
-           abfd, (unsigned long) paddr));
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%B: %#Lx: warning: could not find expected COUNT reloc"),
+            abfd, paddr);
          continue;
        }
 
          continue;
        }
 
@@ -785,9 +791,9 @@ sh_elf_relax_section (bfd *abfd, asection *sec,
         just deleted one.  */
       if (irelcount->r_addend == 0)
        {
         just deleted one.  */
       if (irelcount->r_addend == 0)
        {
-         ((*_bfd_error_handler) (_("%B: 0x%lx: warning: bad count"),
-                                 abfd,
-                                 (unsigned long) paddr));
+         /* xgettext:c-format */
+         _bfd_error_handler (_("%B: %#Lx: warning: bad count"),
+                             abfd, paddr);
          continue;
        }
 
          continue;
        }
 
@@ -907,7 +913,7 @@ sh_elf_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr,
 
   contents = elf_section_data (sec)->this_hdr.contents;
 
 
   contents = elf_section_data (sec)->this_hdr.contents;
 
-  /* The deletion must stop at the next ALIGN reloc for an aligment
+  /* The deletion must stop at the next ALIGN reloc for an alignment
      power larger than the number of bytes we are deleting.  */
 
   irelalign = NULL;
      power larger than the number of bytes we are deleting.  */
 
   irelalign = NULL;
@@ -1188,9 +1194,10 @@ sh_elf_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr,
 
          if (overflow)
            {
 
          if (overflow)
            {
-             ((*_bfd_error_handler)
-              (_("%B: 0x%lx: fatal: reloc overflow while relaxing"),
-               abfd, (unsigned long) irel->r_offset));
+             _bfd_error_handler
+               /* xgettext:c-format */
+               (_("%B: %#Lx: fatal: reloc overflow while relaxing"),
+                abfd, irel->r_offset);
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
            }
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
            }
@@ -1558,9 +1565,10 @@ sh_elf_swap_insns (bfd *abfd, asection *sec, void *relocs,
 
          if (overflow)
            {
 
          if (overflow)
            {
-             ((*_bfd_error_handler)
-              (_("%B: 0x%lx: fatal: reloc overflow while relaxing"),
-               abfd, (unsigned long) irel->r_offset));
+             _bfd_error_handler
+               /* xgettext:c-format */
+               (_("%B: %#Lx: fatal: reloc overflow while relaxing"),
+                abfd, irel->r_offset);
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
            }
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
            }
@@ -2467,11 +2475,6 @@ struct elf_sh_link_hash_table
   struct elf_link_hash_table root;
 
   /* Short-cuts to get to dynamic linker sections.  */
   struct elf_link_hash_table root;
 
   /* Short-cuts to get to dynamic linker sections.  */
-  asection *sgot;
-  asection *sgotplt;
-  asection *srelgot;
-  asection *splt;
-  asection *srelplt;
   asection *sdynbss;
   asection *srelbss;
   asection *sfuncdesc;
   asection *sdynbss;
   asection *srelbss;
   asection *sfuncdesc;
@@ -2623,12 +2626,6 @@ create_got_section (bfd *dynobj, struct bfd_link_info *info)
   if (htab == NULL)
     return FALSE;
 
   if (htab == NULL)
     return FALSE;
 
-  htab->sgot = bfd_get_linker_section (dynobj, ".got");
-  htab->sgotplt = bfd_get_linker_section (dynobj, ".got.plt");
-  htab->srelgot = bfd_get_linker_section (dynobj, ".rela.got");
-  if (! htab->sgot || ! htab->sgotplt || ! htab->srelgot)
-    abort ();
-
   htab->sfuncdesc = bfd_make_section_anyway_with_flags (dynobj, ".got.funcdesc",
                                                        (SEC_ALLOC | SEC_LOAD
                                                         | SEC_HAS_CONTENTS
   htab->sfuncdesc = bfd_make_section_anyway_with_flags (dynobj, ".got.funcdesc",
                                                        (SEC_ALLOC | SEC_LOAD
                                                         | SEC_HAS_CONTENTS
@@ -2710,7 +2707,7 @@ sh_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
     pltflags |= SEC_READONLY;
 
   s = bfd_make_section_anyway_with_flags (abfd, ".plt", pltflags);
     pltflags |= SEC_READONLY;
 
   s = bfd_make_section_anyway_with_flags (abfd, ".plt", pltflags);
-  htab->splt = s;
+  htab->root.splt = s;
   if (s == NULL
       || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
     return FALSE;
   if (s == NULL
       || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
     return FALSE;
@@ -2733,7 +2730,7 @@ sh_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
       h->type = STT_OBJECT;
       htab->root.hplt = h;
 
       h->type = STT_OBJECT;
       htab->root.hplt = h;
 
-      if (info->shared
+      if (bfd_link_pic (info)
          && ! bfd_elf_link_record_dynamic_symbol (info, h))
        return FALSE;
     }
          && ! bfd_elf_link_record_dynamic_symbol (info, h))
        return FALSE;
     }
@@ -2742,12 +2739,12 @@ sh_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
                                          bed->default_use_rela_p
                                          ? ".rela.plt" : ".rel.plt",
                                          flags | SEC_READONLY);
                                          bed->default_use_rela_p
                                          ? ".rela.plt" : ".rel.plt",
                                          flags | SEC_READONLY);
-  htab->srelplt = s;
+  htab->root.srelplt = s;
   if (s == NULL
       || ! bfd_set_section_alignment (abfd, s, ptralign))
     return FALSE;
 
   if (s == NULL
       || ! bfd_set_section_alignment (abfd, s, ptralign))
     return FALSE;
 
-  if (htab->sgot == NULL
+  if (htab->root.sgot == NULL
       && !create_got_section (abfd, info))
     return FALSE;
 
       && !create_got_section (abfd, info))
     return FALSE;
 
@@ -2776,7 +2773,7 @@ sh_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
         be needed, we can discard it later.  We will never need this
         section when generating a shared object, since they do not use
         copy relocs.  */
         be needed, we can discard it later.  We will never need this
         section when generating a shared object, since they do not use
         copy relocs.  */
-      if (! info->shared)
+      if (! bfd_link_pic (info))
        {
          s = bfd_make_section_anyway_with_flags (abfd,
                                                  (bed->default_use_rela_p
        {
          s = bfd_make_section_anyway_with_flags (abfd,
                                                  (bed->default_use_rela_p
@@ -2871,7 +2868,7 @@ sh_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
      only references to the symbol are via the global offset table.
      For such cases we need not do anything here; the relocations will
      be handled correctly by relocate_section.  */
      only references to the symbol are via the global offset table.
      For such cases we need not do anything here; the relocations will
      be handled correctly by relocate_section.  */
-  if (info->shared)
+  if (bfd_link_pic (info))
     return TRUE;
 
   /* If there are no references to this symbol that do not use the
     return TRUE;
 
   /* If there are no references to this symbol that do not use the
@@ -2978,10 +2975,10 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
            return FALSE;
        }
 
            return FALSE;
        }
 
-      if (info->shared
+      if (bfd_link_pic (info)
          || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
        {
          || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
        {
-         asection *s = htab->splt;
+         asection *s = htab->root.splt;
          const struct elf_sh_plt_info *plt_info;
 
          /* If this is the first .plt entry, make room for the special
          const struct elf_sh_plt_info *plt_info;
 
          /* If this is the first .plt entry, make room for the special
@@ -2998,7 +2995,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
             the shared library.  Skip this for FDPIC, since the
             function's address will be the address of the canonical
             function descriptor.  */
             the shared library.  Skip this for FDPIC, since the
             function's address will be the address of the canonical
             function descriptor.  */
-         if (!htab->fdpic_p && !info->shared && !h->def_regular)
+         if (!htab->fdpic_p && !bfd_link_pic (info) && !h->def_regular)
            {
              h->root.u.def.section = s;
              h->root.u.def.value = h->plt.offset;
            {
              h->root.u.def.section = s;
              h->root.u.def.value = h->plt.offset;
@@ -3014,14 +3011,14 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
          /* We also need to make an entry in the .got.plt section, which
             will be placed in the .got section by the linker script.  */
          if (!htab->fdpic_p)
          /* We also need to make an entry in the .got.plt section, which
             will be placed in the .got section by the linker script.  */
          if (!htab->fdpic_p)
-           htab->sgotplt->size += 4;
+           htab->root.sgotplt->size += 4;
          else
          else
-           htab->sgotplt->size += 8;
+           htab->root.sgotplt->size += 8;
 
          /* We also need to make an entry in the .rel.plt section.  */
 
          /* We also need to make an entry in the .rel.plt section.  */
-         htab->srelplt->size += sizeof (Elf32_External_Rela);
+         htab->root.srelplt->size += sizeof (Elf32_External_Rela);
 
 
-         if (htab->vxworks_p && !info->shared)
+         if (htab->vxworks_p && !bfd_link_pic (info))
            {
              /* VxWorks executables have a second set of relocations
                 for each PLT entry.  They go in a separate relocation
            {
              /* VxWorks executables have a second set of relocations
                 for each PLT entry.  They go in a separate relocation
@@ -3065,7 +3062,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
            return FALSE;
        }
 
            return FALSE;
        }
 
-      s = htab->sgot;
+      s = htab->root.sgot;
       h->got.offset = s->size;
       s->size += 4;
       /* R_SH_TLS_GD needs 2 consecutive GOT slots.  */
       h->got.offset = s->size;
       s->size += 4;
       /* R_SH_TLS_GD needs 2 consecutive GOT slots.  */
@@ -3075,34 +3072,38 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
       if (!dyn)
        {
          /* No dynamic relocations required.  */
       if (!dyn)
        {
          /* No dynamic relocations required.  */
-         if (htab->fdpic_p && !info->shared
+         if (htab->fdpic_p && !bfd_link_pic (info)
              && h->root.type != bfd_link_hash_undefweak
              && (got_type == GOT_NORMAL || got_type == GOT_FUNCDESC))
            htab->srofixup->size += 4;
        }
       /* No dynamic relocations required when IE->LE conversion happens.  */
              && h->root.type != bfd_link_hash_undefweak
              && (got_type == GOT_NORMAL || got_type == GOT_FUNCDESC))
            htab->srofixup->size += 4;
        }
       /* No dynamic relocations required when IE->LE conversion happens.  */
-      else if (got_type == GOT_TLS_IE && !h->def_dynamic && !info->shared)
+      else if (got_type == GOT_TLS_IE
+              && !h->def_dynamic
+              && !bfd_link_pic (info))
        ;
       /* R_SH_TLS_IE_32 needs one dynamic relocation if dynamic,
         R_SH_TLS_GD needs one if local symbol and two if global.  */
       else if ((got_type == GOT_TLS_GD && h->dynindx == -1)
               || got_type == GOT_TLS_IE)
        ;
       /* R_SH_TLS_IE_32 needs one dynamic relocation if dynamic,
         R_SH_TLS_GD needs one if local symbol and two if global.  */
       else if ((got_type == GOT_TLS_GD && h->dynindx == -1)
               || got_type == GOT_TLS_IE)
-       htab->srelgot->size += sizeof (Elf32_External_Rela);
+       htab->root.srelgot->size += sizeof (Elf32_External_Rela);
       else if (got_type == GOT_TLS_GD)
       else if (got_type == GOT_TLS_GD)
-       htab->srelgot->size += 2 * sizeof (Elf32_External_Rela);
+       htab->root.srelgot->size += 2 * sizeof (Elf32_External_Rela);
       else if (got_type == GOT_FUNCDESC)
        {
       else if (got_type == GOT_FUNCDESC)
        {
-         if (!info->shared && SYMBOL_FUNCDESC_LOCAL (info, h))
+         if (!bfd_link_pic (info) && SYMBOL_FUNCDESC_LOCAL (info, h))
            htab->srofixup->size += 4;
          else
            htab->srofixup->size += 4;
          else
-           htab->srelgot->size += sizeof (Elf32_External_Rela);
+           htab->root.srelgot->size += sizeof (Elf32_External_Rela);
        }
       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
                || h->root.type != bfd_link_hash_undefweak)
        }
       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
                || h->root.type != bfd_link_hash_undefweak)
-              && (info->shared
+              && (bfd_link_pic (info)
                   || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
                   || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
-       htab->srelgot->size += sizeof (Elf32_External_Rela);
-      else if (htab->fdpic_p && !info->shared && got_type == GOT_NORMAL
+       htab->root.srelgot->size += sizeof (Elf32_External_Rela);
+      else if (htab->fdpic_p
+              && !bfd_link_pic (info)
+              && got_type == GOT_NORMAL
               && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
                   || h->root.type != bfd_link_hash_undefweak))
        htab->srofixup->size += 4;
               && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
                   || h->root.type != bfd_link_hash_undefweak))
        htab->srofixup->size += 4;
@@ -3125,12 +3126,12 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
            return FALSE;
        }
 
            return FALSE;
        }
 
-      s = htab->sgot;
+      s = htab->root.sgot;
       eh->datalabel_got.offset = s->size;
       s->size += 4;
       dyn = htab->root.dynamic_sections_created;
       eh->datalabel_got.offset = s->size;
       s->size += 4;
       dyn = htab->root.dynamic_sections_created;
-      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h))
-       htab->srelgot->size += sizeof (Elf32_External_Rela);
+      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h))
+       htab->root.srelgot->size += sizeof (Elf32_External_Rela);
     }
   else
     eh->datalabel_got.offset = (bfd_vma) -1;
     }
   else
     eh->datalabel_got.offset = (bfd_vma) -1;
@@ -3146,10 +3147,10 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
          || (htab->root.dynamic_sections_created
              && ! SYMBOL_CALLS_LOCAL (info, h))))
     {
          || (htab->root.dynamic_sections_created
              && ! SYMBOL_CALLS_LOCAL (info, h))))
     {
-      if (!info->shared && SYMBOL_FUNCDESC_LOCAL (info, h))
+      if (!bfd_link_pic (info) && SYMBOL_FUNCDESC_LOCAL (info, h))
        htab->srofixup->size += eh->abs_funcdesc_refcount * 4;
       else
        htab->srofixup->size += eh->abs_funcdesc_refcount * 4;
       else
-       htab->srelgot->size
+       htab->root.srelgot->size
          += eh->abs_funcdesc_refcount * sizeof (Elf32_External_Rela);
     }
 
          += eh->abs_funcdesc_refcount * sizeof (Elf32_External_Rela);
     }
 
@@ -3170,7 +3171,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
 
       /* We will need a relocation or two fixups to initialize the
         function descriptor, so allocate those too.  */
 
       /* We will need a relocation or two fixups to initialize the
         function descriptor, so allocate those too.  */
-      if (!info->shared && SYMBOL_CALLS_LOCAL (info, h))
+      if (!bfd_link_pic (info) && SYMBOL_CALLS_LOCAL (info, h))
        htab->srofixup->size += 8;
       else
        htab->srelfuncdesc->size += sizeof (Elf32_External_Rela);
        htab->srofixup->size += 8;
       else
        htab->srelfuncdesc->size += sizeof (Elf32_External_Rela);
@@ -3185,7 +3186,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
      space for pc-relative relocs that have become local due to symbol
      visibility changes.  */
 
      space for pc-relative relocs that have become local due to symbol
      visibility changes.  */
 
-  if (info->shared)
+  if (bfd_link_pic (info))
     {
       if (SYMBOL_CALLS_LOCAL (info, h))
        {
     {
       if (SYMBOL_CALLS_LOCAL (info, h))
        {
@@ -3273,7 +3274,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
       sreloc->size += p->count * sizeof (Elf32_External_Rela);
 
       /* If we need relocations, we do not need fixups.  */
       sreloc->size += p->count * sizeof (Elf32_External_Rela);
 
       /* If we need relocations, we do not need fixups.  */
-      if (htab->fdpic_p && !info->shared)
+      if (htab->fdpic_p && !bfd_link_pic (info))
        htab->srofixup->size -= 4 * (p->count - p->pc_count);
     }
 
        htab->srofixup->size -= 4 * (p->count - p->pc_count);
     }
 
@@ -3313,9 +3314,10 @@ readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
 static bfd_boolean
 sh_elf_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
 static bfd_boolean
 sh_elf_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
-  sh_elf_hash_table (info)->plt_info = get_plt_info (output_bfd, info->shared);
+  sh_elf_hash_table (info)->plt_info = get_plt_info (output_bfd,
+                                                    bfd_link_pic (info));
 
 
-  if (sh_elf_hash_table (info)->fdpic_p && !info->relocatable
+  if (sh_elf_hash_table (info)->fdpic_p && !bfd_link_relocatable (info)
       && !bfd_elf_stack_segment_size (output_bfd, info,
                                      "__stacksize", DEFAULT_STACK_SIZE))
     return FALSE;
       && !bfd_elf_stack_segment_size (output_bfd, info,
                                      "__stacksize", DEFAULT_STACK_SIZE))
     return FALSE;
@@ -3344,7 +3346,7 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   if (htab->root.dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
   if (htab->root.dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
-      if (info->executable)
+      if (bfd_link_executable (info) && !info->nointerp)
        {
          s = bfd_get_linker_section (dynobj, ".interp");
          BFD_ASSERT (s != NULL);
        {
          s = bfd_get_linker_section (dynobj, ".interp");
          BFD_ASSERT (s != NULL);
@@ -3400,7 +3402,7 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
                    info->flags |= DF_TEXTREL;
 
                  /* If we need relocations, we do not need fixups.  */
                    info->flags |= DF_TEXTREL;
 
                  /* If we need relocations, we do not need fixups.  */
-                 if (htab->fdpic_p && !info->shared)
+                 if (htab->fdpic_p && !bfd_link_pic (info))
                    htab->srofixup->size -= 4 * (p->count - p->pc_count);
                }
            }
                    htab->srofixup->size -= 4 * (p->count - p->pc_count);
                }
            }
@@ -3412,8 +3414,8 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
       /* Count datalabel local GOT.  */
       locsymcount *= 2;
 #endif
       /* Count datalabel local GOT.  */
       locsymcount *= 2;
 #endif
-      s = htab->sgot;
-      srel = htab->srelgot;
+      s = htab->root.sgot;
+      srel = htab->root.srelgot;
 
       local_got = elf_local_got_refcounts (ibfd);
       if (local_got)
 
       local_got = elf_local_got_refcounts (ibfd);
       if (local_got)
@@ -3429,7 +3431,7 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
                  s->size += 4;
                  if (*local_got_type == GOT_TLS_GD)
                    s->size += 4;
                  s->size += 4;
                  if (*local_got_type == GOT_TLS_GD)
                    s->size += 4;
-                 if (info->shared)
+                 if (bfd_link_pic (info))
                    srel->size += sizeof (Elf32_External_Rela);
                  else
                    htab->srofixup->size += 4;
                    srel->size += sizeof (Elf32_External_Rela);
                  else
                    htab->srofixup->size += 4;
@@ -3470,7 +3472,7 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
                {
                  local_funcdesc->offset = htab->sfuncdesc->size;
                  htab->sfuncdesc->size += 8;
                {
                  local_funcdesc->offset = htab->sfuncdesc->size;
                  htab->sfuncdesc->size += 8;
-                 if (!info->shared)
+                 if (!bfd_link_pic (info))
                    htab->srofixup->size += 8;
                  else
                    htab->srelfuncdesc->size += sizeof (Elf32_External_Rela);
                    htab->srofixup->size += 8;
                  else
                    htab->srelfuncdesc->size += sizeof (Elf32_External_Rela);
@@ -3486,9 +3488,9 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
     {
       /* Allocate 2 got entries and 1 dynamic reloc for R_SH_TLS_LD_32
         relocs.  */
     {
       /* Allocate 2 got entries and 1 dynamic reloc for R_SH_TLS_LD_32
         relocs.  */
-      htab->tls_ldm_got.offset = htab->sgot->size;
-      htab->sgot->size += 8;
-      htab->srelgot->size += sizeof (Elf32_External_Rela);
+      htab->tls_ldm_got.offset = htab->root.sgot->size;
+      htab->root.sgot->size += 8;
+      htab->root.srelgot->size += sizeof (Elf32_External_Rela);
     }
   else
     htab->tls_ldm_got.offset = -1;
     }
   else
     htab->tls_ldm_got.offset = -1;
@@ -3497,8 +3499,8 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
      the end of .got.plt.  */
   if (htab->fdpic_p)
     {
      the end of .got.plt.  */
   if (htab->fdpic_p)
     {
-      BFD_ASSERT (htab->sgotplt && htab->sgotplt->size == 12);
-      htab->sgotplt->size = 0;
+      BFD_ASSERT (htab->root.sgotplt && htab->root.sgotplt->size == 12);
+      htab->root.sgotplt->size = 0;
     }
 
   /* Allocate global sym .plt and .got entries, and space for global
     }
 
   /* Allocate global sym .plt and .got entries, and space for global
@@ -3509,8 +3511,8 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
      end of the FDPIC .got.plt.  */
   if (htab->fdpic_p)
     {
      end of the FDPIC .got.plt.  */
   if (htab->fdpic_p)
     {
-      htab->root.hgot->root.u.def.value = htab->sgotplt->size;
-      htab->sgotplt->size += 12;
+      htab->root.hgot->root.u.def.value = htab->root.sgotplt->size;
+      htab->root.sgotplt->size += 12;
     }
 
   /* At the very end of the .rofixup section is a pointer to the GOT.  */
     }
 
   /* At the very end of the .rofixup section is a pointer to the GOT.  */
@@ -3525,9 +3527,9 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
       if ((s->flags & SEC_LINKER_CREATED) == 0)
        continue;
 
       if ((s->flags & SEC_LINKER_CREATED) == 0)
        continue;
 
-      if (s == htab->splt
-         || s == htab->sgot
-         || s == htab->sgotplt
+      if (s == htab->root.splt
+         || s == htab->root.sgot
+         || s == htab->root.sgotplt
          || s == htab->sfuncdesc
          || s == htab->srofixup
          || s == htab->sdynbss)
          || s == htab->sfuncdesc
          || s == htab->srofixup
          || s == htab->sdynbss)
@@ -3537,7 +3539,7 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
        }
       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
        {
        }
       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
        {
-         if (s->size != 0 && s != htab->srelplt && s != htab->srelplt2)
+         if (s->size != 0 && s != htab->root.srelplt && s != htab->srelplt2)
            relocs = TRUE;
 
          /* We use the reloc_count field as a counter if we need
            relocs = TRUE;
 
          /* We use the reloc_count field as a counter if we need
@@ -3589,13 +3591,13 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 #define add_dynamic_entry(TAG, VAL) \
   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
 
 #define add_dynamic_entry(TAG, VAL) \
   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
 
-      if (info->executable)
+      if (bfd_link_executable (info))
        {
          if (! add_dynamic_entry (DT_DEBUG, 0))
            return FALSE;
        }
 
        {
          if (! add_dynamic_entry (DT_DEBUG, 0))
            return FALSE;
        }
 
-      if (htab->splt->size != 0)
+      if (htab->root.splt->size != 0)
        {
          if (! add_dynamic_entry (DT_PLTGOT, 0)
              || ! add_dynamic_entry (DT_PLTRELSZ, 0)
        {
          if (! add_dynamic_entry (DT_PLTGOT, 0)
              || ! add_dynamic_entry (DT_PLTRELSZ, 0)
@@ -3603,8 +3605,7 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
              || ! add_dynamic_entry (DT_JMPREL, 0))
            return FALSE;
        }
              || ! add_dynamic_entry (DT_JMPREL, 0))
            return FALSE;
        }
-      else if ((elf_elfheader (output_bfd)->e_flags & EF_SH_FDPIC)
-              && htab->sgot->size != 0)
+      else if ((elf_elfheader (output_bfd)->e_flags & EF_SH_FDPIC))
        {
          if (! add_dynamic_entry (DT_PLTGOT, 0))
            return FALSE;
        {
          if (! add_dynamic_entry (DT_PLTGOT, 0))
            return FALSE;
@@ -3678,7 +3679,7 @@ sh_elf_add_rofixup (bfd *output_bfd, asection *srofixup, bfd_vma offset)
 static bfd_signed_vma
 sh_elf_got_offset (struct elf_sh_link_hash_table *htab)
 {
 static bfd_signed_vma
 sh_elf_got_offset (struct elf_sh_link_hash_table *htab)
 {
-  return (htab->sgot->output_offset - htab->sgotplt->output_offset
+  return (htab->root.sgot->output_offset - htab->root.sgotplt->output_offset
          - htab->root.hgot->root.u.def.value);
 }
 
          - htab->root.hgot->root.u.def.value);
 }
 
@@ -3749,7 +3750,7 @@ sh_elf_initialize_funcdesc (bfd *output_bfd,
       addr = seg = 0;
     }
 
       addr = seg = 0;
     }
 
-  if (!info->shared && SYMBOL_CALLS_LOCAL (info, h))
+  if (!bfd_link_pic (info) && SYMBOL_CALLS_LOCAL (info, h))
     {
       if (h == NULL || h->root.type != bfd_link_hash_undefweak)
        {
     {
       if (h == NULL || h->root.type != bfd_link_hash_undefweak)
        {
@@ -3825,7 +3826,6 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
   Elf_Internal_Shdr *symtab_hdr;
   struct elf_link_hash_entry **sym_hashes;
   Elf_Internal_Rela *rel, *relend;
   Elf_Internal_Shdr *symtab_hdr;
   struct elf_link_hash_entry **sym_hashes;
   Elf_Internal_Rela *rel, *relend;
-  bfd *dynobj = NULL;
   bfd_vma *local_got_offsets;
   asection *sgot = NULL;
   asection *sgotplt = NULL;
   bfd_vma *local_got_offsets;
   asection *sgot = NULL;
   asection *sgotplt = NULL;
@@ -3841,10 +3841,10 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
   htab = sh_elf_hash_table (info);
   if (htab != NULL)
     {
   htab = sh_elf_hash_table (info);
   if (htab != NULL)
     {
-      dynobj = htab->root.dynobj;
-      sgot = htab->sgot;
-      sgotplt = htab->sgotplt;
-      splt = htab->splt;
+      sgot = htab->root.sgot;
+      sgotplt = htab->root.sgotplt;
+      srelgot = htab->root.srelgot;
+      splt = htab->root.splt;
       fdpic_p = htab->fdpic_p;
     }
   symtab_hdr = &elf_symtab_hdr (input_bfd);
       fdpic_p = htab->fdpic_p;
     }
   symtab_hdr = &elf_symtab_hdr (input_bfd);
@@ -3866,7 +3866,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
 
   /* We have to handle relocations in vxworks .tls_vars sections
      specially, because the dynamic loader is 'weird'.  */
 
   /* We have to handle relocations in vxworks .tls_vars sections
      specially, because the dynamic loader is 'weird'.  */
-  is_vxworks_tls = (htab && htab->vxworks_p && info->shared
+  is_vxworks_tls = (htab && htab->vxworks_p && bfd_link_pic (info)
                    && !strcmp (input_section->output_section->name,
                                ".tls_vars"));
 
                    && !strcmp (input_section->output_section->name,
                                ".tls_vars"));
 
@@ -3948,15 +3948,15 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
             datalabel processing here.  Make sure this does not change
             without notice.  */
          if ((sym->st_other & STO_SH5_ISA32) != 0)
             datalabel processing here.  Make sure this does not change
             without notice.  */
          if ((sym->st_other & STO_SH5_ISA32) != 0)
-           ((*info->callbacks->reloc_dangerous)
-            (info,
-             _("Unexpected STO_SH5_ISA32 on local symbol is not handled"),
-             input_bfd, input_section, rel->r_offset));
+           (*info->callbacks->reloc_dangerous)
+             (info,
+              _("Unexpected STO_SH5_ISA32 on local symbol is not handled"),
+              input_bfd, input_section, rel->r_offset);
 
          if (sec != NULL && discarded_section (sec))
            /* Handled below.  */
            ;
 
          if (sec != NULL && discarded_section (sec))
            /* Handled below.  */
            ;
-         else if (info->relocatable)
+         else if (bfd_link_relocatable (info))
            {
              /* This is a relocatable link.  We don't have to change
                 anything, unless the reloc is against a section symbol,
            {
              /* This is a relocatable link.  We don't have to change
                 anything, unless the reloc is against a section symbol,
@@ -4004,10 +4004,11 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
 
              if (howto->rightshift || howto->src_mask != 0xffffffff)
                {
 
              if (howto->rightshift || howto->src_mask != 0xffffffff)
                {
-                 (*_bfd_error_handler)
-                   (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
+                 _bfd_error_handler
+                   /* xgettext:c-format */
+                   (_("%B(%A+%#Lx): %s relocation against SEC_MERGE section"),
                     input_bfd, input_section,
                     input_bfd, input_section,
-                    (long) rel->r_offset, howto->name);
+                    rel->r_offset, howto->name);
                  return FALSE;
                }
 
                  return FALSE;
                }
 
@@ -4071,8 +4072,10 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                       || r_type == R_SH_GOT_MEDLOW16
                       || r_type == R_SH_GOT_MEDHI16
                       || r_type == R_SH_GOT_HI16)
                       || r_type == R_SH_GOT_MEDLOW16
                       || r_type == R_SH_GOT_MEDHI16
                       || r_type == R_SH_GOT_HI16)
-                     && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
-                     && (! info->shared
+                     && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
+                                                         bfd_link_pic (info),
+                                                         h)
+                     && (! bfd_link_pic (info)
                          || (! info->symbolic && h->dynindx != -1)
                          || !h->def_regular))
                  /* The cases above are those in which relocation is
                          || (! info->symbolic && h->dynindx != -1)
                          || !h->def_regular))
                  /* The cases above are those in which relocation is
@@ -4080,7 +4083,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                     below are those in which we must defer relocation
                     to run-time, because we can't resolve absolute
                     addresses when creating a shared library.  */
                     below are those in which we must defer relocation
                     to run-time, because we can't resolve absolute
                     addresses when creating a shared library.  */
-                 || (info->shared
+                 || (bfd_link_pic (info)
                      && ((! info->symbolic && h->dynindx != -1)
                          || !h->def_regular)
                      && ((r_type == R_SH_DIR32
                      && ((! info->symbolic && h->dynindx != -1)
                          || !h->def_regular)
                      && ((r_type == R_SH_DIR32
@@ -4113,17 +4116,18 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                                 STT_DATALABEL on the way to it.  */
                              | ((h->other & STO_SH5_ISA32) != 0
                                 && ! seen_stt_datalabel));
                                 STT_DATALABEL on the way to it.  */
                              | ((h->other & STO_SH5_ISA32) != 0
                                 && ! seen_stt_datalabel));
-             else if (!info->relocatable
+             else if (!bfd_link_relocatable (info)
                       && (_bfd_elf_section_offset (output_bfd, info,
                                                    input_section,
                                                    rel->r_offset)
                           != (bfd_vma) -1))
                {
                       && (_bfd_elf_section_offset (output_bfd, info,
                                                    input_section,
                                                    rel->r_offset)
                           != (bfd_vma) -1))
                {
-                 (*_bfd_error_handler)
-                   (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
+                 _bfd_error_handler
+                   /* xgettext:c-format */
+                   (_("%B(%A+%#Lx): unresolvable %s relocation against symbol `%s'"),
                     input_bfd,
                     input_section,
                     input_bfd,
                     input_section,
-                    (long) rel->r_offset,
+                    rel->r_offset,
                     howto->name,
                     h->root.root.string);
                  return FALSE;
                     howto->name,
                     h->root.root.string);
                  return FALSE;
@@ -4134,22 +4138,19 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
          else if (info->unresolved_syms_in_objects == RM_IGNORE
                   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
            ;
          else if (info->unresolved_syms_in_objects == RM_IGNORE
                   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
            ;
-         else if (!info->relocatable)
-           {
-             if (! info->callbacks->undefined_symbol
-                 (info, h->root.root.string, input_bfd,
-                  input_section, rel->r_offset,
-                  (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
-                   || ELF_ST_VISIBILITY (h->other))))
-               return FALSE;
-           }
+         else if (!bfd_link_relocatable (info))
+           (*info->callbacks->undefined_symbol)
+             (info, h->root.root.string, input_bfd,
+              input_section, rel->r_offset,
+              (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
+               || ELF_ST_VISIBILITY (h->other)));
        }
 
       if (sec != NULL && discarded_section (sec))
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
                                         rel, 1, relend, howto, 0, contents);
 
        }
 
       if (sec != NULL && discarded_section (sec))
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
                                         rel, 1, relend, howto, 0, contents);
 
-      if (info->relocatable)
+      if (bfd_link_relocatable (info))
        continue;
 
       /* Check for inter-segment relocations in FDPIC files.  Most
        continue;
 
       /* Check for inter-segment relocations in FDPIC files.  Most
@@ -4200,10 +4201,11 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                }
              if (disp & mask)
                {
                }
              if (disp & mask)
                {
-                 ((*_bfd_error_handler)
-                  (_("%B: 0x%lx: fatal: unaligned branch target for relax-support relocation"),
-                   input_section->owner,
-                   (unsigned long) rel->r_offset));
+                 _bfd_error_handler
+                   /* xgettext:c-format */
+                   (_("%B: %#Lx: fatal: unaligned branch target for relax-support relocation"),
+                    input_section->owner,
+                    rel->r_offset);
                  bfd_set_error (bfd_error_bad_value);
                  return FALSE;
                }
                  bfd_set_error (bfd_error_bad_value);
                  return FALSE;
                }
@@ -4233,11 +4235,12 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
        case R_SH_DIR4UL:
          if (relocation & 3)
            {
        case R_SH_DIR4UL:
          if (relocation & 3)
            {
-             ((*_bfd_error_handler)
-              (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
-               input_section->owner,
-               (unsigned long) rel->r_offset, howto->name,
-               (unsigned long) relocation));
+             _bfd_error_handler
+               /* xgettext:c-format */
+               (_("%B: %#Lx: fatal: unaligned %s relocation %#Lx"),
+                input_section->owner,
+                rel->r_offset, howto->name,
+                relocation);
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
            }
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
            }
@@ -4248,11 +4251,12 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
        case R_SH_DIR4UW:
          if (relocation & 1)
            {
        case R_SH_DIR4UW:
          if (relocation & 1)
            {
-             ((*_bfd_error_handler)
-              (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
-               input_section->owner,
-               (unsigned long) rel->r_offset, howto->name,
-               (unsigned long) relocation));
+             _bfd_error_handler
+               /* xgettext:c-format */
+               (_("%B: %#Lx: fatal: unaligned %s relocation %#Lx"),
+                input_section->owner,
+                rel->r_offset, howto->name,
+                relocation);
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
            }
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
            }
@@ -4262,11 +4266,12 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
          if ((signed int)relocation < -32
              || (signed int)relocation > 32)
            {
          if ((signed int)relocation < -32
              || (signed int)relocation > 32)
            {
-             ((*_bfd_error_handler)
-              (_("%B: 0x%lx: fatal: R_SH_PSHA relocation %d not in range -32..32"),
-               input_section->owner,
-               (unsigned long) rel->r_offset,
-               (unsigned long) relocation));
+             _bfd_error_handler
+               /* xgettext:c-format */
+               (_("%B: %#Lx: fatal: R_SH_PSHA relocation %Ld not in range -32..32"),
+                input_section->owner,
+                rel->r_offset,
+                relocation);
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
            }
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
            }
@@ -4276,11 +4281,12 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
          if ((signed int)relocation < -16
              || (signed int)relocation > 16)
            {
          if ((signed int)relocation < -16
              || (signed int)relocation > 16)
            {
-             ((*_bfd_error_handler)
-              (_("%B: 0x%lx: fatal: R_SH_PSHL relocation %d not in range -32..32"),
-               input_section->owner,
-               (unsigned long) rel->r_offset,
-               (unsigned long) relocation));
+             _bfd_error_handler
+               /* xgettext:c-format */
+               (_("%B: %#Lx: fatal: R_SH_PSHL relocation %Ld not in range -32..32"),
+                input_section->owner,
+                rel->r_offset,
+                relocation);
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
            }
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
            }
@@ -4294,7 +4300,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
        case R_SH_IMM_MEDHI16_PCREL:
        case R_SH_IMM_HI16_PCREL:
 #endif
        case R_SH_IMM_MEDHI16_PCREL:
        case R_SH_IMM_HI16_PCREL:
 #endif
-         if (info->shared
+         if (bfd_link_pic (info)
              && (h == NULL
                  || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
                  || h->root.type != bfd_link_hash_undefweak)
              && (h == NULL
                  || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
                  || h->root.type != bfd_link_hash_undefweak)
@@ -4409,7 +4415,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
              if (! relocate)
                continue;
            }
              if (! relocate)
                continue;
            }
-         else if (fdpic_p && !info->shared
+         else if (fdpic_p && !bfd_link_pic (info)
                   && r_type == R_SH_DIR32
                   && (input_section->flags & SEC_ALLOC) != 0)
            {
                   && r_type == R_SH_DIR32
                   && (input_section->flags & SEC_ALLOC) != 0)
            {
@@ -4420,11 +4426,12 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                if (sh_elf_osec_readonly_p (output_bfd,
                                            input_section->output_section))
                  {
                if (sh_elf_osec_readonly_p (output_bfd,
                                            input_section->output_section))
                  {
-                   (*_bfd_error_handler)
-                     (_("%B(%A+0x%lx): cannot emit fixup to `%s' in read-only section"),
+                   _bfd_error_handler
+                     /* xgettext:c-format */
+                     (_("%B(%A+%#Lx): cannot emit fixup to `%s' in read-only section"),
                       input_bfd,
                       input_section,
                       input_bfd,
                       input_section,
-                      (long) rel->r_offset,
+                      rel->r_offset,
                       symname);
                    return FALSE;
                  }
                       symname);
                    return FALSE;
                  }
@@ -4443,7 +4450,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
               symbols.  */
            else if (r_type == R_SH_REL32
                     && h
               symbols.  */
            else if (r_type == R_SH_REL32
                     && h
-                    && h->root.type == bfd_link_hash_undefweak) 
+                    && h->root.type == bfd_link_hash_undefweak)
              check_segment[0] = check_segment[1] = -1;
          goto final_link_relocate;
 
              check_segment[0] = check_segment[1] = -1;
          goto final_link_relocate;
 
@@ -4461,7 +4468,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
 
          if (h == NULL
              || h->forced_local
 
          if (h == NULL
              || h->forced_local
-             || ! info->shared
+             || ! bfd_link_pic (info)
              || info->symbolic
              || h->dynindx == -1
              || h->plt.offset == (bfd_vma) -1
              || info->symbolic
              || h->dynindx == -1
              || h->plt.offset == (bfd_vma) -1
@@ -4518,8 +4525,10 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
              BFD_ASSERT (off != (bfd_vma) -1);
 
              dyn = htab->root.dynamic_sections_created;
              BFD_ASSERT (off != (bfd_vma) -1);
 
              dyn = htab->root.dynamic_sections_created;
-             if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
-                 || (info->shared
+             if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
+                                                    bfd_link_pic (info),
+                                                    h)
+                 || (bfd_link_pic (info)
                      && SYMBOL_REFERENCES_LOCAL (info, h))
                  || (ELF_ST_VISIBILITY (h->other)
                      && h->root.type == bfd_link_hash_undefweak))
                      && SYMBOL_REFERENCES_LOCAL (info, h))
                  || (ELF_ST_VISIBILITY (h->other)
                      && h->root.type == bfd_link_hash_undefweak))
@@ -4556,7 +4565,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
 
                      /* If we initialize the GOT entry here with a valid
                         symbol address, also add a fixup.  */
 
                      /* If we initialize the GOT entry here with a valid
                         symbol address, also add a fixup.  */
-                     if (fdpic_p && !info->shared
+                     if (fdpic_p && !bfd_link_pic (info)
                          && sh_elf_hash_entry (h)->got_type == GOT_NORMAL
                          && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
                              || h->root.type != bfd_link_hash_undefweak))
                          && sh_elf_hash_entry (h)->got_type == GOT_NORMAL
                          && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
                              || h->root.type != bfd_link_hash_undefweak))
@@ -4602,18 +4611,11 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                {
                  bfd_put_32 (output_bfd, relocation, sgot->contents + off);
 
                {
                  bfd_put_32 (output_bfd, relocation, sgot->contents + off);
 
-                 if (info->shared)
+                 if (bfd_link_pic (info))
                    {
                      Elf_Internal_Rela outrel;
                      bfd_byte *loc;
 
                    {
                      Elf_Internal_Rela outrel;
                      bfd_byte *loc;
 
-                     if (srelgot == NULL)
-                       {
-                         srelgot = bfd_get_linker_section (dynobj,
-                                                           ".rela.got");
-                         BFD_ASSERT (srelgot != NULL);
-                       }
-
                      outrel.r_offset = (sgot->output_section->vma
                                         + sgot->output_offset
                                         + off);
                      outrel.r_offset = (sgot->output_section->vma
                                         + sgot->output_offset
                                         + off);
@@ -4889,18 +4891,19 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                relocation = htab->sfuncdesc->output_offset + (offset & ~1);
              }
 
                relocation = htab->sfuncdesc->output_offset + (offset & ~1);
              }
 
-           if (!info->shared && SYMBOL_FUNCDESC_LOCAL (info, h))
+           if (!bfd_link_pic (info) && SYMBOL_FUNCDESC_LOCAL (info, h))
              {
                bfd_vma offset;
 
                if (sh_elf_osec_readonly_p (output_bfd,
                                            reloc_section->output_section))
                  {
              {
                bfd_vma offset;
 
                if (sh_elf_osec_readonly_p (output_bfd,
                                            reloc_section->output_section))
                  {
-                   (*_bfd_error_handler)
-                     (_("%B(%A+0x%lx): cannot emit fixup to `%s' in read-only section"),
+                   _bfd_error_handler
+                     /* xgettext:c-format */
+                     (_("%B(%A+%#Lx): cannot emit fixup to `%s' in read-only section"),
                       input_bfd,
                       input_section,
                       input_bfd,
                       input_section,
-                      (long) rel->r_offset,
+                      rel->r_offset,
                       symname);
                    return FALSE;
                  }
                       symname);
                    return FALSE;
                  }
@@ -4929,12 +4932,6 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                    return FALSE;
                  }
 
                    return FALSE;
                  }
 
-               if (srelgot == NULL)
-                 {
-                   srelgot = bfd_get_linker_section (dynobj, ".rela.got");
-                   BFD_ASSERT (srelgot != NULL);
-                 }
-
                offset = _bfd_elf_section_offset (output_bfd, info,
                                                  reloc_section, reloc_offset);
 
                offset = _bfd_elf_section_offset (output_bfd, info,
                                                  reloc_section, reloc_offset);
 
@@ -5004,8 +5001,9 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                    || !SYMBOL_FUNCDESC_LOCAL (info, h)))
            {
              _bfd_error_handler
                    || !SYMBOL_FUNCDESC_LOCAL (info, h)))
            {
              _bfd_error_handler
-               (_("%B(%A+0x%lx): %s relocation against external symbol \"%s\""),
-                input_bfd, input_section, (long) rel->r_offset, howto->name,
+               /* xgettext:c-format */
+               (_("%B(%A+%#Lx): %s relocation against external symbol \"%s\""),
+                input_bfd, input_section, rel->r_offset, howto->name,
                 h->root.root.string);
              return FALSE;
            }
                 h->root.root.string);
              return FALSE;
            }
@@ -5092,7 +5090,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
          else if (h != NULL)
            {
              got_type = sh_elf_hash_entry (h)->got_type;
          else if (h != NULL)
            {
              got_type = sh_elf_hash_entry (h)->got_type;
-             if (! info->shared
+             if (! bfd_link_pic (info)
                  && (h->dynindx == -1
                      || h->def_regular))
                r_type = R_SH_TLS_LE_32;
                  && (h->dynindx == -1
                      || h->def_regular))
                r_type = R_SH_TLS_LE_32;
@@ -5219,12 +5217,6 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
              bfd_byte *loc;
              int dr_type, indx;
 
              bfd_byte *loc;
              int dr_type, indx;
 
-             if (srelgot == NULL)
-               {
-                 srelgot = bfd_get_linker_section (dynobj, ".rela.got");
-                 BFD_ASSERT (srelgot != NULL);
-               }
-
              outrel.r_offset = (sgot->output_section->vma
                                 + sgot->output_offset + off);
 
              outrel.r_offset = (sgot->output_section->vma
                                 + sgot->output_offset + off);
 
@@ -5336,7 +5328,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
        case R_SH_TLS_LD_32:
          BFD_ASSERT (htab);
          check_segment[0] = check_segment[1] = -1;
        case R_SH_TLS_LD_32:
          BFD_ASSERT (htab);
          check_segment[0] = check_segment[1] = -1;
-         if (! info->shared)
+         if (! bfd_link_pic (info))
            {
              bfd_vma offset;
              unsigned short insn;
            {
              bfd_vma offset;
              unsigned short insn;
@@ -5394,10 +5386,6 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
              Elf_Internal_Rela outrel;
              bfd_byte *loc;
 
              Elf_Internal_Rela outrel;
              bfd_byte *loc;
 
-             srelgot = htab->srelgot;
-             if (srelgot == NULL)
-               abort ();
-
              outrel.r_offset = (sgot->output_section->vma
                                 + sgot->output_offset + off);
              outrel.r_addend = 0;
              outrel.r_offset = (sgot->output_section->vma
                                 + sgot->output_offset + off);
              outrel.r_addend = 0;
@@ -5415,7 +5403,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
 
        case R_SH_TLS_LDO_32:
          check_segment[0] = check_segment[1] = -1;
 
        case R_SH_TLS_LDO_32:
          check_segment[0] = check_segment[1] = -1;
-         if (! info->shared)
+         if (! bfd_link_pic (info))
            relocation = tpoff (info, relocation);
          else
            relocation -= dtpoff_base (info);
            relocation = tpoff (info, relocation);
          else
            relocation -= dtpoff_base (info);
@@ -5431,7 +5419,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
 
            check_segment[0] = check_segment[1] = -1;
 
 
            check_segment[0] = check_segment[1] = -1;
 
-           if (! info->shared || info->pie)
+           if (!bfd_link_dll (info))
              {
                relocation = tpoff (info, relocation);
                addend = rel->r_addend;
              {
                relocation = tpoff (info, relocation);
                addend = rel->r_addend;
@@ -5474,20 +5462,22 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
          /* We don't want duplicate errors for undefined symbols.  */
          if (!h || h->root.type != bfd_link_hash_undefined)
            {
          /* We don't want duplicate errors for undefined symbols.  */
          if (!h || h->root.type != bfd_link_hash_undefined)
            {
-             if (info->shared)
+             if (bfd_link_pic (info))
                {
                  info->callbacks->einfo
                {
                  info->callbacks->einfo
+                   /* xgettext:c-format */
                    (_("%X%C: relocation to \"%s\" references a different segment\n"),
                     input_bfd, input_section, rel->r_offset, symname);
                  return FALSE;
                }
              else
                info->callbacks->einfo
                    (_("%X%C: relocation to \"%s\" references a different segment\n"),
                     input_bfd, input_section, rel->r_offset, symname);
                  return FALSE;
                }
              else
                info->callbacks->einfo
+                 /* xgettext:c-format */
                  (_("%C: warning: relocation to \"%s\" references a different segment\n"),
                   input_bfd, input_section, rel->r_offset, symname);
            }
 
                  (_("%C: warning: relocation to \"%s\" references a different segment\n"),
                   input_bfd, input_section, rel->r_offset, symname);
            }
 
-         elf_elfheader (output_bfd)->e_flags &= ~EF_SH_PIC;
+         elf_elfheader (output_bfd)->e_flags |= EF_SH_PIC;
        }
 
       if (r != bfd_reloc_ok)
        }
 
       if (r != bfd_reloc_ok)
@@ -5512,11 +5502,9 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                    if (*name == '\0')
                      name = bfd_section_name (input_bfd, sec);
                  }
                    if (*name == '\0')
                      name = bfd_section_name (input_bfd, sec);
                  }
-               if (! ((*info->callbacks->reloc_overflow)
-                      (info, (h ? &h->root : NULL), name, howto->name,
-                       (bfd_vma) 0, input_bfd, input_section,
-                       rel->r_offset)))
-                 return FALSE;
+               (*info->callbacks->reloc_overflow)
+                 (info, (h ? &h->root : NULL), name, howto->name,
+                  (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
              }
              break;
            }
              }
              break;
            }
@@ -5679,220 +5667,6 @@ sh_elf_gc_mark_hook (asection *sec,
   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
 }
 
   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
 }
 
-/* Update the got entry reference counts for the section being removed.  */
-
-static bfd_boolean
-sh_elf_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;
-  union gotref *local_funcdesc;
-  const Elf_Internal_Rela *rel, *relend;
-
-  if (info->relocatable)
-    return TRUE;
-
-  elf_section_data (sec)->local_dynrel = NULL;
-
-  symtab_hdr = &elf_symtab_hdr (abfd);
-  sym_hashes = elf_sym_hashes (abfd);
-  local_got_refcounts = elf_local_got_refcounts (abfd);
-  local_funcdesc = sh_elf_local_funcdesc (abfd);
-
-  relend = relocs + sec->reloc_count;
-  for (rel = relocs; rel < relend; rel++)
-    {
-      unsigned long r_symndx;
-      unsigned int r_type;
-      struct elf_link_hash_entry *h = NULL;
-#ifdef INCLUDE_SHMEDIA
-      int seen_stt_datalabel = 0;
-#endif
-
-      r_symndx = ELF32_R_SYM (rel->r_info);
-      if (r_symndx >= symtab_hdr->sh_info)
-       {
-         struct elf_sh_link_hash_entry *eh;
-         struct elf_sh_dyn_relocs **pp;
-         struct elf_sh_dyn_relocs *p;
-
-         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
-         while (h->root.type == bfd_link_hash_indirect
-                || h->root.type == bfd_link_hash_warning)
-           {
-#ifdef INCLUDE_SHMEDIA
-             seen_stt_datalabel |= h->type == STT_DATALABEL;
-#endif
-             h = (struct elf_link_hash_entry *) h->root.u.i.link;
-           }
-         eh = (struct elf_sh_link_hash_entry *) h;
-         for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
-           if (p->sec == sec)
-             {
-               /* Everything must go for SEC.  */
-               *pp = p->next;
-               break;
-             }
-       }
-
-      r_type = ELF32_R_TYPE (rel->r_info);
-      switch (sh_elf_optimized_tls_reloc (info, r_type, h != NULL))
-       {
-       case R_SH_TLS_LD_32:
-         if (sh_elf_hash_table (info)->tls_ldm_got.refcount > 0)
-           sh_elf_hash_table (info)->tls_ldm_got.refcount -= 1;
-         break;
-
-       case R_SH_GOT32:
-       case R_SH_GOT20:
-       case R_SH_GOTOFF:
-       case R_SH_GOTOFF20:
-       case R_SH_GOTPC:
-#ifdef INCLUDE_SHMEDIA
-       case R_SH_GOT_LOW16:
-       case R_SH_GOT_MEDLOW16:
-       case R_SH_GOT_MEDHI16:
-       case R_SH_GOT_HI16:
-       case R_SH_GOT10BY4:
-       case R_SH_GOT10BY8:
-       case R_SH_GOTOFF_LOW16:
-       case R_SH_GOTOFF_MEDLOW16:
-       case R_SH_GOTOFF_MEDHI16:
-       case R_SH_GOTOFF_HI16:
-       case R_SH_GOTPC_LOW16:
-       case R_SH_GOTPC_MEDLOW16:
-       case R_SH_GOTPC_MEDHI16:
-       case R_SH_GOTPC_HI16:
-#endif
-       case R_SH_TLS_GD_32:
-       case R_SH_TLS_IE_32:
-       case R_SH_GOTFUNCDESC:
-       case R_SH_GOTFUNCDESC20:
-         if (h != NULL)
-           {
-#ifdef INCLUDE_SHMEDIA
-             if (seen_stt_datalabel)
-               {
-                 struct elf_sh_link_hash_entry *eh;
-                 eh = (struct elf_sh_link_hash_entry *) h;
-                 if (eh->datalabel_got.refcount > 0)
-                   eh->datalabel_got.refcount -= 1;
-               }
-             else
-#endif
-               if (h->got.refcount > 0)
-                 h->got.refcount -= 1;
-           }
-         else if (local_got_refcounts != NULL)
-           {
-#ifdef INCLUDE_SHMEDIA
-             if (rel->r_addend & 1)
-               {
-                 if (local_got_refcounts[symtab_hdr->sh_info + r_symndx] > 0)
-                   local_got_refcounts[symtab_hdr->sh_info + r_symndx] -= 1;
-               }
-             else
-#endif
-               if (local_got_refcounts[r_symndx] > 0)
-                 local_got_refcounts[r_symndx] -= 1;
-           }
-         break;
-
-       case R_SH_FUNCDESC:
-         if (h != NULL)
-           sh_elf_hash_entry (h)->abs_funcdesc_refcount -= 1;
-         else if (sh_elf_hash_table (info)->fdpic_p && !info->shared)
-           sh_elf_hash_table (info)->srofixup->size -= 4;
-
-         /* Fall through.  */
-
-       case R_SH_GOTOFFFUNCDESC:
-       case R_SH_GOTOFFFUNCDESC20:
-         if (h != NULL)
-           sh_elf_hash_entry (h)->funcdesc.refcount -= 1;
-         else
-           local_funcdesc[r_symndx].refcount -= 1;
-         break;
-
-       case R_SH_DIR32:
-         if (sh_elf_hash_table (info)->fdpic_p && !info->shared
-             && (sec->flags & SEC_ALLOC) != 0)
-           sh_elf_hash_table (info)->srofixup->size -= 4;
-         /* Fall thru */
-
-       case R_SH_REL32:
-         if (info->shared)
-           break;
-         /* Fall thru */
-
-       case R_SH_PLT32:
-#ifdef INCLUDE_SHMEDIA
-       case R_SH_PLT_LOW16:
-       case R_SH_PLT_MEDLOW16:
-       case R_SH_PLT_MEDHI16:
-       case R_SH_PLT_HI16:
-#endif
-         if (h != NULL)
-           {
-             if (h->plt.refcount > 0)
-               h->plt.refcount -= 1;
-           }
-         break;
-
-       case R_SH_GOTPLT32:
-#ifdef INCLUDE_SHMEDIA
-       case R_SH_GOTPLT_LOW16:
-       case R_SH_GOTPLT_MEDLOW16:
-       case R_SH_GOTPLT_MEDHI16:
-       case R_SH_GOTPLT_HI16:
-       case R_SH_GOTPLT10BY4:
-       case R_SH_GOTPLT10BY8:
-#endif
-         if (h != NULL)
-           {
-             struct elf_sh_link_hash_entry *eh;
-             eh = (struct elf_sh_link_hash_entry *) h;
-             if (eh->gotplt_refcount > 0)
-               {
-                 eh->gotplt_refcount -= 1;
-                 if (h->plt.refcount > 0)
-                   h->plt.refcount -= 1;
-               }
-#ifdef INCLUDE_SHMEDIA
-             else if (seen_stt_datalabel)
-               {
-                 if (eh->datalabel_got.refcount > 0)
-                   eh->datalabel_got.refcount -= 1;
-               }
-#endif
-             else if (h->got.refcount > 0)
-               h->got.refcount -= 1;
-           }
-         else if (local_got_refcounts != NULL)
-           {
-#ifdef INCLUDE_SHMEDIA
-             if (rel->r_addend & 1)
-               {
-                 if (local_got_refcounts[symtab_hdr->sh_info + r_symndx] > 0)
-                   local_got_refcounts[symtab_hdr->sh_info + r_symndx] -= 1;
-               }
-             else
-#endif
-               if (local_got_refcounts[r_symndx] > 0)
-                 local_got_refcounts[r_symndx] -= 1;
-           }
-         break;
-
-       default:
-         break;
-       }
-    }
-
-  return TRUE;
-}
-
 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
 
 static void
 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
 
 static void
@@ -5959,7 +5733,8 @@ sh_elf_copy_indirect_symbol (struct bfd_link_info *info,
       /* If called to transfer flags for a weakdef during processing
         of elf_adjust_dynamic_symbol, don't copy non_got_ref.
         We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
       /* If called to transfer flags for a weakdef during processing
         of elf_adjust_dynamic_symbol, don't copy non_got_ref.
         We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
-      dir->ref_dynamic |= ind->ref_dynamic;
+      if (dir->versioned != versioned_hidden)
+       dir->ref_dynamic |= ind->ref_dynamic;
       dir->ref_regular |= ind->ref_regular;
       dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
       dir->needs_plt |= ind->needs_plt;
       dir->ref_regular |= ind->ref_regular;
       dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
       dir->needs_plt |= ind->needs_plt;
@@ -5972,7 +5747,7 @@ static int
 sh_elf_optimized_tls_reloc (struct bfd_link_info *info, int r_type,
                            int is_local)
 {
 sh_elf_optimized_tls_reloc (struct bfd_link_info *info, int r_type,
                            int is_local)
 {
-  if (info->shared)
+  if (bfd_link_pic (info))
     return r_type;
 
   switch (r_type)
     return r_type;
 
   switch (r_type)
@@ -6008,7 +5783,7 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
 
   sreloc = NULL;
 
 
   sreloc = NULL;
 
-  if (info->relocatable)
+  if (bfd_link_relocatable (info))
     return TRUE;
 
   BFD_ASSERT (is_sh_elf (abfd));
     return TRUE;
 
   BFD_ASSERT (is_sh_elf (abfd));
@@ -6048,11 +5823,11 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
 
          /* PR15323, ref flags aren't set for references in the same
             object.  */
 
          /* PR15323, ref flags aren't set for references in the same
             object.  */
-         h->root.non_ir_ref = 1;
+         h->root.non_ir_ref_regular = 1;
        }
 
       r_type = sh_elf_optimized_tls_reloc (info, r_type, h == NULL);
        }
 
       r_type = sh_elf_optimized_tls_reloc (info, r_type, h == NULL);
-      if (! info->shared
+      if (! bfd_link_pic (info)
          && r_type == R_SH_TLS_IE_32
          && h != NULL
          && h->root.type != bfd_link_hash_undefined
          && r_type == R_SH_TLS_IE_32
          && h != NULL
          && h->root.type != bfd_link_hash_undefined
@@ -6086,7 +5861,7 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
          }
 
       /* Some relocs require a global offset table.  */
          }
 
       /* Some relocs require a global offset table.  */
-      if (htab->sgot == NULL)
+      if (htab->root.sgot == NULL)
        {
          switch (r_type)
            {
        {
          switch (r_type)
            {
@@ -6094,6 +5869,7 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
              /* This may require an rofixup.  */
              if (!htab->fdpic_p)
                break;
              /* This may require an rofixup.  */
              if (!htab->fdpic_p)
                break;
+             /* Fall through.  */
            case R_SH_GOTPLT32:
            case R_SH_GOT32:
            case R_SH_GOT20:
            case R_SH_GOTPLT32:
            case R_SH_GOT32:
            case R_SH_GOT20:
@@ -6160,7 +5936,7 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
          break;
 
        case R_SH_TLS_IE_32:
          break;
 
        case R_SH_TLS_IE_32:
-         if (info->shared)
+         if (bfd_link_pic (info))
            info->flags |= DF_STATIC_TLS;
 
          /* FALLTHROUGH */
            info->flags |= DF_STATIC_TLS;
 
          /* FALLTHROUGH */
@@ -6264,18 +6040,21 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
                {
                  if ((old_got_type == GOT_FUNCDESC || got_type == GOT_FUNCDESC)
                      && (old_got_type == GOT_NORMAL || got_type == GOT_NORMAL))
                {
                  if ((old_got_type == GOT_FUNCDESC || got_type == GOT_FUNCDESC)
                      && (old_got_type == GOT_NORMAL || got_type == GOT_NORMAL))
-                   (*_bfd_error_handler)
+                   _bfd_error_handler
+                     /* xgettext:c-format */
                      (_("%B: `%s' accessed both as normal and FDPIC symbol"),
                       abfd, h->root.root.string);
                  else if (old_got_type == GOT_FUNCDESC
                           || got_type == GOT_FUNCDESC)
                      (_("%B: `%s' accessed both as normal and FDPIC symbol"),
                       abfd, h->root.root.string);
                  else if (old_got_type == GOT_FUNCDESC
                           || got_type == GOT_FUNCDESC)
-                   (*_bfd_error_handler)
+                   _bfd_error_handler
+                     /* xgettext:c-format */
                      (_("%B: `%s' accessed both as FDPIC and thread local symbol"),
                       abfd, h->root.root.string);
                  else
                      (_("%B: `%s' accessed both as FDPIC and thread local symbol"),
                       abfd, h->root.root.string);
                  else
-                   (*_bfd_error_handler)
-                   (_("%B: `%s' accessed both as normal and thread local symbol"),
-                    abfd, h->root.root.string);
+                   _bfd_error_handler
+                     /* xgettext:c-format */
+                     (_("%B: `%s' accessed both as normal and thread local symbol"),
+                      abfd, h->root.root.string);
                  return FALSE;
                }
            }
                  return FALSE;
                }
            }
@@ -6299,7 +6078,7 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
        case R_SH_GOTOFFFUNCDESC20:
          if (rel->r_addend)
            {
        case R_SH_GOTOFFFUNCDESC20:
          if (rel->r_addend)
            {
-             (*_bfd_error_handler)
+             _bfd_error_handler
                (_("%B: Function descriptor relocation with non-zero addend"),
                 abfd);
              return FALSE;
                (_("%B: Function descriptor relocation with non-zero addend"),
                 abfd);
              return FALSE;
@@ -6329,10 +6108,10 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
 
              if (r_type == R_SH_FUNCDESC)
                {
 
              if (r_type == R_SH_FUNCDESC)
                {
-                 if (!info->shared)
+                 if (!bfd_link_pic (info))
                    htab->srofixup->size += 4;
                  else
                    htab->srofixup->size += 4;
                  else
-                   htab->srelgot->size += sizeof (Elf32_External_Rela);
+                   htab->root.srelgot->size += sizeof (Elf32_External_Rela);
                }
            }
          else
                }
            }
          else
@@ -6347,11 +6126,13 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
              if (old_got_type != GOT_FUNCDESC && old_got_type != GOT_UNKNOWN)
                {
                  if (old_got_type == GOT_NORMAL)
              if (old_got_type != GOT_FUNCDESC && old_got_type != GOT_UNKNOWN)
                {
                  if (old_got_type == GOT_NORMAL)
-                   (*_bfd_error_handler)
+                   _bfd_error_handler
+                     /* xgettext:c-format */
                      (_("%B: `%s' accessed both as normal and FDPIC symbol"),
                       abfd, h->root.root.string);
                  else
                      (_("%B: `%s' accessed both as normal and FDPIC symbol"),
                       abfd, h->root.root.string);
                  else
-                   (*_bfd_error_handler)
+                   _bfd_error_handler
+                     /* xgettext:c-format */
                      (_("%B: `%s' accessed both as FDPIC and thread local symbol"),
                       abfd, h->root.root.string);
                }
                      (_("%B: `%s' accessed both as FDPIC and thread local symbol"),
                       abfd, h->root.root.string);
                }
@@ -6372,7 +6153,7 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
 
          if (h == NULL
              || h->forced_local
 
          if (h == NULL
              || h->forced_local
-             || ! info->shared
+             || ! bfd_link_pic (info)
              || info->symbolic
              || h->dynindx == -1)
            goto force_got;
              || info->symbolic
              || h->dynindx == -1)
            goto force_got;
@@ -6417,7 +6198,7 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
        case R_SH_IMM_MEDHI16_PCREL:
        case R_SH_IMM_HI16_PCREL:
 #endif
        case R_SH_IMM_MEDHI16_PCREL:
        case R_SH_IMM_HI16_PCREL:
 #endif
-         if (h != NULL && ! info->shared)
+         if (h != NULL && ! bfd_link_pic (info))
            {
              h->non_got_ref = 1;
              h->plt.refcount += 1;
            {
              h->non_got_ref = 1;
              h->plt.refcount += 1;
@@ -6442,14 +6223,14 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
             may need to keep relocations for symbols satisfied by a
             dynamic library if we manage to avoid copy relocs for the
             symbol.  */
             may need to keep relocations for symbols satisfied by a
             dynamic library if we manage to avoid copy relocs for the
             symbol.  */
-         if ((info->shared
+         if ((bfd_link_pic (info)
               && (sec->flags & SEC_ALLOC) != 0
               && (r_type != R_SH_REL32
                   || (h != NULL
                       && (! info->symbolic
                           || h->root.type == bfd_link_hash_defweak
                           || !h->def_regular))))
               && (sec->flags & SEC_ALLOC) != 0
               && (r_type != R_SH_REL32
                   || (h != NULL
                       && (! info->symbolic
                           || h->root.type == bfd_link_hash_defweak
                           || !h->def_regular))))
-             || (! info->shared
+             || (! bfd_link_pic (info)
                  && (sec->flags & SEC_ALLOC) != 0
                  && h != NULL
                  && (h->root.type == bfd_link_hash_defweak
                  && (sec->flags & SEC_ALLOC) != 0
                  && h != NULL
                  && (h->root.type == bfd_link_hash_defweak
@@ -6526,16 +6307,16 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
          /* Allocate the fixup regardless of whether we need a relocation.
             If we end up generating the relocation, we'll unallocate the
             fixup.  */
          /* Allocate the fixup regardless of whether we need a relocation.
             If we end up generating the relocation, we'll unallocate the
             fixup.  */
-         if (htab->fdpic_p && !info->shared
+         if (htab->fdpic_p && !bfd_link_pic (info)
              && r_type == R_SH_DIR32
              && (sec->flags & SEC_ALLOC) != 0)
            htab->srofixup->size += 4;
          break;
 
        case R_SH_TLS_LE_32:
              && r_type == R_SH_DIR32
              && (sec->flags & SEC_ALLOC) != 0)
            htab->srofixup->size += 4;
          break;
 
        case R_SH_TLS_LE_32:
-         if (info->shared && !info->pie)
+         if (bfd_link_dll (info))
            {
            {
-             (*_bfd_error_handler)
+             _bfd_error_handler
                (_("%B: TLS local exec code cannot be linked into shared objects"),
                 abfd);
              return FALSE;
                (_("%B: TLS local exec code cannot be linked into shared objects"),
                 abfd);
              return FALSE;
@@ -6563,7 +6344,7 @@ sh_elf_set_mach_from_flags (bfd *abfd)
 {
   flagword flags = elf_elfheader (abfd)->e_flags & EF_SH_MACH_MASK;
 
 {
   flagword flags = elf_elfheader (abfd)->e_flags & EF_SH_MACH_MASK;
 
-  if (flags >= sizeof(sh_ef_bfd_table))
+  if (flags >= ARRAY_SIZE (sh_ef_bfd_table))
     return FALSE;
 
   if (sh_ef_bfd_table[flags] == 0)
     return FALSE;
 
   if (sh_ef_bfd_table[flags] == 0)
@@ -6626,13 +6407,64 @@ sh_find_elf_flags (unsigned int arch_set)
   return sh_elf_get_flags_from_mach (bfd_mach);
 }
 
   return sh_elf_get_flags_from_mach (bfd_mach);
 }
 
+/* Merge the architecture type of two BFD files, such that the
+   resultant architecture supports all the features required
+   by the two input BFDs.
+   If the input BFDs are multually incompatible - i.e. one uses
+   DSP while the other uses FPU - or there is no known architecture
+   that fits the requirements then an error is emitted.  */
+
+static bfd_boolean
+sh_merge_bfd_arch (bfd *ibfd, struct bfd_link_info *info)
+{
+  bfd *obfd = info->output_bfd;
+  unsigned int old_arch, new_arch, merged_arch;
+
+  if (! _bfd_generic_verify_endian_match (ibfd, info))
+    return FALSE;
+
+  old_arch = sh_get_arch_up_from_bfd_mach (bfd_get_mach (obfd));
+  new_arch = sh_get_arch_up_from_bfd_mach (bfd_get_mach (ibfd));
+
+  merged_arch = SH_MERGE_ARCH_SET (old_arch, new_arch);
+
+  if (!SH_VALID_CO_ARCH_SET (merged_arch))
+    {
+      _bfd_error_handler
+       /* xgettext:c-format */
+       (_("%B: uses %s instructions while previous modules "
+          "use %s instructions"),
+        ibfd,
+        SH_ARCH_SET_HAS_DSP (new_arch) ? "dsp" : "floating point",
+        SH_ARCH_SET_HAS_DSP (new_arch) ? "floating point" : "dsp");
+      bfd_set_error (bfd_error_bad_value);
+      return FALSE;
+    }
+  else if (!SH_VALID_ARCH_SET (merged_arch))
+    {
+      _bfd_error_handler
+       /* xgettext:c-format */
+       (_("internal error: merge of architecture '%s' with "
+          "architecture '%s' produced unknown architecture"),
+        bfd_printable_name (obfd),
+        bfd_printable_name (ibfd));
+      bfd_set_error (bfd_error_bad_value);
+      return FALSE;
+    }
+
+  bfd_default_set_arch_mach (obfd, bfd_arch_sh,
+                            sh_get_bfd_mach_from_arch_set (merged_arch));
+
+  return TRUE;
+}
+
 /* This routine initialises the elf flags when required and
    calls sh_merge_bfd_arch() to check dsp/fpu compatibility.  */
 
 static bfd_boolean
 /* This routine initialises the elf flags when required and
    calls sh_merge_bfd_arch() to check dsp/fpu compatibility.  */
 
 static bfd_boolean
-sh_elf_merge_private_data (bfd *ibfd, bfd *obfd)
+sh_elf_merge_private_data (bfd *ibfd, struct bfd_link_info *info)
 {
 {
-  extern bfd_boolean sh_merge_bfd_arch (bfd *, bfd *);
+  bfd *obfd = info->output_bfd;
 
   if (! is_sh_elf (ibfd) || ! is_sh_elf (obfd))
     return TRUE;
 
   if (! is_sh_elf (ibfd) || ! is_sh_elf (obfd))
     return TRUE;
@@ -6644,13 +6476,13 @@ sh_elf_merge_private_data (bfd *ibfd, bfd *obfd)
       elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
       sh_elf_set_mach_from_flags (obfd);
       if (elf_elfheader (obfd)->e_flags & EF_SH_FDPIC)
       elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
       sh_elf_set_mach_from_flags (obfd);
       if (elf_elfheader (obfd)->e_flags & EF_SH_FDPIC)
-       elf_elfheader (obfd)->e_flags |= EF_SH_PIC;
+       elf_elfheader (obfd)->e_flags &= ~EF_SH_PIC;
     }
 
     }
 
-  if (! sh_merge_bfd_arch (ibfd, obfd))
+  if (! sh_merge_bfd_arch (ibfd, info))
     {
     {
-      _bfd_error_handler ("%B: uses instructions which are incompatible "
-                         "with instructions used in previous modules",
+      _bfd_error_handler (_("%B: uses instructions which are incompatible "
+                           "with instructions used in previous modules"),
                          ibfd);
       bfd_set_error (bfd_error_bad_value);
       return FALSE;
                          ibfd);
       bfd_set_error (bfd_error_bad_value);
       return FALSE;
@@ -6662,7 +6494,7 @@ sh_elf_merge_private_data (bfd *ibfd, bfd *obfd)
 
   if (fdpic_object_p (ibfd) != fdpic_object_p (obfd))
     {
 
   if (fdpic_object_p (ibfd) != fdpic_object_p (obfd))
     {
-      _bfd_error_handler ("%B: attempt to mix FDPIC and non-FDPIC objects",
+      _bfd_error_handler (_("%B: attempt to mix FDPIC and non-FDPIC objects"),
                          ibfd);
       bfd_set_error (bfd_error_bad_value);
       return FALSE;
                          ibfd);
       bfd_set_error (bfd_error_bad_value);
       return FALSE;
@@ -6717,9 +6549,9 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
 
       BFD_ASSERT (h->dynindx != -1);
 
 
       BFD_ASSERT (h->dynindx != -1);
 
-      splt = htab->splt;
-      sgotplt = htab->sgotplt;
-      srelplt = htab->srelplt;
+      splt = htab->root.splt;
+      sgotplt = htab->root.sgotplt;
+      srelplt = htab->root.srelplt;
       BFD_ASSERT (splt != NULL && sgotplt != NULL && srelplt != NULL);
 
       /* Get the index in the procedure linkage table which
       BFD_ASSERT (splt != NULL && sgotplt != NULL && srelplt != NULL);
 
       /* Get the index in the procedure linkage table which
@@ -6745,7 +6577,7 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
        got_offset = (plt_index + 3) * 4;
 
 #ifdef GOT_BIAS
        got_offset = (plt_index + 3) * 4;
 
 #ifdef GOT_BIAS
-      if (info->shared)
+      if (bfd_link_pic (info))
        got_offset -= GOT_BIAS;
 #endif
 
        got_offset -= GOT_BIAS;
 #endif
 
@@ -6754,7 +6586,7 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
              plt_info->symbol_entry,
              plt_info->symbol_entry_size);
 
              plt_info->symbol_entry,
              plt_info->symbol_entry_size);
 
-      if (info->shared || htab->fdpic_p)
+      if (bfd_link_pic (info) || htab->fdpic_p)
        {
          if (plt_info->symbol_fields.got20)
            {
        {
          if (plt_info->symbol_fields.got20)
            {
@@ -6823,7 +6655,7 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
 
       /* Make got_offset relative to the start of .got.plt.  */
 #ifdef GOT_BIAS
 
       /* Make got_offset relative to the start of .got.plt.  */
 #ifdef GOT_BIAS
-      if (info->shared)
+      if (bfd_link_pic (info))
        got_offset += GOT_BIAS;
 #endif
       if (htab->fdpic_p)
        got_offset += GOT_BIAS;
 #endif
       if (htab->fdpic_p)
@@ -6845,8 +6677,7 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
                  sgotplt->contents + got_offset);
       if (htab->fdpic_p)
        bfd_put_32 (output_bfd,
                  sgotplt->contents + got_offset);
       if (htab->fdpic_p)
        bfd_put_32 (output_bfd,
-                   sh_elf_osec_to_segment (output_bfd,
-                                           htab->splt->output_section),
+                   sh_elf_osec_to_segment (output_bfd, splt->output_section),
                    sgotplt->contents + got_offset + 4);
 
       /* Fill in the entry in the .rela.plt section.  */
                    sgotplt->contents + got_offset + 4);
 
       /* Fill in the entry in the .rela.plt section.  */
@@ -6864,7 +6695,7 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
       loc = srelplt->contents + plt_index * sizeof (Elf32_External_Rela);
       bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
 
       loc = srelplt->contents + plt_index * sizeof (Elf32_External_Rela);
       bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
 
-      if (htab->vxworks_p && !info->shared)
+      if (htab->vxworks_p && !bfd_link_pic (info))
        {
          /* Create the .rela.plt.unloaded relocations for this PLT entry.
             Begin by pointing LOC to the first such relocation.  */
        {
          /* Create the .rela.plt.unloaded relocations for this PLT entry.
             Begin by pointing LOC to the first such relocation.  */
@@ -6873,8 +6704,8 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
 
          /* Create a .rela.plt.unloaded R_SH_DIR32 relocation
             for the PLT entry's pointer to the .got.plt entry.  */
 
          /* Create a .rela.plt.unloaded R_SH_DIR32 relocation
             for the PLT entry's pointer to the .got.plt entry.  */
-         rel.r_offset = (htab->splt->output_section->vma
-                         + htab->splt->output_offset
+         rel.r_offset = (splt->output_section->vma
+                         + splt->output_offset
                          + h->plt.offset
                          + plt_info->symbol_fields.got_entry);
          rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_SH_DIR32);
                          + h->plt.offset
                          + plt_info->symbol_fields.got_entry);
          rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_SH_DIR32);
@@ -6913,8 +6744,8 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
       /* This symbol has an entry in the global offset table.  Set it
         up.  */
 
       /* This symbol has an entry in the global offset table.  Set it
         up.  */
 
-      sgot = htab->sgot;
-      srelgot = htab->srelgot;
+      sgot = htab->root.sgot;
+      srelgot = htab->root.srelgot;
       BFD_ASSERT (sgot != NULL && srelgot != NULL);
 
       rel.r_offset = (sgot->output_section->vma
       BFD_ASSERT (sgot != NULL && srelgot != NULL);
 
       rel.r_offset = (sgot->output_section->vma
@@ -6926,7 +6757,7 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
         of a version file, we just want to emit a RELATIVE reloc.
         The entry in the global offset table will already have been
         initialized in the relocate_section function.  */
         of a version file, we just want to emit a RELATIVE reloc.
         The entry in the global offset table will already have been
         initialized in the relocate_section function.  */
-      if (info->shared
+      if (bfd_link_pic (info)
          && SYMBOL_REFERENCES_LOCAL (info, h))
        {
          if (htab->fdpic_p)
          && SYMBOL_REFERENCES_LOCAL (info, h))
        {
          if (htab->fdpic_p)
@@ -6974,8 +6805,8 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
        /* This symbol has a datalabel entry in the global offset table.
           Set it up.  */
 
        /* This symbol has a datalabel entry in the global offset table.
           Set it up.  */
 
-       sgot = htab->sgot;
-       srelgot = htab->srelgot;
+       sgot = htab->root.sgot;
+       srelgot = htab->root.srelgot;
        BFD_ASSERT (sgot != NULL && srelgot != NULL);
 
        rel.r_offset = (sgot->output_section->vma
        BFD_ASSERT (sgot != NULL && srelgot != NULL);
 
        rel.r_offset = (sgot->output_section->vma
@@ -6987,7 +6818,7 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
           of a version file, we just want to emit a RELATIVE reloc.
           The entry in the global offset table will already have been
           initialized in the relocate_section function.  */
           of a version file, we just want to emit a RELATIVE reloc.
           The entry in the global offset table will already have been
           initialized in the relocate_section function.  */
-       if (info->shared
+       if (bfd_link_pic (info)
            && SYMBOL_REFERENCES_LOCAL (info, h))
          {
            if (htab->fdpic_p)
            && SYMBOL_REFERENCES_LOCAL (info, h))
          {
            if (htab->fdpic_p)
@@ -7070,7 +6901,7 @@ sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
   if (htab == NULL)
     return FALSE;
 
   if (htab == NULL)
     return FALSE;
 
-  sgotplt = htab->sgotplt;
+  sgotplt = htab->root.sgotplt;
   sdyn = bfd_get_linker_section (htab->root.dynobj, ".dynamic");
 
   if (htab->root.dynamic_sections_created)
   sdyn = bfd_get_linker_section (htab->root.dynobj, ".dynamic");
 
   if (htab->root.dynamic_sections_created)
@@ -7132,41 +6963,23 @@ sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
              break;
 
            case DT_JMPREL:
              break;
 
            case DT_JMPREL:
-             s = htab->srelplt->output_section;
+             s = htab->root.srelplt->output_section;
              BFD_ASSERT (s != NULL);
              dyn.d_un.d_ptr = s->vma;
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
              break;
 
            case DT_PLTRELSZ:
              BFD_ASSERT (s != NULL);
              dyn.d_un.d_ptr = s->vma;
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
              break;
 
            case DT_PLTRELSZ:
-             s = htab->srelplt->output_section;
+             s = htab->root.srelplt->output_section;
              BFD_ASSERT (s != NULL);
              dyn.d_un.d_val = s->size;
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
              break;
              BFD_ASSERT (s != NULL);
              dyn.d_un.d_val = s->size;
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
              break;
-
-           case DT_RELASZ:
-             /* My reading of the SVR4 ABI indicates that the
-                procedure linkage table relocs (DT_JMPREL) should be
-                included in the overall relocs (DT_RELA).  This is
-                what Solaris does.  However, UnixWare can not handle
-                that case.  Therefore, we override the DT_RELASZ entry
-                here to make it not include the JMPREL relocs.  Since
-                the linker script arranges for .rela.plt to follow all
-                other relocation sections, we don't have to worry
-                about changing the DT_RELA entry.  */
-             if (htab->srelplt != NULL)
-               {
-                 s = htab->srelplt->output_section;
-                 dyn.d_un.d_val -= s->size;
-               }
-             bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
-             break;
            }
        }
 
       /* Fill in the first entry in the procedure linkage table.  */
            }
        }
 
       /* Fill in the first entry in the procedure linkage table.  */
-      splt = htab->splt;
+      splt = htab->root.splt;
       if (splt && splt->size > 0 && htab->plt_info->plt0_entry)
        {
          unsigned int i;
       if (splt && splt->size > 0 && htab->plt_info->plt0_entry)
        {
          unsigned int i;
@@ -7262,9 +7075,9 @@ sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
     BFD_ASSERT (htab->srelfuncdesc->reloc_count * sizeof (Elf32_External_Rela)
                == htab->srelfuncdesc->size);
 
     BFD_ASSERT (htab->srelfuncdesc->reloc_count * sizeof (Elf32_External_Rela)
                == htab->srelfuncdesc->size);
 
-  if (htab->srelgot)
-    BFD_ASSERT (htab->srelgot->reloc_count * sizeof (Elf32_External_Rela)
-               == htab->srelgot->size);
+  if (htab->root.srelgot)
+    BFD_ASSERT (htab->root.srelgot->reloc_count * sizeof (Elf32_External_Rela)
+               == htab->root.srelgot->size);
 
   return TRUE;
 }
 
   return TRUE;
 }
@@ -7452,7 +7265,6 @@ sh_elf_encode_eh_address (bfd *abfd,
                                        sh_elf_merge_private_data
 
 #define elf_backend_gc_mark_hook       sh_elf_gc_mark_hook
                                        sh_elf_merge_private_data
 
 #define elf_backend_gc_mark_hook       sh_elf_gc_mark_hook
-#define elf_backend_gc_sweep_hook      sh_elf_gc_sweep_hook
 #define elf_backend_check_relocs       sh_elf_check_relocs
 #define elf_backend_copy_indirect_symbol \
                                        sh_elf_copy_indirect_symbol
 #define elf_backend_check_relocs       sh_elf_check_relocs
 #define elf_backend_copy_indirect_symbol \
                                        sh_elf_copy_indirect_symbol
@@ -7487,6 +7299,7 @@ sh_elf_encode_eh_address (bfd *abfd,
 #define elf_backend_plt_readonly       1
 #define elf_backend_want_plt_sym       0
 #define elf_backend_got_header_size    12
 #define elf_backend_plt_readonly       1
 #define elf_backend_want_plt_sym       0
 #define elf_backend_got_header_size    12
+#define elf_backend_dtrel_excludes_plt 1
 
 #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
 
 
 #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
 
This page took 0.066924 seconds and 4 git commands to generate.