From 125b5bac9860b55e2065cebf8f36dada6da0c8a5 Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Sat, 27 Jul 2013 22:21:11 +0000 Subject: [PATCH] bfd/ * elf32-vax.c (elf_vax_check_relocs) : 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) : 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 | 15 ++++ bfd/elf32-vax.c | 100 ++++------------------- ld/testsuite/ChangeLog | 9 ++ ld/testsuite/ld-vax-elf/got-local-aux.s | 5 ++ ld/testsuite/ld-vax-elf/got-local-def.s | 12 +++ ld/testsuite/ld-vax-elf/got-local-exe.xd | 4 + ld/testsuite/ld-vax-elf/got-local-lib.xd | 4 + ld/testsuite/ld-vax-elf/got-local-ref.s | 10 +++ ld/testsuite/ld-vax-elf/vax-elf.exp | 34 ++++++++ 9 files changed, 110 insertions(+), 83 deletions(-) create mode 100644 ld/testsuite/ld-vax-elf/got-local-aux.s create mode 100644 ld/testsuite/ld-vax-elf/got-local-def.s create mode 100644 ld/testsuite/ld-vax-elf/got-local-exe.xd create mode 100644 ld/testsuite/ld-vax-elf/got-local-lib.xd create mode 100644 ld/testsuite/ld-vax-elf/got-local-ref.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 62742afda5..9a541df3b5 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,18 @@ +2013-07-27 Maciej W. Rozycki + + * elf32-vax.c (elf_vax_check_relocs) : + 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) : 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 * elf32-vax.c (elf_vax_always_size_sections): Correct a comment diff --git a/bfd/elf32-vax.c b/bfd/elf32-vax.c index 634eed58da..69eab8b9b8 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 ae6a722d7e..947ea0ef8e 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2013-07-27 Maciej W. Rozycki + + * 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 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 0000000000..275e6fa5f7 --- /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 0000000000..c30c7c5b16 --- /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 0000000000..ace48f472b --- /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 0000000000..24edda9594 --- /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 0000000000..f950531104 --- /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 69419532d0..ae5d9ef24b 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"]] -- 2.34.1