sparc: support %dN and %qN syntax for FP registers.
[deliverable/binutils-gdb.git] / bfd / elf32-sh.c
index 8540f9f0fedee8b91df08077736c3fefae9ef99e..eebf380152dea916d7aacf0df280c84327b0c266 100644 (file)
@@ -1,7 +1,5 @@
 /* Renesas / SuperH SH specific support for 32-bit ELF
 /* Renesas / SuperH SH specific support for 32-bit ELF
-   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-   2006, 2007, 2008, 2009, 2010, 2011, 2012
-   Free Software Foundation, Inc.
+   Copyright (C) 1996-2015 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.
@@ -90,11 +88,11 @@ static bfd_boolean
 vxworks_object_p (bfd *abfd ATTRIBUTE_UNUSED)
 {
 #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
 vxworks_object_p (bfd *abfd ATTRIBUTE_UNUSED)
 {
 #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
-  extern const bfd_target bfd_elf32_shlvxworks_vec;
-  extern const bfd_target bfd_elf32_shvxworks_vec;
+  extern const bfd_target sh_elf32_vxworks_le_vec;
+  extern const bfd_target sh_elf32_vxworks_vec;
 
 
-  return (abfd->xvec == &bfd_elf32_shlvxworks_vec
-         || abfd->xvec == &bfd_elf32_shvxworks_vec);
+  return (abfd->xvec == &sh_elf32_vxworks_le_vec
+         || abfd->xvec == &sh_elf32_vxworks_vec);
 #else
   return FALSE;
 #endif
 #else
   return FALSE;
 #endif
@@ -106,11 +104,11 @@ static bfd_boolean
 fdpic_object_p (bfd *abfd ATTRIBUTE_UNUSED)
 {
 #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
 fdpic_object_p (bfd *abfd ATTRIBUTE_UNUSED)
 {
 #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
-  extern const bfd_target bfd_elf32_shfd_vec;
-  extern const bfd_target bfd_elf32_shbfd_vec;
+  extern const bfd_target sh_elf32_fdpic_le_vec;
+  extern const bfd_target sh_elf32_fdpic_be_vec;
 
 
-  return (abfd->xvec == &bfd_elf32_shfd_vec
-         || abfd->xvec == &bfd_elf32_shbfd_vec);
+  return (abfd->xvec == &sh_elf32_fdpic_le_vec
+         || abfd->xvec == &sh_elf32_fdpic_be_vec);
 #else
   return FALSE;
 #endif
 #else
   return FALSE;
 #endif
@@ -257,6 +255,11 @@ sh_elf_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol_in,
       && bfd_is_und_section (symbol_in->section))
     return bfd_reloc_undefined;
 
       && bfd_is_und_section (symbol_in->section))
     return bfd_reloc_undefined;
 
+  /* PR 17512: file: 9891ca98.  */
+  if (addr * bfd_octets_per_byte (abfd) + bfd_get_reloc_size (reloc_entry->howto)
+      > bfd_get_section_limit_octets (abfd, input_section))
+    return bfd_reloc_outofrange;
+
   if (bfd_is_com_section (symbol_in->section))
     sym_value = 0;
   else
   if (bfd_is_com_section (symbol_in->section))
     sym_value = 0;
   else
@@ -476,13 +479,19 @@ sh_elf_info_to_howto (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
 
   r = ELF32_R_TYPE (dst->r_info);
 
 
   r = ELF32_R_TYPE (dst->r_info);
 
-  BFD_ASSERT (r < (unsigned int) R_SH_max);
-  BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC || r > R_SH_LAST_INVALID_RELOC);
-  BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_2 || r > R_SH_LAST_INVALID_RELOC_2);
-  BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_3 || r > R_SH_LAST_INVALID_RELOC_3);
-  BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_4 || r > R_SH_LAST_INVALID_RELOC_4);
-  BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_5 || r > R_SH_LAST_INVALID_RELOC_5);
-  BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_6 || r > R_SH_LAST_INVALID_RELOC_6);
+  if (r >= R_SH_max
+      || (r >= R_SH_FIRST_INVALID_RELOC   && r <= R_SH_LAST_INVALID_RELOC)
+      || (r >= R_SH_FIRST_INVALID_RELOC_2 && r <= R_SH_LAST_INVALID_RELOC_2)
+      || (r >= R_SH_FIRST_INVALID_RELOC_3 && r <= R_SH_LAST_INVALID_RELOC_3)
+      || (r >= R_SH_FIRST_INVALID_RELOC_4 && r <= R_SH_LAST_INVALID_RELOC_4)
+      || (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) (_("%B: unrecognised SH reloc number: %d"),
+                            abfd, r);
+      bfd_set_error (bfd_error_bad_value);
+      r = R_SH_NONE;
+    }
 
   cache_ptr->howto = get_howto_table (abfd) + r;
 }
 
   cache_ptr->howto = get_howto_table (abfd) + r;
 }
