bfd/
authorMaciej W. Rozycki <macro@linux-mips.org>
Sat, 27 Jul 2013 22:21:11 +0000 (22:21 +0000)
committerMaciej W. Rozycki <macro@linux-mips.org>
Sat, 27 Jul 2013 22:21:11 +0000 (22:21 +0000)
* elf32-vax.c (elf_vax_check_relocs) <R_VAX_GOT32, R_VAX_PLT32>:
Don't check symbol visibility here.  Remove a check already
asserted for.
(elf_vax_instantiate_got_entries): Use SYMBOL_REFERENCES_LOCAL
instead of individual checks.
(elf_vax_relocate_section) <R_VAX_GOT32, R_VAX_PLT32>: Only
check the offset to decide if produce a GOT or PLT entry.
Remove redundant assertions.  Remove code to produce GOT entries
for local symbols.  Remove a duplicate comment and add a comment
on GOT relocations.
(elf_vax_finish_dynamic_symbol): Remove code to produce RELATIVE
dynamic relocs.

ld/testsuite/
* ld-vax-elf/got-local-exe.xd: New test.
* ld-vax-elf/got-local-lib.xd: New test.
* ld-vax-elf/got-local-aux.s: New test source.
* ld-vax-elf/got-local-def.s: New test source.
* ld-vax-elf/got-local-ref.s: New test source.
* ld-vax-elf/vax-elf.exp: Run the new tests.

bfd/ChangeLog
bfd/elf32-vax.c
ld/testsuite/ChangeLog
ld/testsuite/ld-vax-elf/got-local-aux.s [new file with mode: 0644]
ld/testsuite/ld-vax-elf/got-local-def.s [new file with mode: 0644]
ld/testsuite/ld-vax-elf/got-local-exe.xd [new file with mode: 0644]
ld/testsuite/ld-vax-elf/got-local-lib.xd [new file with mode: 0644]
ld/testsuite/ld-vax-elf/got-local-ref.s [new file with mode: 0644]
ld/testsuite/ld-vax-elf/vax-elf.exp

index 62742afda54d4c0978010b99d240a63f11474b4b..9a541df3b58c80ae56ce00299c32285ce7665e25 100644 (file)
@@ -1,3 +1,18 @@
+2013-07-27  Maciej W. Rozycki  <macro@linux-mips.org>
+
+       * elf32-vax.c (elf_vax_check_relocs) <R_VAX_GOT32, R_VAX_PLT32>:
+       Don't check symbol visibility here.  Remove a check already
+       asserted for.
+       (elf_vax_instantiate_got_entries): Use SYMBOL_REFERENCES_LOCAL
+       instead of individual checks.
+       (elf_vax_relocate_section) <R_VAX_GOT32, R_VAX_PLT32>: Only
+       check the offset to decide if produce a GOT or PLT entry.
+       Remove redundant assertions.  Remove code to produce GOT entries
+       for local symbols.  Remove a duplicate comment and add a comment
+       on GOT relocations.
+       (elf_vax_finish_dynamic_symbol): Remove code to produce RELATIVE
+       dynamic relocs.
+
 2013-07-27  Maciej W. Rozycki  <macro@linux-mips.org>
 
        * elf32-vax.c (elf_vax_always_size_sections): Correct a comment
index 634eed58da0a4c3fc35f37f364eb773ced912e8b..69eab8b9b8e549a23a5d5c8173076a4c819676fe 100644 (file)
@@ -595,14 +595,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 +670,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;
@@ -1321,16 +1319,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 +1333,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;
@@ -1471,17 +1460,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 +1476,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.  */
@@ -1547,19 +1506,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");
@@ -1894,25 +1843,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);
index ae6a722d7ef781474113e85b1b8f9a03950b9bcc..947ea0ef8e60e7d2c88071d43d72b97109fa1860 100644 (file)
@@ -1,3 +1,12 @@
+2013-07-27  Maciej W. Rozycki  <macro@linux-mips.org>
+
+       * ld-vax-elf/got-local-exe.xd: New test.
+       * ld-vax-elf/got-local-lib.xd: New test.
+       * ld-vax-elf/got-local-aux.s: New test source.
+       * ld-vax-elf/got-local-def.s: New test source.
+       * ld-vax-elf/got-local-ref.s: New test source.
+       * ld-vax-elf/vax-elf.exp: Run the new tests.
+
 2013-07-24  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/15762
