mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-05-29 15:18:34 +08:00
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:
@ -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>
|
2006-03-02 Richard Sandiford <richard@codesourcery.com>
|
||||||
|
|
||||||
* elf32-i386.c (elf_i386_vxworks_link_output_symbol_hook): Delete.
|
* 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;
|
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. */
|
/* Tweak magic VxWorks symbols as they are written to the output file. */
|
||||||
bfd_boolean
|
bfd_boolean
|
||||||
|
@ -31,3 +31,5 @@ bfd_boolean elf_vxworks_emit_relocs
|
|||||||
(bfd *, asection *, Elf_Internal_Shdr *, Elf_Internal_Rela *,
|
(bfd *, asection *, Elf_Internal_Shdr *, Elf_Internal_Rela *,
|
||||||
struct elf_link_hash_entry **);
|
struct elf_link_hash_entry **);
|
||||||
void elf_vxworks_final_write_processing (bfd *, bfd_boolean);
|
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)
|
elf_i386_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
|
||||||
{
|
{
|
||||||
struct elf_i386_link_hash_table *htab;
|
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);
|
htab = elf_i386_hash_table (info);
|
||||||
if (!htab->sgot && !create_got_section (dynobj, 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))
|
|| (!info->shared && !htab->srelbss))
|
||||||
abort ();
|
abort ();
|
||||||
|
|
||||||
if (htab->is_vxworks && !info->shared)
|
if (htab->is_vxworks
|
||||||
{
|
&& !elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2))
|
||||||
s = bfd_make_section (dynobj, ".rel.plt.unloaded");
|
return FALSE;
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -2000,21 +1989,6 @@ elf_i386_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
|||||||
else
|
else
|
||||||
htab->tls_ldm_got.offset = -1;
|
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
|
/* Allocate global sym .plt and .got entries, and space for global
|
||||||
sym dynamic relocs. */
|
sym dynamic relocs. */
|
||||||
elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
|
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;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create the section for VxWorks static plt relocations. */
|
if (htab->is_vxworks
|
||||||
if (htab->is_vxworks && !info->shared)
|
&& !elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
|
||||||
{
|
return FALSE;
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
htab->relplt = bfd_get_section_by_name (abfd, ".rela.plt");
|
htab->relplt = bfd_get_section_by_name (abfd, ".rela.plt");
|
||||||
htab->plt = s = bfd_get_section_by_name (abfd, ".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
|
else
|
||||||
htab->tlsld_got.offset = (bfd_vma) -1;
|
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. */
|
/* Allocate space for global sym dynamic relocs. */
|
||||||
elf_link_hash_traverse (elf_hash_table (info), allocate_dynrelocs, info);
|
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>
|
2006-03-02 Richard Sandiford <richard@codesourcery.com>
|
||||||
|
|
||||||
* ld-i386/vxworks1.ld: Use bigger alignments. Make sure .bss isn't
|
* ld-i386/vxworks1.ld: Use bigger alignments. Make sure .bss isn't
|
||||||
|
@ -23,7 +23,8 @@ if {[istarget "i?86-*-vxworks"]} {
|
|||||||
set i386tests {
|
set i386tests {
|
||||||
{"VxWorks shared library test 1" "-shared -Tvxworks1.ld"
|
{"VxWorks shared library test 1" "-shared -Tvxworks1.ld"
|
||||||
"" {vxworks1-lib.s}
|
"" {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"}
|
"libvxworks1.so"}
|
||||||
{"VxWorks dynamic executable test 1" \
|
{"VxWorks dynamic executable test 1" \
|
||||||
"tmpdir/libvxworks1.so -Tvxworks1.ld -q" "" {vxworks1.s}
|
"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"}
|
"libvxworks1.so"}
|
||||||
{"VxWorks shared library test 1" "-shared -Tvxworks1.ld"
|
{"VxWorks shared library test 1" "-shared -Tvxworks1.ld"
|
||||||
"-mregnames" {vxworks1-lib.s}
|
"-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"}
|
"libvxworks1.so"}
|
||||||
{"VxWorks dynamic executable test 1" \
|
{"VxWorks dynamic executable test 1" \
|
||||||
"tmpdir/libvxworks1.so -Tvxworks1.ld -q" "-mregnames" {vxworks1.s}
|
"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
|
Reference in New Issue
Block a user