@@ -510,7 +519,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;
@@ -704,10 +713,10 @@ sh_elf_relax_section (bfd *abfd, asection *sec,
       elf_section_data (sec)->this_hdr.contents = contents;
       symtab_hdr->contents = (unsigned char *) isymbuf;
 
       elf_section_data (sec)->this_hdr.contents = contents;
       symtab_hdr->contents = (unsigned char *) isymbuf;
 
-      /* Replace the jsr with a bsr.  */
+      /* Replace the jmp/jsr with a bra/bsr.  */
 
       /* Change the R_SH_USES reloc into an R_SH_IND12W reloc, and
 
       /* Change the R_SH_USES reloc into an R_SH_IND12W reloc, and
-        replace the jsr with a bsr.  */
+        replace the jmp/jsr with a bra/bsr.  */
       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_SH_IND12W);
       /* We used to test (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
         here, but that only checks if the symbol is an external symbol,
       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_SH_IND12W);
       /* We used to test (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
         here, but that only checks if the symbol is an external symbol,
@@ -718,7 +727,10 @@ sh_elf_relax_section (bfd *abfd, asection *sec,
       /* We can't fully resolve this yet, because the external
         symbol value may be changed by future relaxing.  We let
         the final link phase handle it.  */
       /* We can't fully resolve this yet, because the external
         symbol value may be changed by future relaxing.  We let
         the final link phase handle it.  */
-      bfd_put_16 (abfd, (bfd_vma) 0xb000, contents + irel->r_offset);
+      if (bfd_get_16 (abfd, contents + irel->r_offset) & 0x0020)
+       bfd_put_16 (abfd, (bfd_vma) 0xa000, contents + irel->r_offset);
+      else
+       bfd_put_16 (abfd, (bfd_vma) 0xb000, contents + irel->r_offset);
 
       irel->r_addend = -4;
 
 
       irel->r_addend = -4;
 
@@ -2549,7 +2561,7 @@ sh_elf_link_hash_table_create (bfd *abfd)
   struct elf_sh_link_hash_table *ret;
   bfd_size_type amt = sizeof (struct elf_sh_link_hash_table);
 
   struct elf_sh_link_hash_table *ret;
   bfd_size_type amt = sizeof (struct elf_sh_link_hash_table);
 
-  ret = (struct elf_sh_link_hash_table *) bfd_malloc (amt);
+  ret = (struct elf_sh_link_hash_table *) bfd_zmalloc (amt);
   if (ret == (struct elf_sh_link_hash_table *) NULL)
     return NULL;
 
   if (ret == (struct elf_sh_link_hash_table *) NULL)
     return NULL;
 
@@ -2562,17 +2574,6 @@ sh_elf_link_hash_table_create (bfd *abfd)
       return NULL;
     }
 
       return NULL;
     }
 
-  ret->sgot = NULL;
-  ret->sgotplt = NULL;
-  ret->srelgot = NULL;
-  ret->splt = NULL;
-  ret->srelplt = NULL;
-  ret->sdynbss = NULL;
-  ret->srelbss = NULL;
-  ret->srelplt2 = NULL;
-  ret->sym_cache.abfd = NULL;
-  ret->tls_ldm_got.refcount = 0;
-  ret->plt_info = NULL;
   ret->vxworks_p = vxworks_object_p (abfd);
   ret->fdpic_p = fdpic_object_p (abfd);
 
   ret->vxworks_p = vxworks_object_p (abfd);
   ret->fdpic_p = fdpic_object_p (abfd);
 
