daily update
[deliverable/binutils-gdb.git] / bfd / elf64-x86-64.c
index a701e45cef59373e2f6f980c0cb03d52e2c4a88a..72b065281e883b97e9191d7790c6db11c386db57 100644 (file)
@@ -195,7 +195,7 @@ static bfd_boolean
 elf64_x86_64_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
 {
   int offset;
-  size_t raw_size;
+  size_t size;
 
   switch (note->descsz)
     {
@@ -213,14 +213,14 @@ elf64_x86_64_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
 
        /* pr_reg */
        offset = 112;
-       raw_size = 216;
+       size = 216;
 
        break;
     }
 
   /* Make a ".reg/999" section.  */
   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
-                                         raw_size, note->descpos + offset);
+                                         size, note->descpos + offset);
 }
 
 static bfd_boolean
@@ -663,9 +663,10 @@ elf64_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
          if (info->shared)
            {
              (*_bfd_error_handler)
-               (_("%s: relocation %s can not be used when making a shared object; recompile with -fPIC"),
+               (_("%s: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
                 bfd_archive_filename (abfd),
-                x86_64_elf_howto_table[r_type].name);
+                x86_64_elf_howto_table[r_type].name,
+                (h) ? h->root.root.string : "a local symbol");
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
            }
@@ -788,9 +789,10 @@ elf64_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
              && (sec->flags & SEC_READONLY) != 0)
            {
              (*_bfd_error_handler)
-               (_("%s: relocation %s can not be used when making a shared object; recompile with -fPIC"),
+               (_("%s: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
                 bfd_archive_filename (abfd),
-                x86_64_elf_howto_table[r_type].name);
+                x86_64_elf_howto_table[r_type].name,
+                (h) ? h->root.root.string : "a local symbol");
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
            }
@@ -1229,7 +1231,7 @@ elf64_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
      runtime process image.  */
   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
     {
-      htab->srelbss->_raw_size += sizeof (Elf64_External_Rela);
+      htab->srelbss->size += sizeof (Elf64_External_Rela);
       h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
     }
 
@@ -1244,7 +1246,7 @@ elf64_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
 
   /* Apply the required alignment.  */
   s = htab->sdynbss;
-  s->_raw_size = BFD_ALIGN (s->_raw_size, (bfd_size_type) (1 << power_of_two));
+  s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
   if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
     {
       if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
@@ -1253,10 +1255,10 @@ elf64_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
 
   /* Define the symbol as being at this point in the section.  */
   h->root.u.def.section = s;
-  h->root.u.def.value = s->_raw_size;
+  h->root.u.def.value = s->size;
 
   /* Increment the section size to make room for the symbol.  */
-  s->_raw_size += h->size;
+  s->size += h->size;
 
   return TRUE;
 }
@@ -1300,10 +1302,10 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
 
          /* If this is the first .plt entry, make room for the special
             first entry.  */
-         if (s->_raw_size == 0)
-           s->_raw_size += PLT_ENTRY_SIZE;
+         if (s->size == 0)
+           s->size += PLT_ENTRY_SIZE;
 
-         h->plt.offset = s->_raw_size;
+         h->plt.offset = s->size;
 
          /* If this symbol is not defined in a regular file, and we are
             not generating a shared library, then set the symbol to this
@@ -1318,14 +1320,14 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
            }
 
          /* Make room for this entry.  */
-         s->_raw_size += PLT_ENTRY_SIZE;
+         s->size += PLT_ENTRY_SIZE;
 
          /* We also need to make an entry in the .got.plt section, which
             will be placed in the .got section by the linker script.  */
-         htab->sgotplt->_raw_size += GOT_ENTRY_SIZE;
+         htab->sgotplt->size += GOT_ENTRY_SIZE;
 
          /* We also need to make an entry in the .rela.plt section.  */
-         htab->srelplt->_raw_size += sizeof (Elf64_External_Rela);
+         htab->srelplt->size += sizeof (Elf64_External_Rela);
        }
       else
        {
@@ -1362,25 +1364,25 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
        }
 
       s = htab->sgot;
-      h->got.offset = s->_raw_size;
-      s->_raw_size += GOT_ENTRY_SIZE;
+      h->got.offset = s->size;
+      s->size += GOT_ENTRY_SIZE;
       /* R_X86_64_TLSGD needs 2 consecutive GOT slots.  */
       if (tls_type == GOT_TLS_GD)
-       s->_raw_size += GOT_ENTRY_SIZE;
+       s->size += GOT_ENTRY_SIZE;
       dyn = htab->elf.dynamic_sections_created;
       /* R_X86_64_TLSGD needs one dynamic relocation if local symbol
         and two if global.
         R_X86_64_GOTTPOFF needs one dynamic relocation.  */
       if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
          || tls_type == GOT_TLS_IE)