diff --git a/ld/testsuite/ld-vax-elf/got-local-aux.s b/ld/testsuite/ld-vax-elf/got-local-aux.s
new file mode 100644 (file)
index 0000000..275e6fa
--- /dev/null
@@ -0,0 +1,5 @@
+       .globl  baz
+       .type   baz, @object
+baz:
+       .byte   0
+       .size   baz, . - baz
diff --git a/ld/testsuite/ld-vax-elf/got-local-def.s b/ld/testsuite/ld-vax-elf/got-local-def.s
new file mode 100644 (file)
index 0000000..c30c7c5
--- /dev/null
@@ -0,0 +1,12 @@
+       .data
+       .globl  bar_hidden
+       .type   bar_hidden, @object
+       .hidden bar_hidden
+bar_hidden:
+       .byte   0
+       .size   bar_hidden, . - bar_hidden
+       .globl  bar_visible
+       .type   bar_visible, @object
+bar_visible:
+       .byte   0
+       .size   bar_visible, . - bar_visible
diff --git a/ld/testsuite/ld-vax-elf/got-local-exe.xd b/ld/testsuite/ld-vax-elf/got-local-exe.xd
new file mode 100644 (file)
index 0000000..ace48f4
--- /dev/null
@@ -0,0 +1,4 @@
+# Make sure there's only one GOT entry, for the symbol defined externally.
+Hex dump of section '\.got':
+  0x[0-9a-f]+ ........ 00000000 00000000 00000000 .*
+  0x[0-9a-f]+ 00000000                            .*
diff --git a/ld/testsuite/ld-vax-elf/got-local-lib.xd b/ld/testsuite/ld-vax-elf/got-local-lib.xd
new file mode 100644 (file)
index 0000000..24edda9
--- /dev/null
@@ -0,0 +1,4 @@
+# Make sure there are only two GOT entries, for the preemptible symbols.
+Hex dump of section '\.got':
+  0x[0-9a-f]+ ........ 00000000 00000000 00000000 .*
+  0x[0-9a-f]+ 00000000 00000000                   .*
diff --git a/ld/testsuite/ld-vax-elf/got-local-ref.s b/ld/testsuite/ld-vax-elf/got-local-ref.s
new file mode 100644 (file)
index 0000000..f950531
--- /dev/null
@@ -0,0 +1,10 @@
+       .text
+       .globl  foo
+       .type   foo, @function
+foo:
+       .word   0
+       movab   bar_hidden, %r0
+       movab   bar_visible, %r1
+       movab   baz, %r2
+       ret
+       .size   foo, . - foo
index 69419532d088b3e181fa7debe10d4d2d8037c067..ae5d9ef24b7002fd7e2e0851b64e66574b7c3770 100644 (file)
@@ -48,3 +48,37 @@ run_ld_link_tests [list \
          { plt-local.s } \
          { { objdump -d plt-local.dd } } \
          "plt-local"]]
+
+# Global offset table tests.  Make sure hidden symbols do not get GOT
+# assignments.
+run_ld_link_tests [list \
+    [list "GOT test (auxiliary shared library)" \
+         "-shared" "" \
+         "-k" \
+         { got-local-aux.s } \
+         {} \
+         "got-local-aux.so"] \
+    [list "GOT test (object 1)" \
+         "-r" "" \
+         "-k" \
+         { got-local-ref.s } \
+         {} \
+         "got-local-ref-r.o"] \
+    [list "GOT test (object 2)" \
+         "-r" "" \
+         "-k" \
+         { got-local-def.s } \
+         {} \
+         "got-local-def-r.o"] \
+    [list "GOT test (executable)" \
+         "-e 0 tmpdir/got-local-aux.so tmpdir/got-local-ref-r.o tmpdir/got-local-def-r.o" "" \
+         "" \
+         {} \
+         { { readelf "-x .got" got-local-exe.xd } } \
+         "got-local-exe"] \
+    [list "GOT test (shared library)" \
+         "-shared tmpdir/got-local-aux.so tmpdir/got-local-ref-r.o tmpdir/got-local-def-r.o" "" \
+         "" \
+         {} \
+         { { readelf "-x .got" got-local-lib.xd } } \
+         "got-local-lib.so"]]