Fix date in ChangeLog entry
[deliverable/binutils-gdb.git] / bfd / elf32-vax.c
index f13ec1b78a0293aff54603903534af8a0761d262..1f418672424a879eb46f4755e55babf369c5deb5 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-2014 Free Software Foundation, Inc.
    Contributed by Matt Thomas <matt@3am-software.com>.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -595,14 +593,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.  */
@@ -672,11 +668,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;
@@ -914,9 +910,8 @@ elf_vax_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info, asection *sec,
    understand.  */
 
 static bfd_boolean
-elf_vax_adjust_dynamic_symbol (info, h)
-     struct bfd_link_info *info;
-     struct elf_link_hash_entry *h;
+elf_vax_adjust_dynamic_symbol (struct bfd_link_info *info,
+                              struct elf_link_hash_entry *h)
 {
   bfd *dynobj;
   asection *s;
@@ -1051,6 +1046,59 @@ elf_vax_adjust_dynamic_symbol (info, h)
   return _bfd_elf_adjust_dynamic_copy (h, s);
 }
 
+/* This function is called via elf_link_hash_traverse.  It resets GOT
+   and PLT (.GOT) reference counts back to -1 so normal PC32 relocation
+   will be done.  */
+
+static bfd_boolean
+elf_vax_discard_got_entries (struct elf_link_hash_entry *h,
+                            void *infoptr ATTRIBUTE_UNUSED)
+{
+  h->got.refcount = -1;
+  h->plt.refcount = -1;
+
+  return TRUE;
+}
+
+/* Discard unused dynamic data if this is a static link.  */
+
+static bfd_boolean
+elf_vax_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+                             struct bfd_link_info *info)
+{
+  bfd *dynobj;
+  asection *s;
+
+  dynobj = elf_hash_table (info)->dynobj;
+
+  if (dynobj && !elf_hash_table (info)->dynamic_sections_created)
+    {
+      /* 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 them to get stripped from the output
+        file below.  */
+      s = bfd_get_linker_section (dynobj, ".rela.got");
+      if (s != NULL)
+       s->size = 0;
+      s = bfd_get_linker_section (dynobj, ".got.plt");
+      if (s != NULL)
+       s->size = 0;
+      s = bfd_get_linker_section (dynobj, ".got");
+      if (s != NULL)
+       s->size = 0;
+    }
+
+  /* If this is a static link, we need to discard all the got entries we've
+     recorded.  */
+  if (!dynobj || !elf_hash_table (info)->dynamic_sections_created)
+    elf_link_hash_traverse (elf_hash_table (info),
+                           elf_vax_discard_got_entries,
+                           info);
+
+  return TRUE;
+}
+
 /* Set the sizes of the dynamic sections.  */
 
 static bfd_boolean
@@ -1076,23 +1124,6 @@ elf_vax_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
        }
     }
-  else
-    {
-      /* 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
-        file below.  */
-      s = bfd_get_linker_section (dynobj, ".rela.got");
-      if (s != NULL)
-       s->size = 0;
-      s = bfd_get_linker_section (dynobj, ".got.plt");
-      if (s != NULL)
-       s->size = 0;
-      s = bfd_get_linker_section (dynobj, ".got");
-      if (s != NULL)
-       s->size = 0;
-    }
 
   /* If this is a -Bsymbolic shared link, then we need to discard all PC
      relative relocs against symbols defined in a regular object.  We
@@ -1103,9 +1134,9 @@ elf_vax_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
                                elf_vax_discard_copies,
                                NULL);
 
-  /* If this is a -Bsymbolic shared link or a static link, we need to
-     discard all the got entries we've recorded.  Otherwise, we need to
-     instantiate (allocate space for them).  */
+  /* If this is a -Bsymbolic shared link, we need to discard all the got
+     entries we've recorded.  Otherwise, we need to instantiate (allocate
+     space for them).  */
   elf_link_hash_traverse (elf_hash_table (info),
                          elf_vax_instantiate_got_entries,
                          info);
@@ -1190,7 +1221,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;
     }
@@ -1261,12 +1292,12 @@ elf_vax_discard_copies (struct elf_vax_link_hash_entry *h,
   return TRUE;
 }
 
-/* This function is called via elf_link_hash_traverse.  It looks for entries
-   that have GOT or PLT (.GOT) references.  If creating a static object or a
-   shared object with -Bsymbolic, it resets the reference count back to 0
-   and sets the offset to -1 so normal PC32 relocation will be done.  If
-   creating a shared object or executable, space in the .got and .rela.got
-   will be reserved for the symbol.  */
+/* This function is called via elf_link_hash_traverse.  It looks for
+   entries that have GOT or PLT (.GOT) references.  If creating a shared
+   object with -Bsymbolic, or the symbol has been forced local, then it
+   resets the reference count back to -1 so normal PC32 relocation will
+   be done.  Otherwise space in the .got and .rela.got will be reserved
+   for the symbol.  */
 
 static bfd_boolean
 elf_vax_instantiate_got_entries (struct elf_link_hash_entry *h, void * infoptr)
@@ -1281,25 +1312,18 @@ elf_vax_instantiate_got_entries (struct elf_link_hash_entry *h, void * infoptr)
     return TRUE;
 
   dynobj = elf_hash_table (info)->dynobj;
-  if (dynobj == NULL)
-    return TRUE;
+  BFD_ASSERT (dynobj != NULL);
 
   sgot = bfd_get_linker_section (dynobj, ".got");
   srelgot = bfd_get_linker_section (dynobj, ".rela.got");
 
-  if (!elf_hash_table (info)->dynamic_sections_created
-      || (info->shared && info->symbolic)
-      || h->forced_local)
+  if (SYMBOL_REFERENCES_LOCAL (info, h))
     {
-      h->got.refcount = 0;
-      h->got.offset = (bfd_vma) -1;
-      h->plt.refcount = 0;
-      h->plt.offset = (bfd_vma) -1;
+      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)
        {
@@ -1307,15 +1331,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;
@@ -1388,12 +1406,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)
@@ -1440,17 +1458,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)
@@ -1459,37 +1474,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.  */
@@ -1516,19 +1504,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");
@@ -1863,25 +1841,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);
@@ -2024,7 +1987,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;
 }
@@ -2054,7 +2018,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
@@ -2068,6 +2032,8 @@ elf_vax_plt_sym_val (bfd_vma i, const asection *plt,
 #define elf_backend_check_relocs       elf_vax_check_relocs
 #define elf_backend_adjust_dynamic_symbol \
                                        elf_vax_adjust_dynamic_symbol
+#define elf_backend_always_size_sections \
+                                       elf_vax_always_size_sections
 #define elf_backend_size_dynamic_sections \
                                        elf_vax_size_dynamic_sections
 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
This page took 0.028526 seconds and 4 git commands to generate.