@@ -2732,7 +2733,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;
     }
@@ -2775,7 +2776,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
@@ -2870,7 +2871,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
@@ -2929,7 +2930,7 @@ sh_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
       h->needs_copy = 1;
     }
 
       h->needs_copy = 1;
     }
 
-  return _bfd_elf_adjust_dynamic_copy (h, s);
+  return _bfd_elf_adjust_dynamic_copy (info, h, s);
 }
 
 /* Allocate space in .plt, .got and associated reloc sections for
 }
 
 /* Allocate space in .plt, .got and associated reloc sections for
@@ -2977,7 +2978,7 @@ 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))
        {
          asection *s = htab->splt;
          || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
        {
          asection *s = htab->splt;
@@ -2997,7 +2998,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;
@@ -3020,7 +3021,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
          /* We also need to make an entry in the .rel.plt section.  */
          htab->srelplt->size += sizeof (Elf32_External_Rela);
 
          /* We also need to make an entry in the .rel.plt section.  */
          htab->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
@@ -3074,13 +3075,15 @@ 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.  */
        ;
       /* R_SH_TLS_IE_32 needs one dynamic relocation if dynamic,
         R_SH_TLS_GD needs one if local symbol and two if global.  */
@@ -3091,17 +3094,19 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
        htab->srelgot->size += 2 * sizeof (Elf32_External_Rela);
       else if (got_type == GOT_FUNCDESC)
        {
        htab->srelgot->size += 2 * sizeof (Elf32_External_Rela);
       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->srelgot->size += sizeof (Elf32_External_Rela);
        }
       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
                || h->root.type != bfd_link_hash_undefweak)
            htab->srofixup->size += 4;
          else
            htab->srelgot->size += sizeof (Elf32_External_Rela);
        }
       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)))
        htab->srelgot->size += sizeof (Elf32_External_Rela);
                   || 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
+      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;
@@ -3128,7 +3133,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
       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))
+      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h))
        htab->srelgot->size += sizeof (Elf32_External_Rela);
     }
   else
        htab->srelgot->size += sizeof (Elf32_External_Rela);
     }
   else
@@ -3145,7 +3150,7 @@ 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->srelgot->size
        htab->srofixup->size += eh->abs_funcdesc_refcount * 4;
       else
        htab->srelgot->size
@@ -3169,7 +3174,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);
@@ -3184,7 +3189,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))
        {
@@ -3272,7 +3277,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);
     }
 
@@ -3312,9 +3317,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;
@@ -3343,7 +3349,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);
@@ -3354,7 +3360,7 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 
   /* Set up .got offsets for local syms, and space for local dynamic
      relocs.  */
 
   /* Set up .got offsets for local syms, and space for local dynamic
      relocs.  */
-  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
+  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
     {
       bfd_signed_vma *local_got;
       bfd_signed_vma *end_local_got;
     {
       bfd_signed_vma *local_got;
       bfd_signed_vma *end_local_got;
@@ -3399,7 +3405,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);
                }
            }
