From 711de32caaff12a33dfcc10c0421388c7550bac0 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 2 Mar 2006 08:57:00 +0000 Subject: [PATCH] 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. --- bfd/ChangeLog | 13 +++++++ bfd/elf-vxworks.c | 51 +++++++++++++++++++++++++ bfd/elf-vxworks.h | 2 + bfd/elf32-i386.c | 32 ++-------------- bfd/elf32-ppc.c | 31 ++------------- ld/testsuite/ChangeLog | 7 ++++ ld/testsuite/ld-i386/i386.exp | 3 +- ld/testsuite/ld-i386/vxworks1-lib.nd | 9 +++++ ld/testsuite/ld-powerpc/powerpc.exp | 3 +- ld/testsuite/ld-powerpc/vxworks1-lib.nd | 9 +++++ 10 files changed, 101 insertions(+), 59 deletions(-) create mode 100644 ld/testsuite/ld-i386/vxworks1-lib.nd create mode 100644 ld/testsuite/ld-powerpc/vxworks1-lib.nd diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 53c3ed3c5e6..0136341b57f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,16 @@ +2006-03-02 Richard Sandiford + + * 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 * elf32-i386.c (elf_i386_vxworks_link_output_symbol_hook): Delete. diff --git a/bfd/elf-vxworks.c b/bfd/elf-vxworks.c index 0dca07c5833..90e620a9055 100644 --- a/bfd/elf-vxworks.c +++ b/bfd/elf-vxworks.c @@ -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 diff --git a/bfd/elf-vxworks.h b/bfd/elf-vxworks.h index 76db15e64db..c8ea0094eea 100644 --- a/bfd/elf-vxworks.h +++ b/bfd/elf-vxworks.h @@ -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 **); diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 6b51f38b4c4..c14fc3ba312 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -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); diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 353f288b18a..68cead29e05 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -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); diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 8bc2c2507a9..b3a93ad8148 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2006-03-02 Richard Sandiford + + * 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 * ld-i386/vxworks1.ld: Use bigger alignments. Make sure .bss isn't diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index d5087d57d58..b0195ca6a18 100644 --- a/ld/testsuite/ld-i386/i386.exp +++ b/ld/testsuite/ld-i386/i386.exp @@ -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} diff --git a/ld/testsuite/ld-i386/vxworks1-lib.nd b/ld/testsuite/ld-i386/vxworks1-lib.nd new file mode 100644 index 00000000000..edf3db39940 --- /dev/null +++ b/ld/testsuite/ld-i386/vxworks1-lib.nd @@ -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 diff --git a/ld/testsuite/ld-powerpc/powerpc.exp b/ld/testsuite/ld-powerpc/powerpc.exp index 5cfb313e353..db7fe598e72 100644 --- a/ld/testsuite/ld-powerpc/powerpc.exp +++ b/ld/testsuite/ld-powerpc/powerpc.exp @@ -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} diff --git a/ld/testsuite/ld-powerpc/vxworks1-lib.nd b/ld/testsuite/ld-powerpc/vxworks1-lib.nd new file mode 100644 index 00000000000..edf3db39940 --- /dev/null +++ b/ld/testsuite/ld-powerpc/vxworks1-lib.nd @@ -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 -- 2.30.2