Revert accidental commit.
[deliverable/binutils-gdb.git] / bfd / elf32-vax.c
index 30afb15637fcdf1bde1a34c85be845f34d334273..56f1d75651463b1f34f2b884c8ab93907bccecc1 100644 (file)
@@ -1,7 +1,5 @@
 /* VAX series support for 32-bit ELF
-   Copyright 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
-   2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
-   Free Software Foundation, Inc.
+   Copyright (C) 1993-2016 Free Software Foundation, Inc.
    Contributed by Matt Thomas <matt@3am-software.com>.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -58,7 +56,7 @@ static bfd_boolean elf32_vax_print_private_bfd_data (bfd *, void *);
 static reloc_howto_type howto_table[] = {
   HOWTO (R_VAX_NONE,           /* type */
         0,                     /* rightshift */
-        0,                     /* size (0 = byte, 1 = short, 2 = long) */
+        3,                     /* size (0 = byte, 1 = short, 2 = long) */
         0,                     /* bitsize */
         FALSE,                 /* pc_relative */
         0,                     /* bitpos */
@@ -282,11 +280,19 @@ static reloc_howto_type howto_table[] = {
 };
 
 static void
-rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
-               Elf_Internal_Rela *dst)
+rtype_to_howto (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
 {
-  BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_VAX_max);
-  cache_ptr->howto = &howto_table[ELF32_R_TYPE(dst->r_info)];
+  unsigned int r_type;
+
+  r_type = ELF32_R_TYPE (dst->r_info);
+  if (r_type >= R_VAX_max)
+    {
+      (*_bfd_error_handler) (_("%B: unrecognised VAX reloc number: %d"),
+                            abfd, r_type);
+      bfd_set_error (bfd_error_bad_value);
+      r_type = R_VAX_NONE;
+    }
+  cache_ptr->howto = &howto_table[r_type];
 }
 
 #define elf_info_to_howto rtype_to_howto
@@ -558,7 +564,7 @@ elf_vax_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
   asection *srelgot;
   asection *sreloc;
 
-  if (info->relocatable)
+  if (bfd_link_relocatable (info))
     return TRUE;
 
   dynobj = elf_hash_table (info)->dynobj;
@@ -595,14 +601,12 @@ elf_vax_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
        {
        case R_VAX_GOT32:
          BFD_ASSERT (h != NULL);
-         if (h->forced_local
-             || h == elf_hash_table (info)->hgot
-             || h == elf_hash_table (info)->hplt)
-           break;
 
          /* If this is a local symbol, we resolve it directly without
             creating a global offset table entry.  */
-         if (h == NULL || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
+         if (h->forced_local
+             || h == elf_hash_table (info)->hgot
+             || h == elf_hash_table (info)->hplt)
            break;
 
          /* This symbol requires a global offset table entry.  */
@@ -622,7 +626,7 @@ elf_vax_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
            }
 
          if (srelgot == NULL
-             && (h != NULL || info->shared))
+             && (h != NULL || bfd_link_pic (info)))
            {
              srelgot = bfd_get_linker_section (dynobj, ".rela.got");
              if (srelgot == NULL)
@@ -672,11 +676,11 @@ elf_vax_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
              never referenced by a dynamic object, in which case we
              don't need to generate a procedure linkage table entry
              after all.  */
+         BFD_ASSERT (h != NULL);
 
          /* If this is a local symbol, we resolve it directly without
             creating a procedure linkage table entry.  */
-         BFD_ASSERT (h != NULL);
-         if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT || h->forced_local)
+         if (h->forced_local)
            break;
 
          h->needs_plt = 1;
@@ -699,7 +703,7 @@ elf_vax_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
             will be set later (it is never cleared).  We account for that
             possibility below by storing information in the
             pcrel_relocs_copied field of the hash table entry.  */