@@ -3428,7 +3434,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;
@@ -3469,7 +3475,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);
@@ -3588,7 +3594,7 @@ 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;
@@ -3602,8 +3608,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;
@@ -3689,7 +3694,9 @@ sh_elf_osec_to_segment (bfd *output_bfd, asection *osec)
 {
   Elf_Internal_Phdr *p = NULL;
 
 {
   Elf_Internal_Phdr *p = NULL;
 
-  if (output_bfd->xvec->flavour == bfd_target_elf_flavour)
+  if (output_bfd->xvec->flavour == bfd_target_elf_flavour
+      /* PR ld/17110: Do not look for output segments in an input bfd.  */
+      && output_bfd->direction != read_direction)
     p = _bfd_elf_find_segment_containing_section (output_bfd, osec);
 
   /* FIXME: Nothing ever says what this index is relative to.  The kernel
     p = _bfd_elf_find_segment_containing_section (output_bfd, osec);
 
   /* FIXME: Nothing ever says what this index is relative to.  The kernel
@@ -3746,7 +3753,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)
        {
@@ -3863,7 +3870,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"));
 
@@ -3953,7 +3960,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
          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,
@@ -4068,8 +4075,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
@@ -4077,7 +4086,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
@@ -4110,7 +4119,7 @@ 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_elf_section_offset (output_bfd, info,
                                                    input_section,
                                                    rel->r_offset)
@@ -4131,7 +4140,7 @@ 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)
+         else if (!bfd_link_relocatable (info))
            {
              if (! info->callbacks->undefined_symbol
                  (info, h->root.root.string, input_bfd,
            {
              if (! info->callbacks->undefined_symbol
                  (info, h->root.root.string, input_bfd,
@@ -4146,7 +4155,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
                                         rel, 1, relend, howto, 0, contents);
 
        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
@@ -4233,7 +4242,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
              ((*_bfd_error_handler)
               (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
                input_section->owner,
              ((*_bfd_error_handler)
               (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
                input_section->owner,
-               (unsigned long) rel->r_offset, howto->name, 
+               (unsigned long) rel->r_offset, howto->name,
                (unsigned long) relocation));
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
                (unsigned long) relocation));
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
@@ -4248,7 +4257,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
              ((*_bfd_error_handler)
               (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
                input_section->owner,
              ((*_bfd_error_handler)
               (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
                input_section->owner,
-               (unsigned long) rel->r_offset, howto->name, 
+               (unsigned long) rel->r_offset, howto->name,
                (unsigned long) relocation));
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
                (unsigned long) relocation));
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
@@ -4291,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)
@@ -4406,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)
            {
@@ -4436,6 +4445,12 @@ 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;
            }
+           /* We don't want warnings for non-NULL tests on undefined weak
+              symbols.  */
+           else if (r_type == R_SH_REL32
+                    && h
+                    && h->root.type == bfd_link_hash_undefweak)
+             check_segment[0] = check_segment[1] = -1;
          goto final_link_relocate;
 
        case R_SH_GOTPLT32:
          goto final_link_relocate;
 
        case R_SH_GOTPLT32:
@@ -4452,7 +4467,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
@@ -4509,8 +4524,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))
@@ -4547,7 +4564,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))
@@ -4593,7 +4610,7 @@ 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;
@@ -4880,7 +4897,7 @@ 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;
 
              {
                bfd_vma offset;
 
@@ -5083,7 +5100,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;
@@ -5327,7 +5344,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;
@@ -5406,7 +5423,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);
@@ -5422,7 +5439,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;
@@ -5465,7 +5482,7 @@ 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
                    (_("%X%C: relocation to \"%s\" references a different segment\n"),
                {
                  info->callbacks->einfo
                    (_("%X%C: relocation to \"%s\" references a different segment\n"),
@@ -5478,7 +5495,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                   input_bfd, input_section, rel->r_offset, symname);
            }
 
                   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)
@@ -5682,7 +5699,7 @@ sh_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
   union gotref *local_funcdesc;
   const Elf_Internal_Rela *rel, *relend;
 
   union gotref *local_funcdesc;
   const Elf_Internal_Rela *rel, *relend;
 
-  if (info->relocatable)
+  if (bfd_link_relocatable (info))
     return TRUE;
 
   elf_section_data (sec)->local_dynrel = NULL;
     return TRUE;
 
   elf_section_data (sec)->local_dynrel = NULL;
@@ -5794,7 +5811,7 @@ sh_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
        case R_SH_FUNCDESC:
          if (h != NULL)
            sh_elf_hash_entry (h)->abs_funcdesc_refcount -= 1;
        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)
+         else if (sh_elf_hash_table (info)->fdpic_p && !bfd_link_pic (info))
            sh_elf_hash_table (info)->srofixup->size -= 4;
 
          /* Fall through.  */
            sh_elf_hash_table (info)->srofixup->size -= 4;
 
          /* Fall through.  */
