daily update
[deliverable/binutils-gdb.git] / bfd / elf64-x86-64.c
index 9406479d66e1a5f8fe4db27c2ff66bcb487860fb..56a1f814eb230c67b11e03905c3b370a634d5c8a 100644 (file)
@@ -1,6 +1,6 @@
 /* X86-64 specific support for ELF
    Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
-   2010, 2011, 2012
+   2010, 2011, 2012, 2013
    Free Software Foundation, Inc.
    Contributed by Jan Hubicka <jh@suse.cz>.
 
@@ -1519,6 +1519,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
 
          /* It is referenced by a non-shared object. */
          h->ref_regular = 1;
+         h->root.non_ir_ref = 1;
        }
 
       if (! elf_x86_64_tls_transition (info, abfd, sec, NULL,
@@ -2259,6 +2260,7 @@ elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
     return _bfd_elf_allocate_ifunc_dyn_relocs (info, h,
                                               &eh->dyn_relocs,
                                               plt_entry_size,
+                                              plt_entry_size,
                                               GOT_ENTRY_SIZE);
   else if (htab->elf.dynamic_sections_created
           && h->plt.refcount > 0)
@@ -4330,6 +4332,11 @@ direct:
          relocation = elf_x86_64_tpoff (info, relocation);
          break;
 
+       case R_X86_64_DTPOFF64:
+         BFD_ASSERT ((input_section->flags & SEC_CODE) == 0);
+         relocation -= elf_x86_64_dtpoff_base (info);
+         break;
+
        default:
          break;
        }
@@ -4666,7 +4673,9 @@ elf_x86_64_finish_local_dynamic_symbol (void **slot, void *inf)
    dynamic linker, before writing them out.  */
 
 static enum elf_reloc_type_class
-elf_x86_64_reloc_type_class (const Elf_Internal_Rela *rela)
+elf_x86_64_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))
     {
@@ -5038,49 +5047,33 @@ elf_x86_64_common_section (asection *sec)
 }
 
 static bfd_boolean
-elf_x86_64_merge_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
-                        struct elf_link_hash_entry **sym_hash ATTRIBUTE_UNUSED,
-                        struct elf_link_hash_entry *h,
-                        Elf_Internal_Sym *sym,
+elf_x86_64_merge_symbol (struct elf_link_hash_entry *h,
+                        const Elf_Internal_Sym *sym,
                         asection **psec,
-                        bfd_vma *pvalue ATTRIBUTE_UNUSED,
-                        unsigned int *pold_alignment ATTRIBUTE_UNUSED,
-                        bfd_boolean *skip ATTRIBUTE_UNUSED,
-                        bfd_boolean *override ATTRIBUTE_UNUSED,
-                        bfd_boolean *type_change_ok ATTRIBUTE_UNUSED,
-                        bfd_boolean *size_change_ok ATTRIBUTE_UNUSED,
-                        bfd_boolean *newdyn ATTRIBUTE_UNUSED,
-                        bfd_boolean *newdef,
-                        bfd_boolean *newdyncommon ATTRIBUTE_UNUSED,
-                        bfd_boolean *newweak ATTRIBUTE_UNUSED,
-                        bfd *abfd ATTRIBUTE_UNUSED,
-                        asection **sec,
-                        bfd_boolean *olddyn ATTRIBUTE_UNUSED,
-                        bfd_boolean *olddef,
-                        bfd_boolean *olddyncommon ATTRIBUTE_UNUSED,
-                        bfd_boolean *oldweak ATTRIBUTE_UNUSED,
+                        bfd_boolean newdef,
+                        bfd_boolean olddef,
                         bfd *oldbfd,
-                        asection **oldsec)
+                        const asection *oldsec)
 {
   /* A normal common symbol and a large common symbol result in a
      normal common symbol.  We turn the large common symbol into a
      normal one.  */
-  if (!*olddef
+  if (!olddef
       && h->root.type == bfd_link_hash_common
-      && !*newdef
-      && bfd_is_com_section (*sec)
-      && *oldsec != *sec)
+      && !newdef
+      && bfd_is_com_section (*psec)
+      && oldsec != *psec)
     {
       if (sym->st_shndx == SHN_COMMON
-         && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) != 0)
+         && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) != 0)
        {
          h->root.u.c.p->section
            = bfd_make_section_old_way (oldbfd, "COMMON");
          h->root.u.c.p->section->flags = SEC_ALLOC;
        }
       else if (sym->st_shndx == SHN_X86_64_LCOMMON
-              && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) == 0)
-       *psec = *sec = bfd_com_section_ptr;
+              && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) == 0)
+       *psec = bfd_com_section_ptr;
     }
 
   return TRUE;
This page took 0.025415 seconds and 4 git commands to generate.