* emultempl/solaris2.em (elf_solaris2_before_allocation): Renamed
authorRainer Orth <ro@TechFak.Uni-Bielefeld.DE>
Tue, 12 Oct 2010 18:39:36 +0000 (18:39 +0000)
committerRainer Orth <ro@TechFak.Uni-Bielefeld.DE>
Tue, 12 Oct 2010 18:39:36 +0000 (18:39 +0000)
basever_syms to global_syms.
Emit global_syms into .dynamic section for all executables and
shared objects.
(elf_solaris2_after_allocation): New function.
(LDEMUL_AFTER_ALLOCATION): Use it.
* emulparams/solaris2.sh: New file.
* emulparams/elf32_sparc_sol2.sh: Use it.
* emulparams/elf64_sparc_sol2.sh: Likewise.
* emulparams/elf_i386_sol2.sh: Likewise.
* emulparams/elf_x86_64_sol2.sh: Likewise.
* Makefile.am (eelf32_sparc_sol2.c): Depend on
$(srcdir)/emulparams/solaris2.sh.
(eelf64_sparc_sol2.c): Likewise.
(eelf_x86_64_sol2.c): Likewise.
(eelf_i386_sol2.c): Likewise.
* Makefile.in: Regenerate.

ld/ChangeLog
ld/Makefile.am
ld/Makefile.in
ld/emulparams/elf32_sparc_sol2.sh
ld/emulparams/elf64_sparc_sol2.sh
ld/emulparams/elf_i386_sol2.sh
ld/emulparams/elf_x86_64_sol2.sh
ld/emulparams/solaris2.sh [new file with mode: 0644]
ld/emultempl/solaris2.em

index 24f3bc8..1751368 100644 (file)
@@ -1,3 +1,23 @@
+2010-10-12  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       * emultempl/solaris2.em (elf_solaris2_before_allocation): Renamed
+       basever_syms to global_syms.
+       Emit global_syms into .dynamic section for all executables and
+       shared objects.
+       (elf_solaris2_after_allocation): New function.
+       (LDEMUL_AFTER_ALLOCATION): Use it.
+       * emulparams/solaris2.sh: New file.
+       * emulparams/elf32_sparc_sol2.sh: Use it.
+       * emulparams/elf64_sparc_sol2.sh: Likewise.
+       * emulparams/elf_i386_sol2.sh: Likewise.
+       * emulparams/elf_x86_64_sol2.sh: Likewise.
+       * Makefile.am (eelf32_sparc_sol2.c): Depend on
+       $(srcdir)/emulparams/solaris2.sh.
+       (eelf64_sparc_sol2.c): Likewise.
+       (eelf_x86_64_sol2.c): Likewise.
+       (eelf_i386_sol2.c): Likewise.
+       * Makefile.in: Regenerate.
+
 2010-10-06  Nick Clifton  <nickc@redhat.com>
 
        * ld.texinfo: Update description of computation of VMA and LMA
index 982c33c..05a7de6 100644 (file)
@@ -857,6 +857,7 @@ eelf32_sparc.c: $(srcdir)/emulparams/elf32_sparc.sh \
        ${GENSCRIPTS} elf32_sparc "$(tdir_elf32_sparc)"
 eelf32_sparc_sol2.c: $(srcdir)/emulparams/elf32_sparc_sol2.sh \
   $(srcdir)/emulparams/elf32_sparc.sh \
+  $(srcdir)/emulparams/solaris2.sh \
   $(srcdir)/emultempl/solaris2.em $(ELF_DEPS) \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} elf32_sparc_sol2 "$(tdir_elf32_sparc_sol2)"
@@ -1115,6 +1116,7 @@ eelf64_sparc_fbsd.c: $(srcdir)/emulparams/elf64_sparc_fbsd.sh \
        ${GENSCRIPTS} elf64_sparc_fbsd "$(tdir_elf64_sparc_fbsd)"
 eelf64_sparc_sol2.c: $(srcdir)/emulparams/elf64_sparc_sol2.sh \
   $(srcdir)/emulparams/elf64_sparc.sh \
+  $(srcdir)/emulparams/solaris2.sh \
   $(srcdir)/emultempl/solaris2.em \
   $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} elf64_sparc_sol2 "$(tdir_elf64_sparc_sol2)"
@@ -1155,6 +1157,7 @@ eelf_x86_64_fbsd.c: $(srcdir)/emulparams/elf_x86_64_fbsd.sh \
        ${GENSCRIPTS} elf_x86_64_fbsd "$(tdir_elf_x86_64_fbsd)"
 eelf_x86_64_sol2.c: $(srcdir)/emulparams/elf_x86_64_sol2.sh \
   $(srcdir)/emulparams/elf_x86_64.sh \