-       htab->srelgot->_raw_size += sizeof (Elf64_External_Rela);
+       htab->srelgot->size += sizeof (Elf64_External_Rela);
       else if (tls_type == GOT_TLS_GD)
-       htab->srelgot->_raw_size += 2 * sizeof (Elf64_External_Rela);
+       htab->srelgot->size += 2 * sizeof (Elf64_External_Rela);
       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
                || h->root.type != bfd_link_hash_undefweak)
               && (info->shared
                   || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
-       htab->srelgot->_raw_size += sizeof (Elf64_External_Rela);
+       htab->srelgot->size += sizeof (Elf64_External_Rela);
     }
   else
     h->got.offset = (bfd_vma) -1;
@@ -1461,7 +1463,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
   for (p = eh->dyn_relocs; p != NULL; p = p->next)
     {
       asection *sreloc = elf_section_data (p->sec)->sreloc;
-      sreloc->_raw_size += p->count * sizeof (Elf64_External_Rela);
+      sreloc->size += p->count * sizeof (Elf64_External_Rela);
     }
 
   return TRUE;
@@ -1521,7 +1523,7 @@ elf64_x86_64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
          s = bfd_get_section_by_name (dynobj, ".interp");
          if (s == NULL)
            abort ();
-         s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
+         s->size = sizeof ELF_DYNAMIC_INTERPRETER;
          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
        }
     }
@@ -1560,7 +1562,7 @@ elf64_x86_64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
              else if (p->count != 0)
                {
                  srel = elf_section_data (p->sec)->sreloc;
-                 srel->_raw_size += p->count * sizeof (Elf64_External_Rela);
+                 srel->size += p->count * sizeof (Elf64_External_Rela);
                  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
                    info->flags |= DF_TEXTREL;
 
@@ -1582,14 +1584,14 @@ elf64_x86_64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
        {
          if (*local_got > 0)
            {
-             *local_got = s->_raw_size;
-             s->_raw_size += GOT_ENTRY_SIZE;
+             *local_got = s->size;
+             s->size += GOT_ENTRY_SIZE;
              if (*local_tls_type == GOT_TLS_GD)
-               s->_raw_size += GOT_ENTRY_SIZE;
+               s->size += GOT_ENTRY_SIZE;
              if (info->shared
                  || *local_tls_type == GOT_TLS_GD
                  || *local_tls_type == GOT_TLS_IE)
-               srel->_raw_size += sizeof (Elf64_External_Rela);
+               srel->size += sizeof (Elf64_External_Rela);
            }
          else
            *local_got = (bfd_vma) -1;
@@ -1600,9 +1602,9 @@ elf64_x86_64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
     {
       /* Allocate 2 got entries and 1 dynamic reloc for R_X86_64_TLSLD
         relocs.  */
-      htab->tls_ld_got.offset = htab->sgot->_raw_size;
-      htab->sgot->_raw_size += 2 * GOT_ENTRY_SIZE;
-      htab->srelgot->_raw_size += sizeof (Elf64_External_Rela);
+      htab->tls_ld_got.offset = htab->sgot->size;
+      htab->sgot->size += 2 * GOT_ENTRY_SIZE;
+      htab->srelgot->size += sizeof (Elf64_External_Rela);
     }
   else
     htab->tls_ld_got.offset = -1;
@@ -1628,7 +1630,7 @@ elf64_x86_64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
        }
       else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
        {
-         if (s->_raw_size != 0 && s != htab->srelplt)
+         if (s->size != 0 && s != htab->srelplt)
            relocs = TRUE;
 
          /* We use the reloc_count field as a counter if we need
@@ -1641,7 +1643,7 @@ elf64_x86_64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
          continue;
        }
 
-      if (s->_raw_size == 0)
+      if (s->size == 0)
        {
          /* If we don't need this section, strip it from the
             output file.  This is mostly to handle .rela.bss and
@@ -1662,7 +1664,7 @@ elf64_x86_64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
         section's contents are written out.  This should not happen,
         but this way if it does, we get a R_X86_64_NONE reloc instead
         of garbage.  */
-      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
+      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
       if (s->contents == NULL)
        return FALSE;
     }
@@ -1683,7 +1685,7 @@ elf64_x86_64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
            return FALSE;
        }
 
