* amd64-tdep.c (amd64_frame_cache): Fix comment.
[deliverable/binutils-gdb.git] / bfd / elf64-sh64.c
index e0bc8df7e5d0fd9e3f1e6e01ca9808ac18c4fb34..15c29924d96397579c55350a6d069623ddb665b8 100644 (file)
@@ -144,8 +144,8 @@ static bfd_boolean sh64_elf64_add_symbol_hook
   (bfd *, struct bfd_link_info *, const Elf_Internal_Sym *, const char **,
    flagword *, asection **, bfd_vma *);
 static bfd_boolean sh64_elf64_link_output_symbol_hook
-  (bfd *, struct bfd_link_info *, const char *, Elf_Internal_Sym *,
-   asection *);
+  (struct bfd_link_info *, const char *, Elf_Internal_Sym *, asection *,
+   struct elf_link_hash_entry *);
 static bfd_boolean sh64_elf64_fake_sections
   (bfd *, Elf_Internal_Shdr *, asection *);
 static void sh64_elf64_final_write_processing
@@ -1532,8 +1532,10 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
          || (r_type >= (int) R_SH_FIRST_INVALID_RELOC
              && r_type <= (int) R_SH_LAST_INVALID_RELOC)
          || (r_type >= (int) R_SH_DIR8WPN
-             && r_type <= (int) R_SH_LAST_INVALID_RELOC_2)
-         || (r_type >= (int) R_SH_FIRST_INVALID_RELOC_3
+             && r_type <= (int) R_SH_LAST_INVALID_RELOC)
+         || (r_type >= (int) R_SH_GNU_VTINHERIT
+             && r_type <= (int) R_SH_PSHL)
+         || (r_type >= (int) R_SH_FIRST_INVALID_RELOC_2
              && r_type <= R_SH_GOTPLT32)
          || (r_type >= (int) R_SH_FIRST_INVALID_RELOC_4
              && r_type <= (int) R_SH_LAST_INVALID_RELOC_4))
@@ -1580,7 +1582,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
            }
          else if (! howto->partial_inplace)
            {
-             relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
+             relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
              relocation |= ((sym->st_other & STO_SH5_ISA32) != 0);
            }
          else if ((sec->flags & SEC_MERGE)
@@ -2890,7 +2892,7 @@ sh64_elf64_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
 {
   /* We want to do this for relocatable as well as final linking.  */
   if (ELF_ST_TYPE (sym->st_info) == STT_DATALABEL
-      && info->hash->creator->flavour == bfd_target_elf_flavour)
+      && is_elf_hash_table (info->hash))
     {
       struct elf_link_hash_entry *h;
 
@@ -2980,11 +2982,11 @@ sh64_elf64_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
    DataLabel symbol.  */
 
 static bfd_boolean
-sh64_elf64_link_output_symbol_hook (bfd *abfd ATTRIBUTE_UNUSED,
-                                   struct bfd_link_info *info,
+sh64_elf64_link_output_symbol_hook (struct bfd_link_info *info,
                                    const char *cname,
                                    Elf_Internal_Sym *sym,
-                                   asection *input_sec ATTRIBUTE_UNUSED)
+                                   asection *input_sec ATTRIBUTE_UNUSED,
+                                   struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
 {
   char *name = (char *) cname;
 
@@ -4116,12 +4118,31 @@ sh64_elf64_finish_dynamic_sections (bfd *output_bfd,
   return TRUE;
 }
 
+/* Merge non visibility st_other attribute when the symbol comes from
+   a dynamic object.  */
+static void
+sh64_elf64_merge_symbol_attribute (struct elf_link_hash_entry *h,
+                                  const Elf_Internal_Sym *isym,
+                                  bfd_boolean definition,
+                                  bfd_boolean dynamic)
+{
+  if (isym->st_other != 0 && dynamic)
+    {
+      unsigned char other;
+
+      /* Take the balance of OTHER from the definition.  */
+      other = (definition ? isym->st_other : h->other);
+      other &= ~ ELF_ST_VISIBILITY (-1);
+      h->other = other | ELF_ST_VISIBILITY (h->other);
+    }
+
+  return;
+}
+
 static struct bfd_elf_special_section const sh64_elf64_special_sections[]=
 {
-  { ".cranges",                0,      NULL,   0,
-    SHT_PROGBITS,      0 },
-  { NULL,              0,      NULL,   0,
-    0,                 0 }
+  { ".cranges", 8, 0, SHT_PROGBITS, 0 },
+  { NULL,       0, 0, 0,            0 }
 };
 
 #define TARGET_BIG_SYM         bfd_elf64_sh64_vec
@@ -4164,6 +4185,9 @@ static struct bfd_elf_special_section const sh64_elf64_special_sections[]=
 #define elf_backend_link_output_symbol_hook \
        sh64_elf64_link_output_symbol_hook
 
+#define        elf_backend_merge_symbol_attribute \
+       sh64_elf64_merge_symbol_attribute
+
 #define elf_backend_final_write_processing \
        sh64_elf64_final_write_processing
 
@@ -4185,7 +4209,6 @@ static struct bfd_elf_special_section const sh64_elf64_special_sections[]=
 #define elf_backend_plt_readonly       1
 #define elf_backend_want_plt_sym       0
 #define elf_backend_got_header_size    24
-#define elf_backend_plt_header_size    PLT_ENTRY_SIZE
 
 #include "elf64-target.h"
 
This page took 0.024237 seconds and 4 git commands to generate.