This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: PATCH: Properly support Solaris 2 ABI for symbol versioning in GNU ld
- From: Rainer Orth <ro at CeBiTec dot Uni-Bielefeld dot DE>
- To: binutils at sourceware dot org
- Date: Mon, 01 Mar 2010 22:39:11 +0100
- Subject: Re: PATCH: Properly support Solaris 2 ABI for symbol versioning in GNU ld
- References: <yddocjehd49.fsf@CeBiTec.Uni-Bielefeld.DE> <20100225085017.GF25383@bubble.grove.modra.org>
Alan Modra <amodra@gmail.com> writes:
> On Wed, Feb 24, 2010 at 04:23:02PM +0100, Rainer Orth wrote:
>> Those 6 symbols above should be in the base version, with global
>> linkage. GNU ld not only didn't do this, but marked _DYNAMIC and
>> _GLOBAL_OFFSET_TABLE_ as hidden instead, while _PROCEDURE_LINKAGE_TABLE_
>> wasn't emitted at all on i386.
>
> What breaks if you omit these symbols? If nothing, do you really want
> to copy the mistakes of the Sun linker?
I haven't found anything yet, still this is a documented part of the
Solaris 2 ABI and not simply a linker artefact. Besides, not following
the ABI here creates trouble for libstdc++ ABI checking when different
linkers are in use, as explained here:
PATCH: Support Sun symbol versioning in libstdc++-v3
http://gcc.gnu.org/ml/gcc-patches/2010-02/msg01001.html
Rather then working around the issue in the libstdc++ testsuite, I think
it's best to simply follow the documented ABI and be done with it,
especially if the change is fairly unintrusive.
While the patch as posted created the desired version info, actual
testing in a GCC bootstrap found a couple of issues I've since fixed:
* The resulting 64-bit shared objects couldn't be used initially.
I had both bfd_elf64_x86_64_sol2_vec and bfd_elf64_x86_64_vec in
targ64_selvecs, and there was no way to distinguish between them on
input. Since the only difference between them is the plt stuff and
the symbols bound to the base version, there's no point in having them
in.
* Even with this fixed, I couldn't link the resulting shared objects:
./amd64/libgcc_s.so: could not read symbols: File format not recognized
It turned out that the last entry in the .gnu.version_d section was
malformed: it extended beyond the end of the section, since the
vd_next field was wrong (36 instead of 0). I could trace this to the
way the verdef list is constructed: there's now a last entry
representing the base version, which must be skipped, since it has
already been emitted. Unfortuntely, the skipping wasn't complete;
details can be seen in a comment in the code.
With these two changes, and a corresponding fix to gcc to detect and use
the _sol2 linker emulations, I've been able to successfully bootstrap
gcc mainline with the updated gas and gld. The only problem at the
moment is that the boehm-gc testcase, gctest, crashes if built with this
toolchain, which didn't happen when using gas and gld 2.19. I've still
got to investigate this to identify either gas or gld as the culprit.
Ok for mainline now?
Rainer
--
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University
2010-02-22 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
ld:
* Makefile.am (ALL_EMULATIONS): Add eelf32_sparc_sol2.o,
eelf_i386_sol2.o.
(ALL_64_EMULATIONS): Add eelf_x86_64_sol2.o, eelf64_sparc_sol2.o.
(eelf32_sparc_sol2.c): New rule.
(eelf64_sparc_sol2.c): Likewise.
(eelf_x86_64_sol2.c): Likewise.
(eelf_i386_sol2.c): Likewise.
* Makefile.in: Regenerate.
* configure.tgt (i[3-7]86-*-solaris2*): Change targ_emul to
elf_i386_sol2.
Add elf_i386_ldso, elf_x86_64_sol2 to targ_extra_emuls.
(x86_64-*-solaris2*): Change targ_emul to elf_x86_64_sol2.
Add elf_x86_64, elf_i386_sol2, elf_i386 to targ_extra_emuls.
(sparc-*-solaris2.[0-6]*): Change targ_emul to elf32_sparc_sol2.
Add target_extra_emuls.
(sparc-*-solaris2*): Change targ_emul to elf32_sparc_sol2.
Add elf32_sparc, elf64_sparc_sol2 to targ_extra_emuls.
(sparcv9-*-solaris2*): Change targ_emul to elf64_sparc_sol2.
Add elf64_sparc, elf32_sparc_sol2 to target_extra_emuls.
* emulparams/elf32_sparc_sol2.sh: New file.
* emulparams/elf64_sparc_sol2.sh: New file.
* emulparams/elf_i386_sol2.sh: New file.
* emulparams/elf_x86_64_sol2.sh: New file.
* emultempl/solaris2.em: New file.
bfd:
* elflink.c (bfd_elf_size_dynamic_sections): Don't emit base
version twice.
Skip it when constructing def.vd_next.
* elf32-i386.c (TARGET_LITTLE_SYM): Redefine to
bfd_elf32_i386_sol2_vec.
(TARGET_LITTLE_NAME): Redefine to elf32-i386-sol2.
(elf32_bed): Redefine to elf32_i386_sol2_bed.
(elf_backend_want_plt_sym): Redefine to 1.
* elf64-x86-64.c (TARGET_LITTLE_SYM): Redefine to
bfd_elf64_x86_64_sol2_vec.
(TARGET_LITTLE_NAME): Redefine to elf64-x86-64-sol2.
(elf64_bed): Redefine to elf64_x86_64_sol2_bed.
(elf_backend_want_plt_sym): Redefine to 1.
* config.bfd (i[3-7]86-*-solaris2*): Set targ_defvec to
bfd_elf32_i386_sol2_vec.
Replace bfd_elf64_x86_64_vec by bfd_elf64_x86_64_sol2_vec in
targ64_selvecs.
(x86_64-*-solaris2*): Set targ_defvec to bfd_elf32_i386_sol2_vec.
Replace bfd_elf64_x86_64_vec by bfd_elf64_x86_64_sol2_vec in
targ_selvecs.
* configure.in: Handle bfd_elf32_i386_sol2_vec,
bfd_elf64_x86_64_sol2_vec.
* configure: Regenerate.
* targets.c (bfd_elf32_i386_sol2_vec): Declare.
(bfd_elf64_x86_64_sol2_vec): Declare.
(_bfd_target_vector): Add bfd_elf32_i386_sol2_vec,
bfd_elf64_x86_64_sol2_vec.
Index: bfd/config.bfd
===================================================================
RCS file: /vol/gnu/src/binutils/src-cvs/src/bfd/config.bfd,v
retrieving revision 1.257
diff -u -p -r1.257 config.bfd
--- bfd/config.bfd 13 Jan 2010 11:49:36 -0000 1.257
+++ bfd/config.bfd 26 Feb 2010 18:07:04 -0000
@@ -499,15 +499,15 @@ case "${targ}" in
targ_selvecs=i386coff_vec
;;
i[3-7]86-*-solaris2*)
- targ_defvec=bfd_elf32_i386_vec
- targ_selvecs=i386coff_vec
- targ64_selvecs="bfd_elf64_x86_64_vec bfd_elf64_l1om_vec"
+ targ_defvec=bfd_elf32_i386_sol2_vec
+ targ_selvecs="i386coff_vec"
+ targ64_selvecs="bfd_elf64_x86_64_sol2_vec bfd_elf64_l1om_vec"
want64=true
;;
#ifdef BFD64
x86_64-*-solaris2*)
- targ_defvec=bfd_elf32_i386_vec
- targ_selvecs="bfd_elf64_x86_64_vec bfd_elf64_l1om_vec i386coff_vec"
+ targ_defvec=bfd_elf32_i386_sol2_vec
+ targ_selvecs="bfd_elf64_x86_64_sol2_vec bfd_elf64_l1om_vec i386coff_vec"
want64=true
;;
#endif
Index: bfd/configure
===================================================================
RCS file: /vol/gnu/src/binutils/src-cvs/src/bfd/configure,v
retrieving revision 1.324
diff -u -p -r1.324 configure
--- bfd/configure 13 Jan 2010 11:49:36 -0000 1.324
+++ bfd/configure 22 Feb 2010 13:11:14 -0000
@@ -15028,6 +15028,7 @@ do
bfd_elf32_i370_vec) tb="$tb elf32-i370.lo elf32.lo $elf" ;;
bfd_elf32_i386_dragonfly_vec)
tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
+ bfd_elf32_i386_sol2_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
bfd_elf32_i386_freebsd_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
bfd_elf32_i386_vxworks_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
bfd_elf32_i386_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
@@ -15141,6 +15142,7 @@ do
bfd_elf64_tradbigmips_vec) tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
bfd_elf64_tradlittlemips_vec) tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
bfd_elf64_x86_64_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
+ bfd_elf64_x86_64_sol2_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
bfd_elf64_x86_64_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
bfd_elf64_l1om_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
bfd_elf64_l1om_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
Index: bfd/configure.in
===================================================================
RCS file: /vol/gnu/src/binutils/src-cvs/src/bfd/configure.in,v
retrieving revision 1.276
diff -u -p -r1.276 configure.in
--- bfd/configure.in 13 Jan 2010 11:49:36 -0000 1.276
+++ bfd/configure.in 22 Feb 2010 15:52:54 -0000
@@ -687,6 +687,7 @@ do
bfd_elf32_i370_vec) tb="$tb elf32-i370.lo elf32.lo $elf" ;;
bfd_elf32_i386_dragonfly_vec)
tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
+ bfd_elf32_i386_sol2_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
bfd_elf32_i386_freebsd_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
bfd_elf32_i386_vxworks_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
bfd_elf32_i386_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
@@ -800,6 +801,7 @@ do
bfd_elf64_tradbigmips_vec) tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
bfd_elf64_tradlittlemips_vec) tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
bfd_elf64_x86_64_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
+ bfd_elf64_x86_64_sol2_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
bfd_elf64_x86_64_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
bfd_elf64_l1om_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
bfd_elf64_l1om_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
Index: bfd/elf32-i386.c
===================================================================
RCS file: /vol/gnu/src/binutils/src-cvs/src/bfd/elf32-i386.c,v
retrieving revision 1.229
diff -u -p -r1.229 elf32-i386.c
--- bfd/elf32-i386.c 5 Feb 2010 14:58:11 -0000 1.229
+++ bfd/elf32-i386.c 22 Feb 2010 13:49:57 -0000
@@ -4718,6 +4718,29 @@ elf_i386_fbsd_post_process_headers (bfd
#include "elf32-target.h"
+/* Solaris 2. */
+
+#undef TARGET_LITTLE_SYM
+#define TARGET_LITTLE_SYM bfd_elf32_i386_sol2_vec
+#undef TARGET_LITTLE_NAME
+#define TARGET_LITTLE_NAME "elf32-i386-sol2"
+
+/* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
+ objects won't be recognized. */
+#undef ELF_OSABI
+
+#undef elf32_bed
+#define elf32_bed elf32_i386_sol2_bed
+
+/* The Solaris 2 ABI requires a plt symbol on all platforms.
+
+ Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
+ File, p.63. */
+#undef elf_backend_want_plt_sym
+#define elf_backend_want_plt_sym 1
+
+#include "elf32-target.h"
+
/* VxWorks support. */
#undef TARGET_LITTLE_SYM
Index: bfd/elf64-x86-64.c
===================================================================
RCS file: /vol/gnu/src/binutils/src-cvs/src/bfd/elf64-x86-64.c,v
retrieving revision 1.190
diff -u -p -r1.190 elf64-x86-64.c
--- bfd/elf64-x86-64.c 5 Feb 2010 14:58:11 -0000 1.190
+++ bfd/elf64-x86-64.c 22 Feb 2010 13:49:33 -0000
@@ -4509,6 +4509,29 @@ static const struct bfd_elf_special_sect
#include "elf64-target.h"
+/* Solaris 2 support. */
+
+#undef TARGET_LITTLE_SYM
+#define TARGET_LITTLE_SYM bfd_elf64_x86_64_sol2_vec
+#undef TARGET_LITTLE_NAME
+#define TARGET_LITTLE_NAME "elf64-x86-64-sol2"
+
+/* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
+ objects won't be recognized. */
+#undef ELF_OSABI
+
+#undef elf64_bed
+#define elf64_bed elf64_x86_64_sol2_bed
+
+/* The Solaris 2 ABI requires a plt symbol on all platforms.
+
+ Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
+ File, p.63. */
+#undef elf_backend_want_plt_sym
+#define elf_backend_want_plt_sym 1
+
+#include "elf64-target.h"
+
/* Intel L1OM support. */
static bfd_boolean
Index: bfd/elflink.c
===================================================================
RCS file: /vol/gnu/src/binutils/src-cvs/src/bfd/elflink.c,v
retrieving revision 1.368
diff -u -p -r1.368 elflink.c
--- bfd/elflink.c 4 Feb 2010 09:16:41 -0000 1.368
+++ bfd/elflink.c 27 Feb 2010 06:23:20 -0000
@@ -5928,6 +5928,10 @@ bfd_elf_size_dynamic_sections (bfd *outp
{
struct bfd_elf_version_deps *n;
+ /* Don't emit base version twice. */
+ if (t->vernum == 0)
+ continue;
+
size += sizeof (Elf_External_Verdef);
size += sizeof (Elf_External_Verdaux);
++cdefs;
@@ -6027,6 +6031,10 @@ bfd_elf_size_dynamic_sections (bfd *outp
unsigned int cdeps;
struct bfd_elf_version_deps *n;
+ /* Don't emit the base version twice. */
+ if (t->vernum == 0)
+ continue;
+
cdeps = 0;
for (n = t->deps; n != NULL; n = n->next)
++cdeps;
@@ -6058,7 +6066,13 @@ bfd_elf_size_dynamic_sections (bfd *outp
def.vd_hash = bfd_elf_hash (t->name);
def.vd_aux = sizeof (Elf_External_Verdef);
def.vd_next = 0;
- if (t->next != NULL)
+
+ /* If a basever node is next, it *must* be the last node in
+ the chain, otherwise Verdef construction breaks. */
+ if (t->next != NULL && t->next->vernum == 0)
+ BFD_ASSERT (t->next->next == NULL);
+
+ if (t->next != NULL && t->next->vernum != 0)
def.vd_next = (sizeof (Elf_External_Verdef)
+ (cdeps + 1) * sizeof (Elf_External_Verdaux));
@@ -6159,7 +6173,7 @@ bfd_elf_size_dynamic_sections (bfd *outp
unsigned int crefs;
bfd_byte *p;
- /* Build the version definition section. */
+ /* Build the version dependency section. */
size = 0;
crefs = 0;
for (t = elf_tdata (output_bfd)->verref;
Index: bfd/targets.c
===================================================================
RCS file: /vol/gnu/src/binutils/src-cvs/src/bfd/targets.c,v
retrieving revision 1.185
diff -u -p -r1.185 targets.c
--- bfd/targets.c 26 Jan 2010 13:42:26 -0000 1.185
+++ bfd/targets.c 22 Feb 2010 13:14:45 -0000
@@ -603,6 +603,7 @@ extern const bfd_target bfd_elf32_hppa_n
extern const bfd_target bfd_elf32_hppa_vec;
extern const bfd_target bfd_elf32_i370_vec;
extern const bfd_target bfd_elf32_i386_freebsd_vec;
+extern const bfd_target bfd_elf32_i386_sol2_vec;
extern const bfd_target bfd_elf32_i386_vxworks_vec;
extern const bfd_target bfd_elf32_i386_vec;
extern const bfd_target bfd_elf32_i860_little_vec;
@@ -709,6 +710,7 @@ extern const bfd_target bfd_elf64_sparc_
extern const bfd_target bfd_elf64_tradbigmips_vec;
extern const bfd_target bfd_elf64_tradlittlemips_vec;
extern const bfd_target bfd_elf64_x86_64_freebsd_vec;
+extern const bfd_target bfd_elf64_x86_64_sol2_vec;
extern const bfd_target bfd_elf64_x86_64_vec;
extern const bfd_target bfd_elf64_l1om_freebsd_vec;
extern const bfd_target bfd_elf64_l1om_vec;
@@ -939,6 +941,7 @@ static const bfd_target * const _bfd_tar
&bfd_elf32_hppa_vec,
&bfd_elf32_i370_vec,
&bfd_elf32_i386_freebsd_vec,
+ &bfd_elf32_i386_sol2_vec,
&bfd_elf32_i386_vxworks_vec,
&bfd_elf32_i386_vec,
&bfd_elf32_i860_little_vec,
@@ -1054,6 +1057,7 @@ static const bfd_target * const _bfd_tar
&bfd_elf64_tradbigmips_vec,
&bfd_elf64_tradlittlemips_vec,
&bfd_elf64_x86_64_freebsd_vec,
+ &bfd_elf64_x86_64_sol2_vec,
&bfd_elf64_x86_64_vec,
&bfd_elf64_l1om_freebsd_vec,
&bfd_elf64_l1om_vec,
Index: ld/Makefile.am
===================================================================
RCS file: /vol/gnu/src/binutils/src-cvs/src/ld/Makefile.am,v
retrieving revision 1.277
diff -u -p -r1.277 Makefile.am
--- ld/Makefile.am 10 Feb 2010 19:48:15 -0000 1.277
+++ ld/Makefile.am 21 Feb 2010 21:25:36 -0000
@@ -163,6 +163,7 @@ ALL_EMULATIONS = \
eelf32_i960.o \
eelf32_i860.o \
eelf32_sparc.o \
+ eelf32_sparc_sol2.o \
eelf32_sparc_vxworks.o \
eelf32b4300.o \
eelf32bfin.o \
@@ -198,7 +199,7 @@ ALL_EMULATIONS = \
eelf32mcore.o \
eelf32mep.o \
eelf32mb_linux.o \
- eelf32microblaze.o \
+ eelf32microblaze.o \
eelf32mipswindiss.o \
eelf32mt.o \
eelf32openrisc.o \
@@ -221,6 +222,7 @@ ALL_EMULATIONS = \
eelf_i386_chaos.o \
eelf_i386_fbsd.o \
eelf_i386_ldso.o \
+ eelf_i386_sol2.o \
eelf_i386_vxworks.o \
eelf_s390.o \
egld960.o \
@@ -422,11 +424,13 @@ ALL_64_EMULATIONS = \
eshlelf64_nbsd.o \
eelf_x86_64.o \
eelf_x86_64_fbsd.o \
+ eelf_x86_64_sol2.o \
eelf_l1om.o \
eelf_l1om_fbsd.o \
eelf64_s390.o \
eelf64_sparc.o \
eelf64_sparc_fbsd.o \
+ eelf64_sparc_sol2.o \
eelf64alpha.o \
eelf64alpha_fbsd.o \
eelf64alpha_nbsd.o \
@@ -833,6 +837,11 @@ em32rlelf_linux.c: $(srcdir)/emulparams/
eelf32_sparc.c: $(srcdir)/emulparams/elf32_sparc.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
${GENSCRIPTS} elf32_sparc "$(tdir_elf32_sparc)"
+eelf32_sparc_sol2.c: $(srcdir)/emulparams/elf32_sparc_sol2.sh \
+ $(srcdir)/emulparams/elf32_sparc.sh \
+ $(srcdir)/emultempl/solaris2.em $(ELF_DEPS) \
+ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+ ${GENSCRIPTS} elf32_sparc_sol2 "$(tdir_elf32_sparc_sol2)"
eelf32_sparc_vxworks.c: $(srcdir)/emulparams/elf32_sparc_vxworks.sh \
$(srcdir)/emulparams/vxworks.sh $(srcdir)/emulparams/elf32_sparc.sh \
$(srcdir)/emultempl/vxworks.em $(ELF_DEPS) \
@@ -1086,6 +1095,11 @@ eelf64_sparc_fbsd.c: $(srcdir)/emulparam
$(srcdir)/emulparams/elf64_sparc.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
${GENSCRIPTS} elf64_sparc_fbsd "$(tdir_elf64_sparc_fbsd)"
+eelf64_sparc_sol2.c: $(srcdir)/emulparams/elf64_sparc_sol2.sh \
+ $(srcdir)/emulparams/elf64_sparc.sh \
+ $(srcdir)/emultempl/solaris2.em \
+ $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+ ${GENSCRIPTS} elf64_sparc_sol2 "$(tdir_elf64_sparc_sol2)"
eelf64bmip.c: $(srcdir)/emulparams/elf64bmip.sh \
$(srcdir)/emulparams/elf64bmip-defs.sh \
$(srcdir)/emulparams/elf32bmipn32-defs.sh $(ELF_DEPS) \
@@ -1121,6 +1135,11 @@ eelf_x86_64_fbsd.c: $(srcdir)/emulparams
$(srcdir)/emulparams/elf_x86_64.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
${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)/emultempl/solaris2.em \
+ $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+ ${GENSCRIPTS} elf_x86_64_sol2 "$(tdir_elf_x86_64_sol2)"
eelf_l1om.c: $(srcdir)/emulparams/elf_l1om.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
${GENSCRIPTS} elf_l1om "$(tdir_elf_l1om)"
@@ -1141,6 +1160,10 @@ eelf_i386_fbsd.c: $(srcdir)/emulparams/e
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)/emultempl/solaris2.em \
+ $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+ ${GENSCRIPTS} elf_i386_sol2 "$(tdir_elf_i386_sol2)"
eelf_i386_vxworks.c: $(srcdir)/emulparams/elf_i386_vxworks.sh \
$(srcdir)/emulparams/vxworks.sh $(srcdir)/emultempl/vxworks.em \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
Index: ld/Makefile.in
===================================================================
RCS file: /vol/gnu/src/binutils/src-cvs/src/ld/Makefile.in,v
retrieving revision 1.302
diff -u -p -r1.302 Makefile.in
--- ld/Makefile.in 10 Feb 2010 19:48:16 -0000 1.302
+++ ld/Makefile.in 21 Feb 2010 21:27:29 -0000
@@ -451,6 +451,7 @@ ALL_EMULATIONS = \
eelf32_i960.o \
eelf32_i860.o \
eelf32_sparc.o \
+ eelf32_sparc_sol2.o \
eelf32_sparc_vxworks.o \
eelf32b4300.o \
eelf32bfin.o \
@@ -486,7 +487,7 @@ ALL_EMULATIONS = \
eelf32mcore.o \
eelf32mep.o \
eelf32mb_linux.o \
- eelf32microblaze.o \
+ eelf32microblaze.o \
eelf32mipswindiss.o \
eelf32mt.o \
eelf32openrisc.o \
@@ -509,6 +510,7 @@ ALL_EMULATIONS = \
eelf_i386_chaos.o \
eelf_i386_fbsd.o \
eelf_i386_ldso.o \
+ eelf_i386_sol2.o \
eelf_i386_vxworks.o \
eelf_s390.o \
egld960.o \
@@ -710,11 +712,13 @@ ALL_64_EMULATIONS = \
eshlelf64_nbsd.o \
eelf_x86_64.o \
eelf_x86_64_fbsd.o \
+ eelf_x86_64_sol2.o \
eelf_l1om.o \
eelf_l1om_fbsd.o \
eelf64_s390.o \
eelf64_sparc.o \
eelf64_sparc_fbsd.o \
+ eelf64_sparc_sol2.o \
eelf64alpha.o \
eelf64alpha_fbsd.o \
eelf64alpha_nbsd.o \
@@ -962,6 +966,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32_i860.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32_i960.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32_sparc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32_sparc_sol2.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32_sparc_vxworks.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32_spu.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32b4300.Po@am__quote@
@@ -1023,6 +1028,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64_s390.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64_sparc.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64_sparc_fbsd.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64_sparc_sol2.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64alpha.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64alpha_fbsd.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64alpha_nbsd.Po@am__quote@
@@ -1038,12 +1044,14 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_i386_chaos.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_i386_fbsd.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_i386_ldso.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_i386_sol2.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_i386_vxworks.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_l1om.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_l1om_fbsd.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_s390.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_x86_64.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_x86_64_fbsd.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_x86_64_sol2.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/egld960.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/egld960coff.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eh8300.Po@am__quote@
@@ -2178,6 +2186,11 @@ em32rlelf_linux.c: $(srcdir)/emulparams/
eelf32_sparc.c: $(srcdir)/emulparams/elf32_sparc.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
${GENSCRIPTS} elf32_sparc "$(tdir_elf32_sparc)"
+eelf32_sparc_sol2.c: $(srcdir)/emulparams/elf32_sparc_sol2.sh \
+ $(srcdir)/emulparams/elf32_sparc.sh \
+ $(srcdir)/emultempl/solaris2.em $(ELF_DEPS) \
+ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+ ${GENSCRIPTS} elf32_sparc_sol2 "$(tdir_elf32_sparc_sol2)"
eelf32_sparc_vxworks.c: $(srcdir)/emulparams/elf32_sparc_vxworks.sh \
$(srcdir)/emulparams/vxworks.sh $(srcdir)/emulparams/elf32_sparc.sh \
$(srcdir)/emultempl/vxworks.em $(ELF_DEPS) \
@@ -2431,6 +2444,11 @@ eelf64_sparc_fbsd.c: $(srcdir)/emulparam
$(srcdir)/emulparams/elf64_sparc.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
${GENSCRIPTS} elf64_sparc_fbsd "$(tdir_elf64_sparc_fbsd)"
+eelf64_sparc_sol2.c: $(srcdir)/emulparams/elf64_sparc_sol2.sh \
+ $(srcdir)/emulparams/elf64_sparc.sh \
+ $(srcdir)/emultempl/solaris2.em \
+ $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+ ${GENSCRIPTS} elf64_sparc_sol2 "$(tdir_elf64_sparc_sol2)"
eelf64bmip.c: $(srcdir)/emulparams/elf64bmip.sh \
$(srcdir)/emulparams/elf64bmip-defs.sh \
$(srcdir)/emulparams/elf32bmipn32-defs.sh $(ELF_DEPS) \
@@ -2466,6 +2484,11 @@ eelf_x86_64_fbsd.c: $(srcdir)/emulparams
$(srcdir)/emulparams/elf_x86_64.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
${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)/emultempl/solaris2.em \
+ $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+ ${GENSCRIPTS} elf_x86_64_sol2 "$(tdir_elf_x86_64_sol2)"
eelf_l1om.c: $(srcdir)/emulparams/elf_l1om.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
${GENSCRIPTS} elf_l1om "$(tdir_elf_l1om)"
@@ -2486,6 +2509,10 @@ eelf_i386_fbsd.c: $(srcdir)/emulparams/e
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)/emultempl/solaris2.em \
+ $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+ ${GENSCRIPTS} elf_i386_sol2 "$(tdir_elf_i386_sol2)"
eelf_i386_vxworks.c: $(srcdir)/emulparams/elf_i386_vxworks.sh \
$(srcdir)/emulparams/vxworks.sh $(srcdir)/emultempl/vxworks.em \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
Index: ld/configure.tgt
===================================================================
RCS file: /vol/gnu/src/binutils/src-cvs/src/ld/configure.tgt,v
retrieving revision 1.230
diff -u -p -r1.230 configure.tgt
--- ld/configure.tgt 29 Sep 2009 14:17:17 -0000 1.230
+++ ld/configure.tgt 22 Feb 2010 15:48:19 -0000
@@ -207,13 +207,13 @@ x86_64-*-linux-*) targ_emul=elf_x86_64
tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'`
tdir_elf_i386=`echo ${targ_alias} | sed -e 's/x86_64/i386/'` ;;
i[3-7]86-*-sysv[45]*) targ_emul=elf_i386 ;;
-i[3-7]86-*-solaris2*) targ_emul=elf_i386_ldso
- targ_extra_emuls="elf_i386 elf_x86_64 elf_l1om"
+i[3-7]86-*-solaris2*) targ_emul=elf_i386_sol2
+ targ_extra_emuls="elf_i386_ldso elf_i386 elf_x86_64_sol2 elf_x86_64 elf_l1om"
targ_extra_libpath=$targ_extra_emuls
;;
x86_64-*-solaris2*)
- targ_emul=elf_x86_64
- targ_extra_emuls="elf_i386 elf_i386_ldso elf_l1om"
+ targ_emul=elf_x86_64_sol2
+ targ_extra_emuls="elf_x86_64 elf_i386_sol2 elf_i386_ldso elf_i386 elf_l1om"
targ_extra_libpath=elf_i386
tdir_elf_i386=`echo ${targ_alias} | sed -e 's/x86_64/i386/'` ;;
i[3-7]86-*-unixware) targ_emul=elf_i386 ;;
@@ -601,14 +601,15 @@ sparc64-*-netbsd* | sparc64-*-openbsd*)
sparc*-*-netbsd*elf*) targ_emul=elf32_sparc ;;
sparc*-*-netbsd*) targ_emul=sparcnbsd ;;
sparc-*-solaris2.[0-6] | sparc-*-solaris2.[0-6].*)
- targ_emul=elf32_sparc ;;
-sparc-*-solaris2*) targ_emul=elf32_sparc
- targ_extra_emuls="elf64_sparc"
+ targ_emul=elf32_sparc_sol2
+ targ_extra_emuls=elf32_sparc ;;
+sparc-*-solaris2*) targ_emul=elf32_sparc_sol2
+ targ_extra_emuls="elf32_sparc elf64_sparc_sol2 elf64_sparc"
targ_extra_libpath=$targ_extra_emuls
tdir_elf64_sparc=`echo ${targ_alias} | sed -e 's/32//'` ;;
sparcv9-*-solaris2* | sparc64-*-solaris2*)
- targ_emul=elf64_sparc
- targ_extra_emuls="elf32_sparc"
+ targ_emul=elf64_sparc_sol2
+ targ_extra_emuls="elf64_sparc elf32_sparc_sol2 elf32_sparc"
targ_extra_libpath=$targ_extra_emuls
tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` ;;
sparc*-*-solaris2*) targ_emul=elf32_sparc ;;
Index: ld/emulparams/elf32_sparc_sol2.h
===================================================================
RCS file: ld/emulparams/elf32_sparc_sol2.h
diff -N ld/emulparams/elf32_sparc_sol2.h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ld/emulparams/elf32_sparc_sol2.h 21 Feb 2010 20:58:03 -0000
@@ -0,0 +1,2 @@
+. ${srcdir}/emulparams/elf32_sparc.sh
+EXTRA_EM_FILE=solaris2
Index: ld/emulparams/elf64_sparc_sol2.h
===================================================================
RCS file: ld/emulparams/elf64_sparc_sol2.h
diff -N ld/emulparams/elf64_sparc_sol2.h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ld/emulparams/elf64_sparc_sol2.h 21 Feb 2010 20:58:20 -0000
@@ -0,0 +1,2 @@
+. ${srcdir}/emulparams/elf64_sparc.sh
+EXTRA_EM_FILE=solaris2
Index: ld/emulparams/elf_i386_sol2.sh
===================================================================
RCS file: ld/emulparams/elf_i386_sol2.sh
diff -N ld/emulparams/elf_i386_sol2.sh
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ld/emulparams/elf_i386_sol2.sh 22 Feb 2010 13:05:19 -0000
@@ -0,0 +1,3 @@
+. ${srcdir}/emulparams/elf_i386_ldso.sh
+EXTRA_EM_FILE=solaris2
+OUTPUT_FORMAT="elf32-i386-sol2"
Index: ld/emulparams/elf_x86_64_sol2.sh
===================================================================
RCS file: ld/emulparams/elf_x86_64_sol2.sh
diff -N ld/emulparams/elf_x86_64_sol2.sh
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ld/emulparams/elf_x86_64_sol2.sh 26 Feb 2010 17:37:59 -0000
@@ -0,0 +1,3 @@
+. ${srcdir}/emulparams/elf_x86_64.sh
+EXTRA_EM_FILE=solaris2
+OUTPUT_FORMAT="elf64-x86-64-sol2"
Index: ld/emultempl/solaris2.em
===================================================================
RCS file: ld/emultempl/solaris2.em
diff -N ld/emultempl/solaris2.em
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ld/emultempl/solaris2.em 27 Feb 2010 01:06:05 -0000
@@ -0,0 +1,108 @@
+# This shell script emits a C file. -*- C -*-
+# It does some substitutions.
+if [ -z "$MACHINE" ]; then
+ OUTPUT_ARCH=${ARCH}
+else
+ OUTPUT_ARCH=${ARCH}:${MACHINE}
+fi
+fragment <<EOF
+/* This file is generated by a shell script. DO NOT EDIT! */
+
+/* Solaris 2 emulation code for ${EMULATION_NAME}
+ Copyright 2010 Free Software Foundation, Inc.
+ Written by Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ This file is part of the GNU Binutils.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+ MA 02110-1301, USA. */
+
+#define TARGET_IS_${EMULATION_NAME}
+
+/* The Solaris 2 ABI requires some symbols to always be bound to the base
+ version in a shared object.
+
+ 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[] = {
+ "_DYNAMIC",
+ "_GLOBAL_OFFSET_TABLE_",
+ "_PROCEDURE_LINKAGE_TABLE_",
+ "_edata",
+ "_end",
+ "_etext",
+ NULL
+ };
+ const char **sym;
+
+ /* 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))
+ {
+ struct bfd_elf_version_expr *globals = NULL, *locals = NULL;
+ struct bfd_elf_version_tree *basever;
+ const char *soname;
+
+ for (sym = basever_syms; *sym != NULL; sym++)
+ {
+ /* Create a version pattern for this symbol. Some of them start
+ off as local, others as global, so try both. */
+ globals = lang_new_vers_pattern (globals, *sym, NULL, TRUE);
+ locals = lang_new_vers_pattern (locals, *sym, NULL, TRUE);
+ }
+
+ /* New version node for those symbols. */
+ basever = lang_new_vers_node (globals, locals);
+
+ /* The version name matches what bfd_elf_size_dynamic_sections uses
+ for the base version. */
+ soname = bfd_elf_get_dt_soname (link_info.output_bfd);
+ if (soname == NULL)
+ soname = lbasename (bfd_get_filename (link_info.output_bfd));
+
+ /* Register the node. */
+ 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++)
+ {
+ 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);
+ }
+ }
+
+ gld${EMULATION_NAME}_before_allocation ();
+}
+
+EOF
+
+LDEMUL_BEFORE_ALLOCATION=elf_solaris2_before_allocation