@@ -5808,13 +5825,13 @@ sh_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
          break;
 
        case R_SH_DIR32:
          break;
 
        case R_SH_DIR32:
-         if (sh_elf_hash_table (info)->fdpic_p && !info->shared
+         if (sh_elf_hash_table (info)->fdpic_p && !bfd_link_pic (info)
              && (sec->flags & SEC_ALLOC) != 0)
            sh_elf_hash_table (info)->srofixup->size -= 4;
          /* Fall thru */
 
        case R_SH_REL32:
              && (sec->flags & SEC_ALLOC) != 0)
            sh_elf_hash_table (info)->srofixup->size -= 4;
          /* Fall thru */
 
        case R_SH_REL32:
-         if (info->shared)
+         if (bfd_link_pic (info))
            break;
          /* Fall thru */
 
            break;
          /* Fall thru */
 
@@ -5933,9 +5950,9 @@ sh_elf_copy_indirect_symbol (struct bfd_link_info *info,
   eind->datalabel_got.refcount = 0;
 #endif
   edir->funcdesc.refcount += eind->funcdesc.refcount;
   eind->datalabel_got.refcount = 0;
 #endif
   edir->funcdesc.refcount += eind->funcdesc.refcount;
-  eind->funcdesc.refcount = 0;  
+  eind->funcdesc.refcount = 0;
   edir->abs_funcdesc_refcount += eind->abs_funcdesc_refcount;
   edir->abs_funcdesc_refcount += eind->abs_funcdesc_refcount;
-  eind->abs_funcdesc_refcount = 0;  
+  eind->abs_funcdesc_refcount = 0;
 
   if (ind->root.type == bfd_link_hash_indirect
       && dir->got.refcount <= 0)
 
   if (ind->root.type == bfd_link_hash_indirect
       && dir->got.refcount <= 0)
@@ -5963,7 +5980,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)
@@ -5999,7 +6016,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));
@@ -6036,10 +6053,14 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
 #endif
              h = (struct elf_link_hash_entry *) h->root.u.i.link;
            }
 #endif
              h = (struct elf_link_hash_entry *) h->root.u.i.link;
            }
+
+         /* PR15323, ref flags aren't set for references in the same
+            object.  */
+         h->root.non_ir_ref = 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
@@ -6147,7 +6168,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 */
@@ -6316,7 +6337,7 @@ 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->srelgot->size += sizeof (Elf32_External_Rela);
                    htab->srofixup->size += 4;
                  else
                    htab->srelgot->size += sizeof (Elf32_External_Rela);