-      if (htab->splt->_raw_size != 0)
+      if (htab->splt->size != 0)
        {
          if (!add_dynamic_entry (DT_PLTGOT, 0)
              || !add_dynamic_entry (DT_PLTRELSZ, 0)
@@ -1946,6 +1948,21 @@ elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
        case R_X86_64_PC8:
        case R_X86_64_PC16:
        case R_X86_64_PC32:
+         if (info->shared
+             && !SYMBOL_REFERENCES_LOCAL (info, h)
+             && (sec->flags & SEC_ALLOC) != 0
+             && (sec->flags & SEC_READONLY) != 0)
+           {
+             (*_bfd_error_handler)
+               (_("%s: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
+                bfd_archive_filename (input_bfd),
+                x86_64_elf_howto_table[r_type].name,
+                (h) ? h->root.root.string : "a local symbol");
+             bfd_set_error (bfd_error_bad_value);
+             return FALSE;
+           }
+         /* Fall through.  */
+
        case R_X86_64_8:
        case R_X86_64_16:
        case R_X86_64_32:
@@ -2110,7 +2127,7 @@ elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                    BFD_ASSERT (bfd_get_8 (input_bfd,
                                           contents + rel->r_offset - 4 + i)
                                == tlsgd[i]);
-                 BFD_ASSERT (rel->r_offset + 12 <= input_section->_raw_size);
+                 BFD_ASSERT (rel->r_offset + 12 <= input_section->size);
                  for (i = 0; i < 4; i++)
                    BFD_ASSERT (bfd_get_8 (input_bfd,
                                           contents + rel->r_offset + 4 + i)
@@ -2146,7 +2163,7 @@ elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                  reg = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
                  BFD_ASSERT ((reg & 0xc7) == 5);
                  reg >>= 3;
-                 BFD_ASSERT (rel->r_offset + 4 <= input_section->_raw_size);
+                 BFD_ASSERT (rel->r_offset + 4 <= input_section->size);
                  if (type == 0x8b)
                    {
                      /* movq */
@@ -2283,7 +2300,7 @@ elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                BFD_ASSERT (bfd_get_8 (input_bfd,
                                       contents + rel->r_offset - 4 + i)
                            == tlsgd[i]);
-             BFD_ASSERT (rel->r_offset + 12 <= input_section->_raw_size);
+             BFD_ASSERT (rel->r_offset + 12 <= input_section->size);
              for (i = 0; i < 4; i++)
                BFD_ASSERT (bfd_get_8 (input_bfd,
                                       contents + rel->r_offset + 4 + i)
@@ -2323,7 +2340,7 @@ elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                          == 0x8d);
              BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset - 1)
                          == 0x3d);
-             BFD_ASSERT (rel->r_offset + 9 <= input_section->_raw_size);
+             BFD_ASSERT (rel->r_offset + 9 <= input_section->size);
              BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset + 4)
                          == 0xe8);
              BFD_ASSERT (rel + 1 < relend);
@@ -2657,7 +2674,7 @@ elf64_x86_64_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *inf
        abort ();
 
       dyncon = (Elf64_External_Dyn *) sdyn->contents;
-      dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
+      dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
       for (; dyncon < dynconend; dyncon++)
        {
          Elf_Internal_Dyn dyn;
@@ -2681,10 +2698,7 @@ elf64_x86_64_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *inf
 
            case DT_PLTRELSZ:
              s = htab->srelplt->output_section;
-             if (s->_cooked_size != 0)
-               dyn.d_un.d_val = s->_cooked_size;
-             else
-               dyn.d_un.d_val = s->_raw_size;
+             dyn.d_un.d_val = s->size;
              break;
 
            case DT_RELASZ:
@@ -2698,10 +2712,7 @@ elf64_x86_64_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *inf
              if (htab->srelplt != NULL)
                {
                  s = htab->srelplt->output_section;
-                 if (s->_cooked_size != 0)
-                   dyn.d_un.d_val -= s->_cooked_size;
-                 else
-                   dyn.d_un.d_val -= s->_raw_size;
+                 dyn.d_un.d_val -= s->size;
                }
              break;
            }
@@ -2710,7 +2721,7 @@ elf64_x86_64_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *inf
        }
 
       /* Fill in the special first entry in the procedure linkage table.  */
-      if (htab->splt && htab->splt->_raw_size > 0)
+      if (htab->splt && htab->splt->size > 0)
        {
          /* Fill in the first entry in the procedure linkage table.  */
          memcpy (htab->splt->contents, elf64_x86_64_plt0_entry,
@@ -2744,7 +2755,7 @@ elf64_x86_64_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *inf
   if (htab->sgotplt)
     {
       /* Fill in the first three entries in the global offset table.  */
-      if (htab->sgotplt->_raw_size > 0)
+      if (htab->sgotplt->size > 0)
        {
          /* Set the first entry in the global offset table to the address of
             the dynamic section.  */
@@ -2763,7 +2774,7 @@ elf64_x86_64_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *inf
        GOT_ENTRY_SIZE;
     }
 
-  if (htab->sgot && htab->sgot->_raw_size > 0)
+  if (htab->sgot && htab->sgot->size > 0)
     elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize
       = GOT_ENTRY_SIZE;
 
This page took 0.029672 seconds and 4 git commands to generate.