mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-25 13:27:26 +08:00
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.
This commit is contained in:
@ -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>
|
2013-07-27 Maciej W. Rozycki <macro@linux-mips.org>
|
||||||
|
|
||||||
* elf32-vax.c (elf_vax_always_size_sections): Correct a comment
|
* elf32-vax.c (elf_vax_always_size_sections): Correct a comment
|
||||||
|
@ -595,14 +595,12 @@ elf_vax_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
|
|||||||
{
|
{
|
||||||
case R_VAX_GOT32:
|
case R_VAX_GOT32:
|
||||||
BFD_ASSERT (h != NULL);
|
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
|
/* If this is a local symbol, we resolve it directly without
|
||||||
creating a global offset table entry. */
|
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;
|
break;
|
||||||
|
|
||||||
/* This symbol requires a global offset table entry. */
|
/* 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
|
never referenced by a dynamic object, in which case we
|
||||||
don't need to generate a procedure linkage table entry
|
don't need to generate a procedure linkage table entry
|
||||||
after all. */
|
after all. */
|
||||||
|
BFD_ASSERT (h != NULL);
|
||||||
|
|
||||||
/* If this is a local symbol, we resolve it directly without
|
/* If this is a local symbol, we resolve it directly without
|
||||||
creating a procedure linkage table entry. */
|
creating a procedure linkage table entry. */
|
||||||
BFD_ASSERT (h != NULL);
|
if (h->forced_local)
|
||||||
if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT || h->forced_local)
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
h->needs_plt = 1;
|
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");
|
sgot = bfd_get_linker_section (dynobj, ".got");
|
||||||
srelgot = bfd_get_linker_section (dynobj, ".rela.got");
|
srelgot = bfd_get_linker_section (dynobj, ".rela.got");
|
||||||
|
|
||||||
if ((info->shared && info->symbolic)
|
if (SYMBOL_REFERENCES_LOCAL (info, h))
|
||||||
|| h->forced_local)
|
|
||||||
{
|
{
|
||||||
h->got.refcount = -1;
|
h->got.refcount = -1;
|
||||||
h->plt.refcount = -1;
|
h->plt.refcount = -1;
|
||||||
}
|
}
|
||||||
else if (h->got.refcount > 0)
|
else if (h->got.refcount > 0)
|
||||||
{
|
{
|
||||||
bfd_boolean dyn;
|
|
||||||
|
|
||||||
/* Make sure this symbol is output as a dynamic symbol. */
|
/* Make sure this symbol is output as a dynamic symbol. */
|
||||||
if (h->dynindx == -1)
|
if (h->dynindx == -1)
|
||||||
{
|
{
|
||||||
@ -1338,16 +1333,10 @@ elf_vax_instantiate_got_entries (struct elf_link_hash_entry *h, void * infoptr)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
dyn = elf_hash_table (info)->dynamic_sections_created;
|
|
||||||
/* Allocate space in the .got and .rela.got sections. */
|
/* 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;
|
sgot->size += 4;
|
||||||
srelgot->size += sizeof (Elf32_External_Rela);
|
srelgot->size += sizeof (Elf32_External_Rela);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -1471,17 +1460,14 @@ elf_vax_relocate_section (bfd *output_bfd,
|
|||||||
case R_VAX_GOT32:
|
case R_VAX_GOT32:
|
||||||
/* Relocation is to the address of the entry for this symbol
|
/* Relocation is to the address of the entry for this symbol
|
||||||
in the global offset table. */
|
in the global offset table. */
|
||||||
|
|
||||||
|
/* Resolve a GOTxx reloc against a local symbol directly,
|
||||||
|
without using the global offset table. */
|
||||||
if (h == NULL
|
if (h == NULL
|
||||||
|| ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
|
|| h->got.offset == (bfd_vma) -1)
|
||||||
|| h->got.offset == (bfd_vma) -1
|
|
||||||
|| h->forced_local)
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Relocation is the offset of the entry for this symbol in
|
|
||||||
the global offset table. */
|
|
||||||
|
|
||||||
{
|
{
|
||||||
bfd_boolean dyn;
|
|
||||||
bfd_vma off;
|
bfd_vma off;
|
||||||
|
|
||||||
if (sgot == NULL)
|
if (sgot == NULL)
|
||||||
@ -1490,37 +1476,10 @@ elf_vax_relocate_section (bfd *output_bfd,
|
|||||||
BFD_ASSERT (sgot != NULL);
|
BFD_ASSERT (sgot != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
BFD_ASSERT (h != NULL);
|
|
||||||
off = h->got.offset;
|
off = h->got.offset;
|
||||||
BFD_ASSERT (off != (bfd_vma) -1);
|
|
||||||
BFD_ASSERT (off < sgot->size);
|
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;
|
relocation = sgot->output_offset + off;
|
||||||
/* The GOT relocation uses the addend. */
|
/* 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,
|
/* Resolve a PLTxx reloc against a local symbol directly,
|
||||||
without using the procedure linkage table. */
|
without using the procedure linkage table. */
|
||||||
if (h == NULL
|
if (h == NULL
|
||||||
|| ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
|
|| h->plt.offset == (bfd_vma) -1)
|
||||||
|| h->forced_local)
|
|
||||||
break;
|
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)
|
if (splt == NULL)
|
||||||
{
|
{
|
||||||
splt = bfd_get_linker_section (dynobj, ".plt");
|
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
|
rela.r_offset = (sgot->output_section->vma
|
||||||
+ sgot->output_offset
|
+ sgot->output_offset
|
||||||
+ (h->got.offset &~ 1));
|
+ h->got.offset);
|
||||||
|
|
||||||
/* 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);
|
rela.r_info = ELF32_R_INFO (h->dynindx, R_VAX_GLOB_DAT);
|
||||||
}
|
|
||||||
rela.r_addend = bfd_get_signed_32 (output_bfd,
|
rela.r_addend = bfd_get_signed_32 (output_bfd,
|
||||||
(sgot->contents
|
sgot->contents + h->got.offset);
|
||||||
+ (h->got.offset & ~1)));
|
|
||||||
|
|
||||||
loc = srela->contents;
|
loc = srela->contents;
|
||||||
loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
|
loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
|
||||||
|
@ -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>
|
2013-07-24 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
PR ld/15762
|
PR ld/15762
|
||||||
|
5
ld/testsuite/ld-vax-elf/got-local-aux.s
Normal file
5
ld/testsuite/ld-vax-elf/got-local-aux.s
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
.globl baz
|
||||||
|
.type baz, @object
|
||||||
|
baz:
|
||||||
|
.byte 0
|
||||||
|
.size baz, . - baz
|
12
ld/testsuite/ld-vax-elf/got-local-def.s
Normal file
12
ld/testsuite/ld-vax-elf/got-local-def.s
Normal file
@ -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
|
4
ld/testsuite/ld-vax-elf/got-local-exe.xd
Normal file
4
ld/testsuite/ld-vax-elf/got-local-exe.xd
Normal file
@ -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 .*
|
4
ld/testsuite/ld-vax-elf/got-local-lib.xd
Normal file
4
ld/testsuite/ld-vax-elf/got-local-lib.xd
Normal file
@ -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 .*
|
10
ld/testsuite/ld-vax-elf/got-local-ref.s
Normal file
10
ld/testsuite/ld-vax-elf/got-local-ref.s
Normal file
@ -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
|
@ -48,3 +48,37 @@ run_ld_link_tests [list \
|
|||||||
{ plt-local.s } \
|
{ plt-local.s } \
|
||||||
{ { objdump -d plt-local.dd } } \
|
{ { objdump -d plt-local.dd } } \
|
||||||
"plt-local"]]
|
"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"]]
|
||||||
|
Reference in New Issue
Block a user