@@ -6359,7 +6380,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;
@@ -6404,7 +6425,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;
@@ -6429,14 +6450,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
@@ -6513,14 +6534,14 @@ 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)
                (_("%B: TLS local exec code cannot be linked into shared objects"),
            {
              (*_bfd_error_handler)
                (_("%B: TLS local exec code cannot be linked into shared objects"),
@@ -6555,7 +6576,7 @@ sh_elf_set_mach_from_flags (bfd *abfd)
 
   if (sh_ef_bfd_table[flags] == 0)
     return FALSE;
 
   if (sh_ef_bfd_table[flags] == 0)
     return FALSE;
-  
+
   bfd_default_set_arch_mach (abfd, bfd_arch_sh, sh_ef_bfd_table[flags]);
 
   return TRUE;
   bfd_default_set_arch_mach (abfd, bfd_arch_sh, sh_ef_bfd_table[flags]);
 
   return TRUE;
@@ -6571,11 +6592,11 @@ int
 sh_elf_get_flags_from_mach (unsigned long mach)
 {
   int i = ARRAY_SIZE (sh_ef_bfd_table) - 1;
 sh_elf_get_flags_from_mach (unsigned long mach)
 {
   int i = ARRAY_SIZE (sh_ef_bfd_table) - 1;
-  
+
   for (; i>0; i--)
     if (sh_ef_bfd_table[i] == mach)
       return i;
   for (; i>0; i--)
     if (sh_ef_bfd_table[i] == mach)
       return i;
-  
+
   /* shouldn't get here */
   BFD_FAIL();
 
   /* shouldn't get here */
   BFD_FAIL();
 
@@ -6583,34 +6604,19 @@ sh_elf_get_flags_from_mach (unsigned long mach)
 }
 #endif /* not sh_elf_set_mach_from_flags */
 
 }
 #endif /* not sh_elf_set_mach_from_flags */
 
-#ifndef sh_elf_set_private_flags
-/* Function to keep SH specific file flags.  */
-
-static bfd_boolean
-sh_elf_set_private_flags (bfd *abfd, flagword flags)
-{
-  BFD_ASSERT (! elf_flags_init (abfd)
-             || elf_elfheader (abfd)->e_flags == flags);
-
-  elf_elfheader (abfd)->e_flags = flags;
-  elf_flags_init (abfd) = TRUE;
-  return sh_elf_set_mach_from_flags (abfd);
-}
-#endif /* not sh_elf_set_private_flags */
-
 #ifndef sh_elf_copy_private_data
 /* Copy backend specific data from one object module to another */
 
 static bfd_boolean
 sh_elf_copy_private_data (bfd * ibfd, bfd * obfd)
 {
 #ifndef sh_elf_copy_private_data
 /* Copy backend specific data from one object module to another */
 
 static bfd_boolean
 sh_elf_copy_private_data (bfd * ibfd, bfd * obfd)
 {
-  /* Copy object attributes.  */
-  _bfd_elf_copy_obj_attributes (ibfd, obfd);
-
   if (! is_sh_elf (ibfd) || ! is_sh_elf (obfd))
     return TRUE;
 
   if (! is_sh_elf (ibfd) || ! is_sh_elf (obfd))
     return TRUE;
 
-  return sh_elf_set_private_flags (obfd, elf_elfheader (ibfd)->e_flags);
+  if (! _bfd_elf_copy_private_bfd_data (ibfd, obfd))
+    return FALSE;
+
+  return sh_elf_set_mach_from_flags (obfd);
 }
 #endif /* not sh_elf_copy_private_data */
 
 }
 #endif /* not sh_elf_copy_private_data */
 
@@ -6646,7 +6652,7 @@ 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, obfd))
@@ -6747,7 +6753,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
 
@@ -6756,7 +6762,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)
            {
@@ -6825,7 +6831,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)
@@ -6866,7 +6872,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.  */
@@ -6928,7 +6934,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)
@@ -6989,7 +6995,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)
@@ -7245,7 +7251,7 @@ sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
 
   if (sgotplt && sgotplt->size > 0)
     elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4;
 
   if (sgotplt && sgotplt->size > 0)
     elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4;
-    
+
   /* At the very end of the .rofixup section is a pointer to the GOT.  */
   if (htab->fdpic_p && htab->srofixup != NULL)
     {
   /* At the very end of the .rofixup section is a pointer to the GOT.  */
   if (htab->fdpic_p && htab->srofixup != NULL)
     {
@@ -7272,7 +7278,9 @@ sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
 }
 
 static enum elf_reloc_type_class
 }
 
 static enum elf_reloc_type_class
