bfd/
authorRichard Sandiford <rdsandiford@googlemail.com>
Thu, 2 Mar 2006 08:57:00 +0000 (08:57 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Thu, 2 Mar 2006 08:57:00 +0000 (08:57 +0000)
* 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
bfd/elf-vxworks.c
bfd/elf-vxworks.h
bfd/elf32-i386.c
bfd/elf32-ppc.c
ld/testsuite/ChangeLog
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/vxworks1-lib.nd [new file with mode: 0644]
ld/testsuite/ld-powerpc/powerpc.exp
ld/testsuite/ld-powerpc/vxworks1-lib.nd [new file with mode: 0644]

index 53c3ed3c5e6709f94b21cf642ad1e3e478528742..0136341b57f6fc06828572ba01fbd26ef5864a25 100644 (file)
@@ -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.
index 0dca07c583301eaa301101ef78fb1fba92179d4f..90e620a905592f47a7a3421ca4c874d20e559a24 100644 (file)
@@ -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
index 76db15e64dbfab82043c97e7d69972e90b9ed4fe..c8ea0094eeac651f4505c2f6c1f89ec4cde5bbc5 100644 (file)
@@ -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 **);
index 6b51f38b4c4ad7ffc9400023697dfbb1697e793d..c14fc3ba312e279ae3db64c1cd53c52f1e5ed0e6 100644 (file)
@@ -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);
index 353f288b18a5caf3455668f96dacabbf5a102aac..68cead29e05a3f4e833cc2d9e50b085c1925d915 100644 (file)
@@ -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);
 
index 8bc2c2507a9440fa02a271fb46290594f116afed..b3a93ad81487b1bb8e732943498cb7f09feedfe5 100644 (file)
@@ -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
index d5087d57d58fbede2f1aeb63ddf7adc62b2d89aa..b0195ca6a1819c79a89958c29463a2a1514a86db 100644 (file)
@@ -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 (file)
index 0000000..edf3db3
--- /dev/null
@@ -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
index 5cfb313e353c12688f25b6c1e56240f526d51e88..db7fe598e72b7c40dcda8399bba8c178270cfe24 100644 (file)
@@ -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 (file)
index 0000000..edf3db3
--- /dev/null
@@ -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