daily update
[deliverable/binutils-gdb.git] / bfd / elf64-x86-64.c
index 71f33e2b80d52c498dd282ccca6dbe727a4e4d44..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>.
 
@@ -348,10 +348,10 @@ elf_x86_64_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
 
       case 296:                /* sizeof(istruct elf_prstatus) on Linux/x32 */
        /* 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 */
-       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;
@@ -361,11 +361,11 @@ elf_x86_64_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
 
       case 336:                /* sizeof(istruct elf_prstatus) on Linux/x86_64 */
        /* pr_cursig */
-       elf_tdata (abfd)->core_signal
+       elf_tdata (abfd)->core->signal
          = bfd_get_16 (abfd, note->descdata + 12);
 
        /* pr_pid */
-       elf_tdata (abfd)->core_lwpid
+       elf_tdata (abfd)->core->lwpid
          = bfd_get_32 (abfd, note->descdata + 32);
 
        /* pr_reg */
@@ -389,20 +389,20 @@ elf_x86_64_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
        return FALSE;
 
       case 124:                /* sizeof(struct elf_prpsinfo) on Linux/x32 */
-       elf_tdata (abfd)->core_pid
+       elf_tdata (abfd)->core->pid
          = bfd_get_32 (abfd, note->descdata + 12);
-       elf_tdata (abfd)->core_program
+       elf_tdata (abfd)->core->program
          = _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);
        break;
 
       case 136:                /* sizeof(struct elf_prpsinfo) on Linux/x86_64 */
-       elf_tdata (abfd)->core_pid
+       elf_tdata (abfd)->core->pid
          = bfd_get_32 (abfd, note->descdata + 24);
-       elf_tdata (abfd)->core_program
+       elf_tdata (abfd)->core->program
         = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
-       elf_tdata (abfd)->core_command
+       elf_tdata (abfd)->core->command
         = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
     }
 
@@ -411,7 +411,7 @@ elf_x86_64_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
      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] == ' ')
@@ -888,7 +888,7 @@ elf_x86_64_link_hash_table_create (bfd *abfd)
   struct elf_x86_64_link_hash_table *ret;
   bfd_size_type amt = sizeof (struct elf_x86_64_link_hash_table);
 
-  ret = (struct elf_x86_64_link_hash_table *) bfd_malloc (amt);
+  ret = (struct elf_x86_64_link_hash_table *) bfd_zmalloc (amt);
   if (ret == NULL)
     return NULL;
 
@@ -901,18 +901,6 @@ elf_x86_64_link_hash_table_create (bfd *abfd)
       return NULL;
     }
 
-  ret->sdynbss = NULL;
-  ret->srelbss = NULL;
-  ret->plt_eh_frame = NULL;
-  ret->sym_cache.abfd = NULL;
-  ret->tlsdesc_plt = 0;
-  ret->tlsdesc_got = 0;
-  ret->tls_ld_got.refcount = 0;
-  ret->sgotplt_jump_table_size = 0;
-  ret->tls_module_base = NULL;
-  ret->next_jump_slot_index = 0;
-  ret->next_irelative_index = 0;
-
   if (ABI_64_P (abfd))
     {
       ret->r_info = elf64_r_info;
@@ -956,7 +944,7 @@ elf_x86_64_link_hash_table_free (struct bfd_link_hash_table *hash)
     htab_delete (htab->loc_hash_table);
   if (htab->loc_hash_memory)
     objalloc_free ((struct objalloc *) htab->loc_hash_memory);
-  _bfd_generic_link_hash_table_free (hash);
+  _bfd_elf_link_hash_table_free (hash);
 }
 
 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
@@ -1531,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,
@@ -2271,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)
@@ -2400,24 +2390,6 @@ elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
   if (eh->dyn_relocs == NULL)
     return TRUE;
 
-  /* Since pc_count for TLS symbol can only have size relocations and
-     we always resolve size relocation against non-zero TLS symbol, we
-     clear pc_count for non-zero TLS symbol.  */
-  if (h->type == STT_TLS && h->size != 0)
-    {
-      struct elf_dyn_relocs **pp;
-
-      for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
-       {
-         p->count -= p->pc_count;
-         p->pc_count = 0;
-         if (p->count == 0)
-           *pp = p->next;
-         else
-           pp = &p->next;
-       }
-    }
-
   /* In the shared -Bsymbolic case, discard space allocated for
      dynamic pc-relative relocs against symbols which turn out to be
      defined in regular objects.  For the normal shared case, discard
@@ -3705,12 +3677,6 @@ elf_x86_64_relocate_section (bfd *output_bfd,
        case R_X86_64_SIZE64:
          /* Set to symbol size.  */
          relocation = st_size;
-         if (h && h->type == STT_TLS && st_size != 0)
-           {
-             /* Resolve size relocation against non-zero TLS symbol.  */
-             unresolved_reloc = FALSE;
-             break;
-           }
          goto direct;
 
        case R_X86_64_PC8:
@@ -4366,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;
        }
@@ -4702,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))
     {
@@ -5074,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.027602 seconds and 4 git commands to generate.