-         if (!(info->shared
+         if (!(bfd_link_pic (info)
                && (sec->flags & SEC_ALLOC) != 0
                && h != NULL
                && (!info->symbolic
@@ -741,7 +745,7 @@ elf_vax_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
 
          /* If we are creating a shared library, we need to copy the
             reloc into the shared library.  */
-         if (info->shared
+         if (bfd_link_pic (info)
              && (sec->flags & SEC_ALLOC) != 0)
            {
              /* When creating a shared object, we must copy these
@@ -856,7 +860,7 @@ elf_vax_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info, asection *sec,
   const Elf_Internal_Rela *rel, *relend;
   bfd *dynobj;
 
-  if (info->relocatable)
+  if (bfd_link_relocatable (info))
     return TRUE;
 
   dynobj = elf_hash_table (info)->dynobj;
@@ -966,7 +970,7 @@ elf_vax_adjust_dynamic_symbol (struct bfd_link_info *info,
         location in the .plt.  This is required to make function
         pointers compare as equal between the normal executable and
         the shared library.  */
-      if (!info->shared
+      if (!bfd_link_pic (info)
          && !h->def_regular)
        {
          h->root.u.def.section = s;
@@ -1017,7 +1021,7 @@ elf_vax_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.  */
-  if (info->shared)
+  if (bfd_link_pic (info))
     return TRUE;
 
   /* We must allocate the symbol in our .dynbss section, which will
@@ -1047,7 +1051,7 @@ elf_vax_adjust_dynamic_symbol (struct bfd_link_info *info,
       h->needs_copy = 1;
     }
 
-  return _bfd_elf_adjust_dynamic_copy (h, s);
+  return _bfd_elf_adjust_dynamic_copy (info, h, s);
 }
 
 /* This function is called via elf_link_hash_traverse.  It resets GOT
@@ -1080,7 +1084,7 @@ elf_vax_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
       /* We may have created entries in the .rela.got and .got sections.
         However, if we are not creating the dynamic sections, we will
         not actually use these entries.  Reset the size of .rela.got
-        and .got, which will cause it to get stripped from the output
+        and .got, which will cause them to get stripped from the output
         file below.  */
       s = bfd_get_linker_section (dynobj, ".rela.got");
       if (s != NULL)
@@ -1120,7 +1124,7 @@ elf_vax_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
   if (elf_hash_table (info)->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);
@@ -1133,7 +1137,7 @@ elf_vax_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
      relative relocs against symbols defined in a regular object.  We
      allocated space for them in the check_relocs routine, but we will not
      fill them in in the relocate_section routine.  */
-  if (info->shared && info->symbolic)
+  if (bfd_link_pic (info) && info->symbolic)
     elf_vax_link_hash_traverse (elf_hash_table (info),
                                elf_vax_discard_copies,
                                NULL);
@@ -1225,7 +1229,7 @@ elf_vax_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
        continue;
 
       /* Allocate memory for the section contents.  */
-      s->contents = (bfd_byte *) bfd_alloc (dynobj, s->size);
+      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
       if (s->contents == NULL)
        return FALSE;
     }
@@ -1240,7 +1244,7 @@ elf_vax_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
 #define add_dynamic_entry(TAG, VAL) \
   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
 
-      if (!info->shared)
+      if (!bfd_link_pic (info))
        {
          if (!add_dynamic_entry (DT_DEBUG, 0))
            return FALSE;
@@ -1321,16 +1325,13 @@ elf_vax_instantiate_got_entries (struct elf_link_hash_entry *h, void * infoptr)
   sgot = bfd_get_linker_section (dynobj, ".got");
   srelgot = bfd_get_linker_section (dynobj, ".rela.got");
 
-  if ((info->shared && info->symbolic)
-      || h->forced_local)
+  if (SYMBOL_REFERENCES_LOCAL (info, h))
     {
       h->got.refcount = -1;
       h->plt.refcount = -1;
     }
   else if (h->got.refcount > 0)
     {
-      bfd_boolean dyn;
-
       /* Make sure this symbol is output as a dynamic symbol.  */
       if (h->dynindx == -1)
        {
@@ -1338,15 +1339,9 @@ elf_vax_instantiate_got_entries (struct elf_link_hash_entry *h, void * infoptr)
            return FALSE;
        }
 
-      dyn = elf_hash_table (info)->dynamic_sections_created;
       /* Allocate space in the .got and .rela.got sections.  */
-      if (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
-         && (info->shared
-             || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
-       {
-         sgot->size += 4;
-         srelgot->size += sizeof (Elf32_External_Rela);
-       }
+      sgot->size += 4;
+      srelgot->size += sizeof (Elf32_External_Rela);
     }
 
   return TRUE;
@@ -1419,12 +1414,12 @@ elf_vax_relocate_section (bfd *output_bfd,
       else
        {
          bfd_boolean unresolved_reloc;
-         bfd_boolean warned;
+         bfd_boolean warned, ignored;
 
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
                                   r_symndx, symtab_hdr, sym_hashes,
                                   h, sec, relocation,
-                                  unresolved_reloc, warned);
+                                  unresolved_reloc, warned, ignored);
 
          if ((h->root.type == bfd_link_hash_defined
              || h->root.type == bfd_link_hash_defweak)
@@ -1436,10 +1431,10 @@ elf_vax_relocate_section (bfd *output_bfd,
                      && h->got.offset != (bfd_vma) -1
                      && !h->forced_local
                      && elf_hash_table (info)->dynamic_sections_created
-                     && (! info->shared
+                     && (! bfd_link_pic (info)
                          || (! info->symbolic && h->dynindx != -1)
                          || !h->def_regular))
-                 || (info->shared
+                 || (bfd_link_pic (info)
                      && ((! info->symbolic && h->dynindx != -1)
                          || !h->def_regular)
                      && ((input_section->flags & SEC_ALLOC) != 0
@@ -1463,7 +1458,7 @@ elf_vax_relocate_section (bfd *output_bfd,
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
                                         rel, 1, relend, howto, 0, contents);
 
-      if (info->relocatable)
+      if (bfd_link_relocatable (info))
        continue;
 
       switch (r_type)
@@ -1471,17 +1466,14 @@ elf_vax_relocate_section (bfd *output_bfd,
        case R_VAX_GOT32:
          /* Relocation is to the address of the entry for this symbol
             in the global offset table.  */
+
+         /* Resolve a GOTxx reloc against a local symbol directly,
+            without using the global offset table.  */
          if (h == NULL
-             || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
-             || h->got.offset == (bfd_vma) -1
-             || h->forced_local)
+             || h->got.offset == (bfd_vma) -1)
            break;
 
-         /* Relocation is the offset of the entry for this symbol in
-            the global offset table.  */
-
          {
-           bfd_boolean dyn;
            bfd_vma off;
 
            if (sgot == NULL)
@@ -1490,37 +1482,10 @@ elf_vax_relocate_section (bfd *output_bfd,
                BFD_ASSERT (sgot != NULL);
              }
 
-           BFD_ASSERT (h != NULL);
            off = h->got.offset;
-           BFD_ASSERT (off != (bfd_vma) -1);
            BFD_ASSERT (off < sgot->size);
 
-           dyn = elf_hash_table (info)->dynamic_sections_created;
-           if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
-               || (info->shared
-                   && SYMBOL_REFERENCES_LOCAL (info, h)))
-             {
-               /* The symbol was forced to be local
-                  because of a version file..  We must initialize
-                  this entry in the global offset table.  Since
-                  the offset must always be a multiple of 4, we
-                  use the least significant bit to record whether
-                  we have initialized it already.
-
-                  When doing a dynamic link, we create a .rela.got
-                  relocation entry to initialize the value.  This
-                  is done in the finish_dynamic_symbol routine.  */
-               if ((off & 1) != 0)
-                 off &= ~1;
-               else
-                 {
-                   bfd_put_32 (output_bfd, relocation + rel->r_addend,
-                               sgot->contents + off);
-                   h->got.offset |= 1;
-                 }
-             } else {
-               bfd_put_32 (output_bfd, rel->r_addend, sgot->contents + off);
-             }
+           bfd_put_32 (output_bfd, rel->r_addend, sgot->contents + off);
 
            relocation = sgot->output_offset + off;
            /* The GOT relocation uses the addend.  */
@@ -1537,7 +1502,7 @@ elf_vax_relocate_section (bfd *output_bfd,
             reloc refers to is in a shared lib, then we made a PLT
             entry for this symbol and need to handle the reloc like
             a PLT reloc.  */
-         if (info->shared)
+         if (bfd_link_pic (info))
             goto r_vax_pc32_shared;
          /* Fall through.  */
        case R_VAX_PLT32:
@@ -1547,19 +1512,9 @@ elf_vax_relocate_section (bfd *output_bfd,
          /* Resolve a PLTxx reloc against a local symbol directly,
             without using the procedure linkage table.  */
          if (h == NULL
-             || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
-             || h->forced_local)
+             || h->plt.offset == (bfd_vma) -1)
            break;
 
-         if (h->plt.offset == (bfd_vma) -1
-             || !elf_hash_table (info)->dynamic_sections_created)
-           {
-             /* We didn't make a PLT entry for this symbol.  This
-                happens when statically linking PIC code, or when
-                using -Bsymbolic.  */
-             break;
-           }
-
          if (splt == NULL)
            {
              splt = bfd_get_linker_section (dynobj, ".plt");
@@ -1610,7 +1565,7 @@ elf_vax_relocate_section (bfd *output_bfd,
        case R_VAX_8:
        case R_VAX_16:
        case R_VAX_32:
-         if (info->shared
+         if (bfd_link_pic (info)
              && r_symndx != STN_UNDEF
              && (input_section->flags & SEC_ALLOC) != 0
              && ((r_type != R_VAX_PC8
@@ -1894,25 +1849,10 @@ elf_vax_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
 
       rela.r_offset = (sgot->output_section->vma
                       + sgot->output_offset
-                      + (h->got.offset &~ 1));
-
-      /* If the symbol was forced to be local because of a version file
-        locally 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
-         && h->dynindx == -1
-         && h->def_regular)
-       {
-         rela.r_info = ELF32_R_INFO (0, R_VAX_RELATIVE);
-       }
-      else
-       {
-         rela.r_info = ELF32_R_INFO (h->dynindx, R_VAX_GLOB_DAT);
-       }
+                      + h->got.offset);
+      rela.r_info = ELF32_R_INFO (h->dynindx, R_VAX_GLOB_DAT);
       rela.r_addend = bfd_get_signed_32 (output_bfd,
-                                        (sgot->contents
-                                         + (h->got.offset & ~1)));
+                                        sgot->contents + h->got.offset);
 
       loc = srela->contents;
       loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
@@ -2055,7 +1995,8 @@ elf_vax_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
     }
 
-  elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
+  if (elf_section_data (sgot->output_section) != NULL)
+    elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
 
   return TRUE;
 }
@@ -2085,7 +2026,7 @@ elf_vax_plt_sym_val (bfd_vma i, const asection *plt,
   return plt->vma + (i + 1) * PLT_ENTRY_SIZE;
 }
 
-#define TARGET_LITTLE_SYM              bfd_elf32_vax_vec
+#define TARGET_LITTLE_SYM              vax_elf32_vec
 #define TARGET_LITTLE_NAME             "elf32-vax"
 #define ELF_MACHINE_CODE               EM_VAX
 #define ELF_MAXPAGESIZE                        0x1000
This page took 0.030373 seconds and 4 git commands to generate.