aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej W. Rozycki <macro@linux-mips.org>2013-07-27 22:21:11 +0000
committerMaciej W. Rozycki <macro@linux-mips.org>2013-07-27 22:21:11 +0000
commit125b5bac9860b55e2065cebf8f36dada6da0c8a5 (patch)
tree731844aa19474a1e0859d8cf374d6cdf320cb49c
parent49d01bf63d118280b27551e9ee1c58040dd65f0c (diff)
downloadgdb-125b5bac9860b55e2065cebf8f36dada6da0c8a5.zip
gdb-125b5bac9860b55e2065cebf8f36dada6da0c8a5.tar.gz
gdb-125b5bac9860b55e2065cebf8f36dada6da0c8a5.tar.bz2
bfd/
* 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.
-rw-r--r--bfd/ChangeLog15
-rw-r--r--bfd/elf32-vax.c100
-rw-r--r--ld/testsuite/ChangeLog9
-rw-r--r--ld/testsuite/ld-vax-elf/got-local-aux.s5
-rw-r--r--ld/testsuite/ld-vax-elf/got-local-def.s12
-rw-r--r--ld/testsuite/ld-vax-elf/got-local-exe.xd4
-rw-r--r--ld/testsuite/ld-vax-elf/got-local-lib.xd4
-rw-r--r--ld/testsuite/ld-vax-elf/got-local-ref.s10
-rw-r--r--ld/testsuite/ld-vax-elf/vax-elf.exp34
9 files changed, 110 insertions, 83 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 62742af..9a541df 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,20 @@
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
typo.
diff --git a/bfd/elf32-vax.c b/bfd/elf32-vax.c
index 634eed5..69eab8b 100644
--- a/bfd/elf32-vax.c
+++ b/bfd/elf32-vax.c
@@ -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);
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index ae6a722..947ea0e 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -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
index 0000000..275e6fa
--- /dev/null
+++ b/ld/testsuite/ld-vax-elf/got-local-aux.s
@@ -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
index 0000000..c30c7c5
--- /dev/null
+++ b/ld/testsuite/ld-vax-elf/got-local-def.s
@@ -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
index 0000000..ace48f4
--- /dev/null
+++ b/ld/testsuite/ld-vax-elf/got-local-exe.xd
@@ -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
index 0000000..24edda9
--- /dev/null
+++ b/ld/testsuite/ld-vax-elf/got-local-lib.xd
@@ -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
index 0000000..f950531
--- /dev/null
+++ b/ld/testsuite/ld-vax-elf/got-local-ref.s
@@ -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
diff --git a/ld/testsuite/ld-vax-elf/vax-elf.exp b/ld/testsuite/ld-vax-elf/vax-elf.exp
index 6941953..ae5d9ef 100644
--- a/ld/testsuite/ld-vax-elf/vax-elf.exp
+++ b/ld/testsuite/ld-vax-elf/vax-elf.exp
@@ -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"]]