+  $(srcdir)/emulparams/solaris2.sh \
   $(srcdir)/emultempl/solaris2.em \
   $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} elf_x86_64_sol2 "$(tdir_elf_x86_64_sol2)"
@@ -1179,6 +1182,7 @@ eelf_i386_ldso.c: $(srcdir)/emulparams/elf_i386_ldso.sh \
   $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} elf_i386_ldso "$(tdir_elf_i386_ldso)"
 eelf_i386_sol2.c: $(srcdir)/emulparams/elf_i386_sol2.sh \
+  $(srcdir)/emulparams/solaris2.sh \
   $(srcdir)/emultempl/solaris2.em \
   $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} elf_i386_sol2 "$(tdir_elf_i386_sol2)"
index 1c28b73..f365e1c 100644 (file)
@@ -2210,6 +2210,7 @@ eelf32_sparc.c: $(srcdir)/emulparams/elf32_sparc.sh \
        ${GENSCRIPTS} elf32_sparc "$(tdir_elf32_sparc)"
 eelf32_sparc_sol2.c: $(srcdir)/emulparams/elf32_sparc_sol2.sh \
   $(srcdir)/emulparams/elf32_sparc.sh \
+  $(srcdir)/emulparams/solaris2.sh \
   $(srcdir)/emultempl/solaris2.em $(ELF_DEPS) \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} elf32_sparc_sol2 "$(tdir_elf32_sparc_sol2)"
@@ -2468,6 +2469,7 @@ eelf64_sparc_fbsd.c: $(srcdir)/emulparams/elf64_sparc_fbsd.sh \
        ${GENSCRIPTS} elf64_sparc_fbsd "$(tdir_elf64_sparc_fbsd)"
 eelf64_sparc_sol2.c: $(srcdir)/emulparams/elf64_sparc_sol2.sh \
   $(srcdir)/emulparams/elf64_sparc.sh \
+  $(srcdir)/emulparams/solaris2.sh \
   $(srcdir)/emultempl/solaris2.em \
   $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} elf64_sparc_sol2 "$(tdir_elf64_sparc_sol2)"
@@ -2508,6 +2510,7 @@ eelf_x86_64_fbsd.c: $(srcdir)/emulparams/elf_x86_64_fbsd.sh \
        ${GENSCRIPTS} elf_x86_64_fbsd "$(tdir_elf_x86_64_fbsd)"
 eelf_x86_64_sol2.c: $(srcdir)/emulparams/elf_x86_64_sol2.sh \
   $(srcdir)/emulparams/elf_x86_64.sh \
+  $(srcdir)/emulparams/solaris2.sh \
   $(srcdir)/emultempl/solaris2.em \
   $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} elf_x86_64_sol2 "$(tdir_elf_x86_64_sol2)"
@@ -2532,6 +2535,7 @@ eelf_i386_ldso.c: $(srcdir)/emulparams/elf_i386_ldso.sh \
   $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} elf_i386_ldso "$(tdir_elf_i386_ldso)"
 eelf_i386_sol2.c: $(srcdir)/emulparams/elf_i386_sol2.sh \
+  $(srcdir)/emulparams/solaris2.sh \
   $(srcdir)/emultempl/solaris2.em \
   $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} elf_i386_sol2 "$(tdir_elf_i386_sol2)"
index efced57..8fab990 100644 (file)
@@ -1,2 +1,3 @@
 . ${srcdir}/emulparams/elf32_sparc.sh
+. ${srcdir}/emulparams/solaris2.sh
 EXTRA_EM_FILE=solaris2
index 3189b3f..3bf09f6 100644 (file)
@@ -1,2 +1,3 @@
 . ${srcdir}/emulparams/elf64_sparc.sh
+. ${srcdir}/emulparams/solaris2.sh
 EXTRA_EM_FILE=solaris2
index 773f3d2..7c18fc6 100644 (file)
@@ -1,3 +1,4 @@
 . ${srcdir}/emulparams/elf_i386_ldso.sh
+. ${srcdir}/emulparams/solaris2.sh
 EXTRA_EM_FILE=solaris2
 OUTPUT_FORMAT="elf32-i386-sol2"
index e70d592..993f458 100644 (file)
@@ -1,3 +1,4 @@
 . ${srcdir}/emulparams/elf_x86_64.sh
+. ${srcdir}/emulparams/solaris2.sh
 EXTRA_EM_FILE=solaris2
 OUTPUT_FORMAT="elf64-x86-64-sol2"
