bfd/
* elf32-i386.c (elf_i386_create_dynamic_sections): Use elf_vxworks_create_dynamic_sections. (elf_i386_size_dynamic_sections): Remove VxWorks GOT and PLT symbol handling. * elf32-ppc.c (ppc_elf_create_dynamic_sections): Use elf_vxworks_create_dynamic_sections. (ppc_elf_size_dynamic_sections): Remove VxWorks GOT and PLT symbol handling. * elf-vxworks.c (elf_vxworks_create_dynamic_sections): New function. * elf-vxworks.h (elf_vxworks_create_dynamic_sections): Declare. ld/testsuite/ * ld-i386/ld-i386/vxworks1-lib.nd: New test. * ld-i386/i386.exp: Run it. * ld-powerpc/ld-powerpc/vxworks1-lib.nd: New test. * ld-powerpc/powerc.exp: Run it.
This commit is contained in:
parent
83503a060f
commit
711de32caa
10 changed files with 101 additions and 59 deletions
|
@ -1,3 +1,16 @@
|
|||
2006-03-02 Richard Sandiford <richard@codesourcery.com>
|
||||
|
||||
* elf32-i386.c (elf_i386_create_dynamic_sections): Use
|
||||
elf_vxworks_create_dynamic_sections.
|
||||
(elf_i386_size_dynamic_sections): Remove VxWorks GOT and PLT
|
||||
symbol handling.
|
||||
* elf32-ppc.c (ppc_elf_create_dynamic_sections): Use
|
||||
elf_vxworks_create_dynamic_sections.
|
||||
(ppc_elf_size_dynamic_sections): Remove VxWorks GOT and PLT
|
||||
symbol handling.
|
||||
* elf-vxworks.c (elf_vxworks_create_dynamic_sections): New function.
|
||||
* elf-vxworks.h (elf_vxworks_create_dynamic_sections): Declare.
|
||||
|
||||
2006-03-02 Richard Sandiford <richard@codesourcery.com>
|
||||
|
||||
* elf32-i386.c (elf_i386_vxworks_link_output_symbol_hook): Delete.
|
||||
|
|
|
@ -55,6 +55,57 @@ elf_vxworks_add_symbol_hook (bfd *abfd ATTRIBUTE_UNUSED,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* Perform VxWorks-specific handling of the create_dynamic_sections hook.
|
||||
When creating an executable, set *SRELPLT2_OUT to the .rel(a).plt.unloaded
|
||||
section. */
|
||||
|
||||
bfd_boolean
|
||||
elf_vxworks_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info,
|
||||
asection **srelplt2_out)
|
||||
{
|
||||
struct elf_link_hash_table *htab;
|
||||
const struct elf_backend_data *bed;
|
||||
asection *s;
|
||||
|
||||
htab = elf_hash_table (info);
|
||||
bed = get_elf_backend_data (dynobj);
|
||||
|
||||
if (!info->shared)
|
||||
{
|
||||
s = bfd_make_section_with_flags (dynobj,
|
||||
bed->default_use_rela_p
|
||||
? ".rela.plt.unloaded"
|
||||
: ".rel.plt.unloaded",
|
||||
SEC_HAS_CONTENTS | SEC_IN_MEMORY
|
||||
| SEC_READONLY | SEC_LINKER_CREATED);
|
||||
if (s == NULL
|
||||
|| !bfd_set_section_alignment (dynobj, s, bed->s->log_file_align))
|
||||
return FALSE;
|
||||
|
||||
*srelplt2_out = s;
|
||||
}
|
||||
|
||||
/* Mark the GOT and PLT symbols as having relocations; they might
|
||||
not, but we won't know for sure until we build the GOT in
|
||||
finish_dynamic_symbol. Also make sure that the GOT symbol
|
||||
is entered into the dynamic symbol table; the loader uses it
|
||||
to initialize __GOTT_BASE__[__GOTT_INDEX__]. */
|
||||
if (htab->hgot)
|
||||
{
|
||||
htab->hgot->indx = -2;
|
||||
htab->hgot->other &= ~ELF_ST_VISIBILITY (-1);
|
||||
htab->hgot->forced_local = 0;
|
||||
if (!bfd_elf_link_record_dynamic_symbol (info, htab->hgot))
|
||||
return FALSE;
|
||||
}
|
||||
if (htab->hplt)
|
||||
{
|
||||
htab->hplt->indx = -2;
|
||||
htab->hplt->type = STT_FUNC;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Tweak magic VxWorks symbols as they are written to the output file. */
|
||||
bfd_boolean
|
||||
|
|
|
@ -31,3 +31,5 @@ bfd_boolean elf_vxworks_emit_relocs
|
|||
(bfd *, asection *, Elf_Internal_Shdr *, Elf_Internal_Rela *,
|
||||
struct elf_link_hash_entry **);
|
||||
void elf_vxworks_final_write_processing (bfd *, bfd_boolean);
|
||||
bfd_boolean elf_vxworks_create_dynamic_sections
|
||||
(bfd *, struct bfd_link_info *, asection **);
|
||||
|
|
|
@ -782,9 +782,6 @@ static bfd_boolean
|
|||
elf_i386_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
|
||||
{
|
||||
struct elf_i386_link_hash_table *htab;
|
||||
asection * s;
|
||||
int flags;
|
||||
const struct elf_backend_data *bed = get_elf_backend_data (dynobj);
|
||||
|
||||
htab = elf_i386_hash_table (info);
|
||||
if (!htab->sgot && !create_got_section (dynobj, info))
|
||||
|
@ -803,17 +800,9 @@ elf_i386_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
|
|||
|| (!info->shared && !htab->srelbss))
|
||||
abort ();
|
||||
|
||||
if (htab->is_vxworks && !info->shared)
|
||||
{
|
||||
s = bfd_make_section (dynobj, ".rel.plt.unloaded");
|
||||
flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_READONLY
|
||||
| SEC_LINKER_CREATED);
|
||||
if (s == NULL
|
||||
|| ! bfd_set_section_flags (dynobj, s, flags)
|
||||
|| ! bfd_set_section_alignment (dynobj, s, bed->s->log_file_align))
|
||||
return FALSE;
|
||||
htab->srelplt2 = s;
|
||||
}
|
||||
if (htab->is_vxworks
|
||||
&& !elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2))
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -2000,21 +1989,6 @@ elf_i386_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
|||
else
|
||||
htab->tls_ldm_got.offset = -1;
|
||||
|
||||
if (htab->is_vxworks)
|
||||
{
|
||||
/* Mark the GOT and PLT symbols as having relocations; they might
|
||||
not, but we won't know for sure until we build the GOT in
|
||||
finish_dynamic_symbol. */
|
||||
if (htab->elf.hgot)
|
||||
htab->elf.hgot->indx = -2;
|
||||
if (htab->elf.hplt)
|
||||
{
|
||||
htab->elf.hplt->indx = -2;
|
||||
if (htab->splt->flags & SEC_CODE)
|
||||
htab->elf.hplt->type = STT_FUNC;
|
||||
}
|
||||
}
|
||||
|
||||
/* Allocate global sym .plt and .got entries, and space for global
|
||||
sym dynamic relocs. */
|
||||
elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
|
||||
|
|
|
@ -2548,19 +2548,9 @@ ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
/* Create the section for VxWorks static plt relocations. */
|
||||
if (htab->is_vxworks && !info->shared)
|
||||
{
|
||||
s = bfd_make_section (abfd, ".rela.plt.unloaded");
|
||||
flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_READONLY
|
||||
| SEC_LINKER_CREATED);
|
||||
if (s == NULL
|
||||
|| ! bfd_set_section_flags (abfd, s, flags)
|
||||
|| ! bfd_set_section_alignment (abfd, s,
|
||||
get_elf_backend_data (abfd)->s->log_file_align))
|
||||
return FALSE;
|
||||
htab->srelplt2 = s;
|
||||
}
|
||||
if (htab->is_vxworks
|
||||
&& !elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
|
||||
return FALSE;
|
||||
|
||||
htab->relplt = bfd_get_section_by_name (abfd, ".rela.plt");
|
||||
htab->plt = s = bfd_get_section_by_name (abfd, ".plt");
|
||||
|
@ -4764,21 +4754,6 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
|||
else
|
||||
htab->tlsld_got.offset = (bfd_vma) -1;
|
||||
|
||||
if (htab->is_vxworks)
|
||||
{
|
||||
/* Mark the GOT and PLT symbols as having relocations; they might
|
||||
not, but we won't know for sure until we build the GOT in
|
||||
finish_dynamic_symbol. */
|
||||
if (htab->elf.hgot)
|
||||
htab->elf.hgot->indx = -2;
|
||||
if (htab->elf.hplt)
|
||||
{
|
||||
htab->elf.hplt->indx = -2;
|
||||
if (htab->plt->flags & SEC_CODE)
|
||||
htab->elf.hplt->type = STT_FUNC;
|
||||
}
|
||||
}
|
||||
|
||||
/* Allocate space for global sym dynamic relocs. */
|
||||
elf_link_hash_traverse (elf_hash_table (info), allocate_dynrelocs, info);
|
||||
|
||||
|
|
|
@ -1,3 +1,10 @@
|
|||
2006-03-02 Richard Sandiford <richard@codesourcery.com>
|
||||
|
||||
* ld-i386/ld-i386/vxworks1-lib.nd: New test.
|
||||
* ld-i386/i386.exp: Run it.
|
||||
* ld-powerpc/ld-powerpc/vxworks1-lib.nd: New test.
|
||||
* ld-powerpc/powerc.exp: Run it.
|
||||
|
||||
2006-03-02 Richard Sandiford <richard@codesourcery.com>
|
||||
|
||||
* ld-i386/vxworks1.ld: Use bigger alignments. Make sure .bss isn't
|
||||
|
|
|
@ -23,7 +23,8 @@ if {[istarget "i?86-*-vxworks"]} {
|
|||
set i386tests {
|
||||
{"VxWorks shared library test 1" "-shared -Tvxworks1.ld"
|
||||
"" {vxworks1-lib.s}
|
||||
{{readelf --relocs vxworks1-lib.rd} {objdump -dr vxworks1-lib.dd}}
|
||||
{{readelf --relocs vxworks1-lib.rd} {objdump -dr vxworks1-lib.dd}
|
||||
{readelf --symbols vxworks1-lib.nd}}
|
||||
"libvxworks1.so"}
|
||||
{"VxWorks dynamic executable test 1" \
|
||||
"tmpdir/libvxworks1.so -Tvxworks1.ld -q" "" {vxworks1.s}
|
||||
|
|
9
ld/testsuite/ld-i386/vxworks1-lib.nd
Normal file
9
ld/testsuite/ld-i386/vxworks1-lib.nd
Normal file
|
@ -0,0 +1,9 @@
|
|||
#...
|
||||
Symbol table '\.dynsym' .*:
|
||||
#...
|
||||
.*: 00081400 * 0 * OBJECT * GLOBAL * DEFAULT * [0-9]+ _GLOBAL_OFFSET_TABLE_
|
||||
#...
|
||||
Symbol table '\.symtab' .*:
|
||||
#...
|
||||
.*: 00081400 * 0 * OBJECT * GLOBAL * DEFAULT * [0-9]+ _GLOBAL_OFFSET_TABLE_
|
||||
#pass
|
|
@ -28,7 +28,8 @@ if {[istarget "*-*-vxworks"]} {
|
|||
"libvxworks1.so"}
|
||||
{"VxWorks shared library test 1" "-shared -Tvxworks1.ld"
|
||||
"-mregnames" {vxworks1-lib.s}
|
||||
{{readelf --relocs vxworks1-lib.rd} {objdump -dr vxworks1-lib.dd}}
|
||||
{{readelf --relocs vxworks1-lib.rd} {objdump -dr vxworks1-lib.dd}
|
||||
{readelf --symbols vxworks1-lib.nd}}
|
||||
"libvxworks1.so"}
|
||||
{"VxWorks dynamic executable test 1" \
|
||||
"tmpdir/libvxworks1.so -Tvxworks1.ld -q" "-mregnames" {vxworks1.s}
|
||||
|
|
9
ld/testsuite/ld-powerpc/vxworks1-lib.nd
Normal file
9
ld/testsuite/ld-powerpc/vxworks1-lib.nd
Normal file
|
@ -0,0 +1,9 @@
|
|||
#...
|
||||
Symbol table '\.dynsym' .*:
|
||||
#...
|
||||
.*: 00081400 * 0 * OBJECT * GLOBAL * DEFAULT * [0-9]+ _GLOBAL_OFFSET_TABLE_
|
||||
#...
|
||||
Symbol table '\.symtab' .*:
|
||||
#...
|
||||
.*: 00081400 * 0 * OBJECT * GLOBAL * DEFAULT * [0-9]+ _GLOBAL_OFFSET_TABLE_
|
||||
#pass
|
Loading…
Reference in a new issue