-sh_elf_reloc_type_class (const Elf_Internal_Rela *rela)
+sh_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
+                        const asection *rel_sec ATTRIBUTE_UNUSED,
+                        const Elf_Internal_Rela *rela)
 {
   switch ((int) ELF32_R_TYPE (rela->r_info))
     {
 {
   switch ((int) ELF32_R_TYPE (rela->r_info))
     {
@@ -7303,10 +7311,10 @@ elf32_shlin_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
 
       case 168:                /* Linux/SH */
        /* pr_cursig */
 
       case 168:                /* Linux/SH */
        /* pr_cursig */
-       elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
+       elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
 
        /* pr_pid */
 
        /* pr_pid */
-       elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24);
+       elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
 
        /* pr_reg */
        offset = 72;
 
        /* pr_reg */
        offset = 72;
@@ -7329,9 +7337,9 @@ elf32_shlin_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
        return FALSE;
 
       case 124:                /* Linux/SH elf_prpsinfo */
        return FALSE;
 
       case 124:                /* Linux/SH elf_prpsinfo */
-       elf_tdata (abfd)->core_program
+       elf_tdata (abfd)->core->program
         = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
         = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
-       elf_tdata (abfd)->core_command
+       elf_tdata (abfd)->core->command
         = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
     }
 
         = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
     }
 
@@ -7340,7 +7348,7 @@ elf32_shlin_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
      implementations, so strip it off if it exists.  */
 
   {
      implementations, so strip it off if it exists.  */
 
   {
-    char *command = elf_tdata (abfd)->core_command;
+    char *command = elf_tdata (abfd)->core->command;
     int n = strlen (command);
 
     if (0 < n && command[n - 1] == ' ')
     int n = strlen (command);
 
     if (0 < n && command[n - 1] == ' ')
@@ -7351,7 +7359,7 @@ elf32_shlin_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
 }
 #endif /* not SH_TARGET_ALREADY_DEFINED */
 
 }
 #endif /* not SH_TARGET_ALREADY_DEFINED */
 
+
 /* Return address for Ith PLT stub in section PLT, for relocation REL
    or (bfd_vma) -1 if it should not be included.  */
 
 /* Return address for Ith PLT stub in section PLT, for relocation REL
    or (bfd_vma) -1 if it should not be included.  */
 
@@ -7419,9 +7427,9 @@ sh_elf_encode_eh_address (bfd *abfd,
 }
 
 #if !defined SH_TARGET_ALREADY_DEFINED
 }
 
 #if !defined SH_TARGET_ALREADY_DEFINED
-#define TARGET_BIG_SYM         bfd_elf32_sh_vec
+#define TARGET_BIG_SYM         sh_elf32_vec
 #define TARGET_BIG_NAME                "elf32-sh"
 #define TARGET_BIG_NAME                "elf32-sh"
-#define TARGET_LITTLE_SYM      bfd_elf32_shl_vec
+#define TARGET_LITTLE_SYM      sh_elf32_le_vec
 #define TARGET_LITTLE_NAME     "elf32-shl"
 #endif
 
 #define TARGET_LITTLE_NAME     "elf32-shl"
 #endif
 