diff --git a/ld/emulparams/solaris2.sh b/ld/emulparams/solaris2.sh
new file mode 100644 (file)
index 0000000..dabbb05
--- /dev/null
@@ -0,0 +1,10 @@
+# If you change this file, please also look at files which source this one:
+# elf32_sparc_sol2.sh, elf64_sparc_sol2.sh, elf_i386_sol2.sh,
+# elf_x86_64_sol2.sh.
+
+# The Solaris 2 ABI requires that two local symbols are present in every
+# executable and shared object.
+# Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
+# File, p.63.
+TEXT_START_SYMBOLS='_START_ = .;'
+OTHER_END_SYMBOLS='_END_ = .;'
index aa578d2..0b77375 100644 (file)
@@ -31,16 +31,17 @@ fragment <<EOF
 
 #define TARGET_IS_${EMULATION_NAME}
 
-/* The Solaris 2 ABI requires some symbols to always be bound to the base
-   version in a shared object.
+/* The Solaris 2 ABI requires some global symbols to be present in the
+   .dynsym table of executables and shared objects.  If generating a
+   versioned shared object, they must always be bound to the base version.
 
    Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
    File, p.63.  */
 static void
 elf_solaris2_before_allocation (void)
 {
-  /* Symbols required to be bound to the base version.  */
-  static const char *basever_syms[] = {
+  /* Global symbols required by the Solaris 2 ABI.  */
+  static const char *global_syms[] = {
     "_DYNAMIC",
     "_GLOBAL_OFFSET_TABLE_",
     "_PROCEDURE_LINKAGE_TABLE_",
@@ -51,6 +52,28 @@ elf_solaris2_before_allocation (void)
   };
   const char **sym;
 
+  /* Do this for both executables and shared objects.  */
+  if (!link_info.relocatable)
+    {
+      for (sym = global_syms; *sym != NULL; sym++)
+       {
+         struct elf_link_hash_entry *h;
+
+         /* Lookup symbol.  */
+         h = elf_link_hash_lookup (elf_hash_table (&link_info), *sym,
+                                   FALSE, FALSE, FALSE);
+         if (h == NULL)
+           continue;
+
+         /* Undo the hiding done by _bfd_elf_define_linkage_sym.  */
+         h->forced_local = 0;
+         h->other &= ~STV_HIDDEN;
+
+         /* Emit it into the .dynamic section, too.  */
+         bfd_elf_link_record_dynamic_symbol (&link_info, h);
+       }
+    }
+
   /* Only do this if emitting a shared object and versioning is in place. */
   if (link_info.shared
       && (lang_elf_version_info != NULL || link_info.create_default_symver))
@@ -59,7 +82,7 @@ elf_solaris2_before_allocation (void)
       struct bfd_elf_version_tree *basever;
       const char *soname;
 
-      for (sym = basever_syms; *sym != NULL; sym++)
+      for (sym = global_syms; *sym != NULL; sym++)
        {
          /* Create a version pattern for this symbol.  Some of them start
             off as local, others as global, so try both.  */
@@ -80,8 +103,32 @@ elf_solaris2_before_allocation (void)
       lang_register_vers_node (soname, basever, NULL);
       /* Enforce base version.  The encoded vd_ndx is vernum + 1.  */
       basever->vernum = 0;
+    }
 
-      for (sym = basever_syms; *sym != NULL; sym++)
+  gld${EMULATION_NAME}_before_allocation ();
+}
+
+/* The Solaris 2 ABI requires two local symbols to be emitted for every
+   executable and shared object.
+
+   Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
+   File, p.63.  */
+static void
+elf_solaris2_after_allocation (void)
+{
+  /* Local symbols required by the Solaris 2 ABI.  Already emitted by
+     emulparams/solaris2.sh.  */
+  static const char *local_syms[] = {
+    "_START_",
+    "_END_",
+    NULL
+  };
+  const char **sym;
+
+  /* Do this for both executables and shared objects.  */
+  if (!link_info.relocatable)
+    {
+      for (sym = local_syms; *sym != NULL; sym++)
        {
          struct elf_link_hash_entry *h;
 
@@ -91,18 +138,17 @@ elf_solaris2_before_allocation (void)
          if (h == NULL)
            continue;
 
-         /* Undo the hiding done by _bfd_elf_define_linkage_sym.  */
-         h->forced_local = 0;
-         h->other &= ~STV_HIDDEN;
-
-         /* Emit it into the .dynamic section, too.  */
-         bfd_elf_link_record_dynamic_symbol (&link_info, h);
+         /* Turn it local.  */
+         h->forced_local = 1;
+         /* Type should be STT_OBJECT, not STT_NOTYPE.  */
+         h->type = STT_OBJECT;
        }
     }
 
-  gld${EMULATION_NAME}_before_allocation ();
+  gld${EMULATION_NAME}_after_allocation ();
 }
 
 EOF
 
 LDEMUL_BEFORE_ALLOCATION=elf_solaris2_before_allocation
+LDEMUL_AFTER_ALLOCATION=elf_solaris2_after_allocation