@@ -7446,8 +7454,6 @@ sh_elf_encode_eh_address (bfd *abfd,
                                        sh_elf_get_relocated_section_contents
 #define bfd_elf32_mkobject             sh_elf_mkobject
 #define elf_backend_object_p           sh_elf_object_p
                                        sh_elf_get_relocated_section_contents
 #define bfd_elf32_mkobject             sh_elf_mkobject
 #define elf_backend_object_p           sh_elf_object_p
-#define bfd_elf32_bfd_set_private_bfd_flags \
-                                       sh_elf_set_private_flags
 #define bfd_elf32_bfd_copy_private_bfd_data \
                                        sh_elf_copy_private_data
 #define bfd_elf32_bfd_merge_private_bfd_data \
 #define bfd_elf32_bfd_copy_private_bfd_data \
                                        sh_elf_copy_private_data
 #define bfd_elf32_bfd_merge_private_bfd_data \
@@ -7496,11 +7502,11 @@ sh_elf_encode_eh_address (bfd *abfd,
 
 /* NetBSD support.  */
 #undef TARGET_BIG_SYM
 
 /* NetBSD support.  */
 #undef TARGET_BIG_SYM
-#define        TARGET_BIG_SYM                  bfd_elf32_shnbsd_vec
+#define        TARGET_BIG_SYM                  sh_elf32_nbsd_vec
 #undef TARGET_BIG_NAME
 #define        TARGET_BIG_NAME                 "elf32-sh-nbsd"
 #undef TARGET_LITTLE_SYM
 #undef TARGET_BIG_NAME
 #define        TARGET_BIG_NAME                 "elf32-sh-nbsd"
 #undef TARGET_LITTLE_SYM
-#define        TARGET_LITTLE_SYM               bfd_elf32_shlnbsd_vec
+#define        TARGET_LITTLE_SYM               sh_elf32_nbsd_le_vec
 #undef TARGET_LITTLE_NAME
 #define        TARGET_LITTLE_NAME              "elf32-shl-nbsd"
 #undef ELF_MAXPAGESIZE
 #undef TARGET_LITTLE_NAME
 #define        TARGET_LITTLE_NAME              "elf32-shl-nbsd"
 #undef ELF_MAXPAGESIZE
@@ -7516,11 +7522,11 @@ sh_elf_encode_eh_address (bfd *abfd,
 
 /* Linux support.  */
 #undef TARGET_BIG_SYM
 
 /* Linux support.  */
 #undef TARGET_BIG_SYM
-#define        TARGET_BIG_SYM                  bfd_elf32_shblin_vec
+#define        TARGET_BIG_SYM                  sh_elf32_linux_be_vec
 #undef TARGET_BIG_NAME
 #define        TARGET_BIG_NAME                 "elf32-shbig-linux"
 #undef TARGET_LITTLE_SYM
 #undef TARGET_BIG_NAME
 #define        TARGET_BIG_NAME                 "elf32-shbig-linux"
 #undef TARGET_LITTLE_SYM
-#define        TARGET_LITTLE_SYM               bfd_elf32_shlin_vec
+#define        TARGET_LITTLE_SYM               sh_elf32_linux_vec
 #undef TARGET_LITTLE_NAME
 #define        TARGET_LITTLE_NAME              "elf32-sh-linux"
 #undef ELF_COMMONPAGESIZE
 #undef TARGET_LITTLE_NAME
 #define        TARGET_LITTLE_NAME              "elf32-sh-linux"
 #undef ELF_COMMONPAGESIZE
@@ -7538,11 +7544,11 @@ sh_elf_encode_eh_address (bfd *abfd,
 
 /* FDPIC support.  */
 #undef TARGET_BIG_SYM
 
 /* FDPIC support.  */
 #undef TARGET_BIG_SYM
-#define        TARGET_BIG_SYM                  bfd_elf32_shbfd_vec
+#define        TARGET_BIG_SYM                  sh_elf32_fdpic_be_vec
 #undef TARGET_BIG_NAME
 #define        TARGET_BIG_NAME                 "elf32-shbig-fdpic"
 #undef TARGET_LITTLE_SYM
 #undef TARGET_BIG_NAME
 #define        TARGET_BIG_NAME                 "elf32-shbig-fdpic"
 #undef TARGET_LITTLE_SYM
-#define        TARGET_LITTLE_SYM               bfd_elf32_shfd_vec
+#define        TARGET_LITTLE_SYM               sh_elf32_fdpic_le_vec
 #undef TARGET_LITTLE_NAME
 #define        TARGET_LITTLE_NAME              "elf32-sh-fdpic"
 
 #undef TARGET_LITTLE_NAME
 #define        TARGET_LITTLE_NAME              "elf32-sh-fdpic"
 
@@ -7555,11 +7561,11 @@ sh_elf_encode_eh_address (bfd *abfd,
 
 /* VxWorks support.  */
 #undef TARGET_BIG_SYM
 
 /* VxWorks support.  */
 #undef TARGET_BIG_SYM
-#define        TARGET_BIG_SYM                  bfd_elf32_shvxworks_vec
+#define        TARGET_BIG_SYM                  sh_elf32_vxworks_vec
 #undef TARGET_BIG_NAME
 #define        TARGET_BIG_NAME                 "elf32-sh-vxworks"
 #undef TARGET_LITTLE_SYM
 #undef TARGET_BIG_NAME
 #define        TARGET_BIG_NAME                 "elf32-sh-vxworks"
 #undef TARGET_LITTLE_SYM
-#define        TARGET_LITTLE_SYM               bfd_elf32_shlvxworks_vec
+#define        TARGET_LITTLE_SYM               sh_elf32_vxworks_le_vec
 #undef TARGET_LITTLE_NAME
 #define        TARGET_LITTLE_NAME              "elf32-shl-vxworks"
 #undef elf32_bed
 #undef TARGET_LITTLE_NAME
 #define        TARGET_LITTLE_NAME              "elf32-shl-vxworks"
 #undef elf32_bed
This page took 0.039982 seconds and 4 git commands to generate.