Patchwork [build] Move Solaris 2 startup files to toplevel libgcc

login
register
mail settings
Submitter Rainer Orth
Date May 2, 2011, 4:47 p.m.
Message ID <yddoc3lgic7.fsf@manam.CeBiTec.Uni-Bielefeld.DE>
Download mbox | patch
Permalink /patch/93685/
State New
Headers show

Comments

Rainer Orth - May 2, 2011, 4:47 p.m.
It has long been on my agenda to perform/complete the toplevel libgcc
migration for my targets.  Although Solaris is the most complicated of
the three, it lays some infrastructure for the others, so I'm starting
with this patch.  The ones for IRIX 6 and Tru64 UNIX will follow once
the dust on this one has settled (and they have been tested :-)

The patch allowed for a considerable simplification of libgcc
configuration for Solaris and some generalizations that will be used by
patches for the other two platforms.

A couple of issues are worth noticing:

* The major point is that it proved possible to generalize/merge the
  several t-slibgcc* fragments currently in gcc/config.  By moving code
  around a bit and introducing a couple of variables, I could come up
  with a version that should work on Solaris, IRIX, Tru64 UNIX and
  Linux.  This is far more readable than the heavily duplicated versions
  we currently have.  The resulting libgcc/config/t-slibgcc is mostly
  identical to current gcc/config/t-slibgcc-elf-ver.

* One wart that turned up as result of the incomplete toplevel libgcc
  conversion is that one needs to keep defining SHLIB_LINK on the gcc
  side so ENABLE_SHARED_LIBGCC is defined correctly.  This is currently
  done in gcc/config/t-slibgcc-darwin and gcc/config/i386/t-nwld.  Until
  this is fixed, I've introduced a new gcc/config/t-slibgcc-dummy,
  properly commented to explain what's going on.  Since I cannot test
  the other targets, I've left them alone.

  Should I file a PR for this issue?

* Another wart was that gcc/ada/gcc-interface/Makefile.in requires
  TARGET_LIBGCC2_CFLAGS, which is otherwise only used in libgcc.  It
  often contains -fPIC, and if the variable is removed, libgnat.so won't
  link (text relocations remain).

  This is probably another ada PR?

* On the libgcc side, several of the t-crtfm fragments are identical
  except for the cpu subdir name.  Since there's already the cpu_type
  configure variable, I'm exporting that to make and make use of it in
  libgcc/config/t-crtfm.  Currently, only sparc uses it, but mips will
  once I complete the IRIX migration, and ia64 could, too.

* There were two copies of gmon-sol2.c, one for sparc, and a modified
  version thereof for i386.  I've done an initial merge that at least
  allowed a successful regtest on Solaris 11/x86, but there is
  considerable further cleanup (and reformatting ;-) potential.  I'll
  probably do so as a followup.

* Instead of doing sed hacks to strip comments from the various
  sol2-*.asm files, it seems to work to simply rename them to .S instead.

* Several libgcc t-* fragements can use of $< instead of duplicating the
  file names.

* I noticed that I had to rename TARGET_LIBGCC2_CFLAGS to
  HOST_LIBGCC2_CFLAGS so it works in libgcc.

* There are several one- or two-line makefile fragments in gcc and
  libgcc.  What is our policy for adding copyright notices to them.  In
  a couple of cases, the files are the only remainder/extract of a
  previously far longer file.  Should they keep the copyright dates of
  the former ones?

This hasn't been fully tested yet (only i386-pc-solaris2.11 so far), but
I'm posting it early for comments.

Thanks.
	Rainer


2011-05-02  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

	gcc:
	* config.gcc (i[34567]86-*-solaris2*): Remove t-svr4,
	t-slibgcc-elf-ver, t-slibgcc-sld from tmake_file, add
	t-slibgcc-dummy.
	(sparc*-*-solaris2*): Remove sparc/t-sol2, sparc/t-crtfm,
	t-slibgcc-elf-ver, t-slibgcc-sld, add t-slibgcc-dummy.
	Remove extra_parts.
	* config/t-sol2 (TARGET_LIBGCC2_CFLAGS): Define.
	* config/i386/t-sol2-10 (LIBGCC, INSTALL_LIBGCC,
	EXTRA_MULTILIB_PARTS): Remove.
	* config/sparc/t-sol2-64: Likewise.
	* config/sparc/t-sol2: Move to libgcc/config/sparc.
	* config/sparc/gmon-sol2.c: Move to libgcc/config.
	* config/i386/gmon-sol2.c: Remove.
	* config/i386/sol2-c1.asm: Move to libgcc/config/i386/sol2-c1.S.
	* config/i386/sol2-ci.asm: Move to libgcc/config/i386/sol2-ci.S.
	* config/i386/sol2-cn.asm: Move to libgcc/config/i386/sol2-cn.S.
	* config/i386/sol2-gc1.asm: Move to libgcc/config/i386/sol2-gc1.S.
	* config/sparc/sol2-c1.asm: Move to libgcc/config/sparc/sol2-c1.S.
	* config/sparc/sol2-ci.asm: Move to libgcc/config/sparc/sol2-ci.S.
	* config/sparc/sol2-cn.asm: Move to libgcc/config/sparc/sol2-cn.S.
	* config/t-slibgcc-sld: Move to libgcc/config.
	* config/t-slibgcc-dummy: New file.

	libgcc:
	* Makefile.in (cpu_type): Define.
	* config.host 	(i[34567]86-*-solaris2*): Move body ...
	(*-*-solaris2*): ... here.
	New case, generalize.
	(sparc-*-linux*): Replace sparc/t-crtfm by t-crtfm.
	(sparc64-*-linux*): Likewise.
	(sparc64-*-solaris2*, sparcv9-*-solaris2*, sparc-*-solaris2*):
	Fold into ...
	(sparc*-*-solaris2*): ... this.
	New case.
	* config/gmon-sol2.c: Move from gcc/config/sparc.
	Merge gcc/config/i386/gmon-sol2.c.
	* config/i386/sol2-c1.S: Move from gcc/config/i386/sol2-c1.asm.
	* config/i386/sol2-ci.S: Move from gcc/config/i386/sol2-ci.asm.
	* config/i386/sol2-cn.S: Move from gcc/config/i386/sol2-cn.asm.
	* config/i386/sol2-gc1.S: Move from gcc/config/i386/sol2-gc1.asm.
	* config/i386/t-crtfm (crtfastmath.o): Use $<.
	* config/i386/t-sol2 ($(T)gmon.o, $(T)gcrt1.o, $(T)crt1.o),
	$(T)crti.o, $(T)crtn.o): Remove.
	(gcrt1.o): New rule.
	(TARGET_LIBGCC2_CFLAGS): Remove.
	* config/t-sol2: Move from gcc/config/sparc.
	($(T)gmon.o, $(T)crt1.o, $(T)crti.o, $(T)crtn.o, $(T)gcrt1.o): Remove.
	(gcrt1.o): New rule.
	(TARGET_LIBGCC2_CFLAGS): Remove.
	* config/sparc/t-crtfm: Move to ...
	* config/t-crtfm: ... this.
	Use $(cpu_type), $<.
	* config/t-slibgcc: Move from gcc/config.
	(SHLIB_SOVERSION): Define.
	(SHLIB_SONAME): Use it.
	(SHLIB_LC, SHLIB_MAKE_SOLINK, SHLIB_INSTALL_SOLINK): Define.
	(SHLIB_LINK): Use $(CC), $(SHLIB_LDFLAGS), $(SHLIB_MAKE_SOLINK).
	Replace $$ by $.
	(SHLIB_INSTALL): Replace $$ by $.
	Use $(SHLIB_INSTALL_SOLINK).
	(SHLIB_MKMAP, SHLIB_MAPFILES): Remove.
	* config/t-slibgcc-elf-ver: New file.
	* config/t-slibgcc-gld: New file.
	* config/t-slibgcc-sld: New file.
	* config/t-sol2: New file.
	* configure.ac: Include ../config/lib-ld.m4.
	Call AC_LIB_PROG_LD_GNU.
	Substitute cpu_type.
	* configure: Regenerate.
Joseph S. Myers - May 2, 2011, 5:09 p.m.
On Mon, 2 May 2011, Rainer Orth wrote:

> * Another wart was that gcc/ada/gcc-interface/Makefile.in requires
>   TARGET_LIBGCC2_CFLAGS, which is otherwise only used in libgcc.  It
>   often contains -fPIC, and if the variable is removed, libgnat.so won't
>   link (text relocations remain).
> 
>   This is probably another ada PR?

It would be good for the Ada target library build to rely only on the 
flags in the toplevel libada directory (and if necessary on flags in the 
toplevel libgcc directory if there is something that genuinely should be 
shared), though I don't know how hard that is to fix.  (In general more of 
the logic and source code relating to building Ada files for the target 
should go in the toplevel libada directory.  But there are quite a lot of 
files built for both the host and the target which complicates things, and 
those contribute a few target macros to the list in 
<http://gcc.gnu.org/wiki/Top-Level_Libgcc_Migration> of those still used 
in target code.)

As a related issue, there are too many macros used to indicate that code 
is being built for the target (USED_FOR_TARGET, IN_TARGET_LIBS, IN_RTS, 
IN_LIBGCC2, __GCC_FLOAT_NOT_NEEDED) - see my comments in 
<http://gcc.gnu.org/ml/gcc-patches/2010-10/msg00947.html>.

> * There are several one- or two-line makefile fragments in gcc and
>   libgcc.  What is our policy for adding copyright notices to them.  In
>   a couple of cases, the files are the only remainder/extract of a
>   previously far longer file.  Should they keep the copyright dates of
>   the former ones?

The FSF policy is that any file more than ten lines long should have a 
copyright and license notice; files up to ten lines don't need them.

http://www.gnu.org/prep/maintain/html_node/Copyright-Notices.html

Patch

diff --git a/gcc/config.gcc b/gcc/config.gcc
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1328,16 +1328,13 @@  i[34567]86-*-solaris2*)
 	if test x$gas = xyes; then
 		tm_file="${tm_file} i386/sol2-gas.h"
 	fi
-	tmake_file="${tmake_file} t-sol2 t-svr4"
+	tmake_file="${tmake_file} t-sol2 t-slibgcc-dummy"
 	c_target_objs="${c_target_objs} sol2-c.o"
 	cxx_target_objs="${cxx_target_objs} sol2-c.o"
 	extra_objs="sol2.o"
 	tm_p_file="${tm_p_file} sol2-protos.h"
 	if test x$gnu_ld = xyes; then
-		tmake_file="$tmake_file t-slibgcc-elf-ver"
 		tm_defines="${tm_defines} TARGET_GNU_LD=1"
-	else
-		tmake_file="$tmake_file t-slibgcc-sld"
 	fi
 	if test x$gas = xyes; then
 		tm_file="usegas.h ${tm_file}"
@@ -1348,9 +1345,6 @@  i[34567]86-*-solaris2*)
 		tm_file="${tm_file} i386/x86-64.h i386/sol2-10.h"
 		tm_defines="${tm_defines} TARGET_BI_ARCH=1"
 		tmake_file="$tmake_file i386/t-sol2-10"
-		# i386/t-crtstuff only affects libgcc.  Its inclusion
-		# depends on a runtime test and is thus performed in
-		# libgcc/configure.ac instead.
 		need_64bit_hwint=yes
 		need_64bit_isa=yes
 		use_gcc_stdint=wrap
@@ -2476,12 +2470,7 @@  sparc*-*-solaris2*)
 		tm_file="${tm_file} sol2-gld.h sparc/sol2-gld-bi.h"
 	fi
 	tm_file="${tm_file} tm-dwarf2.h"
-	tmake_file="t-sol2 sparc/t-sol2 sparc/t-sol2-64 sparc/t-crtfm"
-	if test x$gnu_ld = xyes; then
-		tmake_file="$tmake_file t-slibgcc-elf-ver"
-	else
-		tmake_file="$tmake_file t-slibgcc-sld"
-	fi
+	tmake_file="t-sol2 t-slibgcc-dummy sparc/t-sol2-64"
 	if test x$gas = xyes; then
 		tm_file="usegas.h ${tm_file}"
 	fi
@@ -2489,7 +2478,6 @@  sparc*-*-solaris2*)
 	cxx_target_objs="sol2-c.o"
 	extra_objs="sol2.o"
 	tm_p_file="${tm_p_file} sol2-protos.h"
-	extra_parts="crt1.o crti.o crtn.o gcrt1.o gmon.o crtbegin.o crtend.o"
 	case ${enable_threads}:${have_pthread_h}:${have_thread_h} in
 	  "":yes:* | yes:yes:* )
 		thread_file=posix
diff --git a/gcc/config/i386/t-sol2-10 b/gcc/config/i386/t-sol2-10
--- a/gcc/config/i386/t-sol2-10
+++ b/gcc/config/i386/t-sol2-10
@@ -1,4 +1,4 @@ 
-# Copyright (C) 2004 Free Software Foundation, Inc.
+# Copyright (C) 2004, 2011 Free Software Foundation, Inc.
 #
 # This file is part of GCC.
 #
@@ -19,11 +19,3 @@ 
 MULTILIB_OPTIONS = m32/m64
 MULTILIB_DIRNAMES = 32 amd64
 MULTILIB_OSDIRNAMES = . amd64
-
-LIBGCC = stmp-multilib
-INSTALL_LIBGCC = install-multilib
-
-# GCC contains i386 assembler sources for some of the startfiles
-# which aren't appropriate for amd64.  Just use the installed
-# versions of: crt1.o crti.o crtn.o gcrt1.o
-EXTRA_MULTILIB_PARTS=gmon.o crtbegin.o crtend.o
diff --git a/gcc/config/sparc/t-sol2-64 b/gcc/config/sparc/t-sol2-64
--- a/gcc/config/sparc/t-sol2-64
+++ b/gcc/config/sparc/t-sol2-64
@@ -2,9 +2,3 @@  MULTILIB_OPTIONS = m32/m64
 MULTILIB_DIRNAMES = sparcv8plus sparcv9
 MULTILIB_MATCHES =
 MULTILIB_OSDIRNAMES = . sparcv9
-
-LIBGCC = stmp-multilib
-INSTALL_LIBGCC = install-multilib
-
-EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o gmon.o crt1.o crti.o crtn.o gcrt1.o \
-	crtfastmath.o
diff --git a/gcc/config/t-slibgcc-dummy b/gcc/config/t-slibgcc-dummy
new file mode 100644
--- /dev/null
+++ b/gcc/config/t-slibgcc-dummy
@@ -0,0 +1,3 @@ 
+# SHLIB_LINK must be non-empty so ENABLE_SHARED_LIBGCC is defined correctly
+# in DRIVER_DEFINES if libgcc configuration has been moved to toplevel.
+SHLIB_LINK = dummy
diff --git a/gcc/config/t-sol2 b/gcc/config/t-sol2
--- a/gcc/config/t-sol2
+++ b/gcc/config/t-sol2
@@ -29,6 +29,9 @@  sol2.o: $(srcdir)/config/sol2.c $(CONFIG
 	$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
 	  $(srcdir)/config/sol2.c
 
+# This is required by gcc/ada/gcc-interface/Makefile.in.
+TARGET_LIBGCC2_CFLAGS = -fPIC
+
 # Use unwind-dw2-fde-glibc.c.  Unless linker support and dl_iterate_phdr
 # are present, automatically falls back to unwind-dw2-fde.c.
 LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde-glibc.c \
diff --git a/libgcc/Makefile.in b/libgcc/Makefile.in
--- a/libgcc/Makefile.in
+++ b/libgcc/Makefile.in
@@ -1,6 +1,6 @@ 
 # Makefile.in
 
-# Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation
+# Copyright (C) 2005, 2006, 2009, 2010, 2011 Free Software Foundation
 #
 # This file is part of GCC.
 #
@@ -35,6 +35,7 @@  shlib_slibdir = @slibdir@
 
 SHELL = @SHELL@
 
+cpu_type = @cpu_type@
 enable_shared = @enable_shared@
 decimal_float = @decimal_float@
 enable_decimal_float = @enable_decimal_float@
diff --git a/libgcc/config.host b/libgcc/config.host
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -1,6 +1,6 @@ 
 # libgcc host-specific configuration file.
 # Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-# 2008, 2009, 2010 Free Software Foundation, Inc.
+# 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
 
 #This file is part of GCC.
 
@@ -168,6 +168,26 @@  case ${host} in
   ;;
 *-*-rtems*)
   ;;
+*-*-solaris2*)
+  tmake_file="$tmake_file t-sol2 t-slibgcc t-slibgcc-elf-ver"
+  if test $with_gnu_ld = yes; then
+    tmake_file="$tmake_file t-slibgcc-gld"
+  else
+    tmake_file="$tmake_file t-slibgcc-sld"
+  fi
+  # Add cpu-specific t-sol2 after t-slibgcc-* so it can augment SHLIB_MAPFILES.
+  tmake_file="$tmake_file $cpu_type/t-sol2"
+  extra_parts="gmon.o crtbegin.o crtend.o"
+  case ${host} in
+    *-*-solaris2.1[0-9]*)
+      # Solaris 10+ provides crt1.o, crti.o, crtn.o, and gcrt1.o as
+      # part of the base system.
+      ;;
+    *)
+      extra_parts="$extra_parts crt1.o crti.o crtn.o gcrt1.o"
+      ;;
+  esac
+  ;;
 *-*-vxworks*)
   ;;
 *-*-elf)
@@ -311,17 +331,6 @@  i[34567]86-*-nto-qnx*)
 i[34567]86-*-rtems*)
 	;;
 i[34567]86-*-solaris2*)
-	tmake_file="${tmake_file} i386/t-sol2"
-	case ${host} in
-	*-*-solaris2.1[0-9]*)
-		# Solaris 2.10 provides crt1.o, crti.o, crtn.o, and gcrt1.o as
-		# part of the base system.
-		extra_parts="gmon.o crtbegin.o crtend.o"
-		;;
-	*)
-		extra_parts="crt1.o crti.o crtn.o gcrt1.o gmon.o crtbegin.o crtend.o"
-		;;
-	esac
 	;;
 i[4567]86-wrs-vxworks|i[4567]86-wrs-vxworksae)
 	;;
@@ -522,13 +531,13 @@  sparc-*-elf*)
 	;;
 sparc-*-linux*)		# SPARC's running GNU/Linux, libc6
 	extra_parts="$extra_parts crtfastmath.o"
-	tmake_file="${tmake_file} sparc/t-crtfm"
+	tmake_file="${tmake_file} t-crtfm"
 	;;
 sparc-*-rtems* | sparc64-*-rtems* )
 	;;
-sparc64-*-solaris2* | sparcv9-*-solaris2*)
-	;;
-sparc-*-solaris2*)
+sparc*-*-solaris2*)
+	tmake_file="$tmake_file t-crtfm"
+	extra_parts="$extra_parts crtfastmath.o"
 	;;
 sparc64-*-elf*)
 	;;
@@ -538,7 +547,7 @@  sparc64-*-freebsd*|ultrasparc-*-freebsd*
 	;;
 sparc64-*-linux*)		# 64-bit SPARC's running GNU/Linux
 	extra_parts="$extra_parts crtfastmath.o"
-	tmake_file="${tmake_file} sparc/t-crtfm"
+	tmake_file="${tmake_file} t-crtfm"
 	;;
 sparc64-*-netbsd*)
 	;;
diff --git a/gcc/config/sparc/gmon-sol2.c b/libgcc/config/gmon-sol2.c
rename from gcc/config/sparc/gmon-sol2.c
rename to libgcc/config/gmon-sol2.c
--- a/gcc/config/sparc/gmon-sol2.c
+++ b/libgcc/config/gmon-sol2.c
@@ -28,32 +28,67 @@ 
  * SUCH DAMAGE.
  */
 
+/* FIXME: Check comment.  */
 /* Mangled into a form that works on SPARC Solaris 2 by Mark Eichin
  * for Cygnus Support, July 1992.
+ *
+ * This is a modified gmon.c by J.W.Hawtin <oolon@ankh.org>,
+ * 14/8/96 based on the original gmon.c in GCC and the hacked version
+ * solaris 2 sparc version (config/sparc/gmon-sol.c) by Mark Eichin. To do
+ * process profiling on solaris 2.X X86
+ *
+ * It must be used in conjunction with sol2-gc1.asm, which is used to start
+ * and stop process monitoring.
+ *
+ * Differences.
+ *
+ * On Solaris 2 _mcount is called by library functions not mcount, so support
+ * has been added for both.
+ *
+ * Also the prototype for profil() is different
+ *
+ * Solaris 2 does not seem to have char *minbrk whcih allows the setting of
+ * the minimum SBRK region so this code has been removed and lets pray malloc
+ * does not mess it up.
+ *
+ * Notes
+ *
+ * This code could easily be integrated with the original gmon.c and perhaps
+ * should be.
  */
-
 #include "tconfig.h"
 #include "tsystem.h"
 #include <fcntl.h> /* for creat() */
 
-#if 0
-#include "sparc/gmon.h"
-#else
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+static void moncontrol (int);
+extern void monstartup (char *, char *);
+extern void _mcleanup (void);
+
 struct phdr {
   char *lpc;
   char *hpc;
   int ncnt;
 };
+
+
 #define HISTFRACTION 2
 #define HISTCOUNTER unsigned short
 #define HASHFRACTION 1
 #define ARCDENSITY 2
 #define MINARCS 50
+#define BASEADDRESS 0x8000000 /* On Solaris 2 X86 all executables start here
+				 and not at 0 */ 
+
 struct tostruct {
   char *selfpc;
   long count;
   unsigned short link;
 };
+
 struct rawarc {
     unsigned long       raw_frompc;
     unsigned long       raw_selfpc;
@@ -62,10 +97,14 @@  struct rawarc {
 #define ROUNDDOWN(x,y)  (((x)/(y))*(y))
 #define ROUNDUP(x,y)    ((((x)+(y)-1)/(y))*(y))
 
-#endif
-
 /* extern mcount() asm ("mcount"); */
 /*extern*/ char *minbrk /* asm ("minbrk") */;
+typedef __SIZE_TYPE__ size_t;
+typedef __PTRDIFF_TYPE__ intptr_t;
+
+extern int errno;
+
+extern void *sbrk (intptr_t);
 
     /*
      *	froms is actually a bunch of unsigned shorts indexing tos
@@ -76,7 +115,7 @@  static struct tostruct	*tos = 0;
 static long		tolimit = 0;
 static char		*s_lowpc = 0;
 static char		*s_highpc = 0;
-static unsigned long	s_textsize = 0;
+static size_t		s_textsize = 0;
 
 static int	ssiz;
 static char	*sbuf;
@@ -92,23 +131,23 @@  extern void _mcleanup (void);
 
 void monstartup(char *lowpc, char *highpc)
 {
-    int			monsize;
+    size_t		monsize;
     char		*buffer;
-    register int	o;
+    register size_t	o;
 
 	/*
 	 *	round lowpc and highpc to multiples of the density we're using
 	 *	so the rest of the scaling (here and in gprof) stays in ints.
 	 */
     lowpc = (char *)
-	    ROUNDDOWN((unsigned long)lowpc, HISTFRACTION*sizeof(HISTCOUNTER));
+	    ROUNDDOWN((size_t)lowpc, HISTFRACTION*sizeof(HISTCOUNTER));
     s_lowpc = lowpc;
     highpc = (char *)
-	    ROUNDUP((unsigned long)highpc, HISTFRACTION*sizeof(HISTCOUNTER));
+	    ROUNDUP((size_t)highpc, HISTFRACTION*sizeof(HISTCOUNTER));
     s_highpc = highpc;
     s_textsize = highpc - lowpc;
     monsize = (s_textsize / HISTFRACTION) + sizeof(struct phdr);
-    buffer = sbrk( monsize );
+    buffer = (char *) sbrk( monsize );
     if ( buffer == (char *) -1 ) {
 	write( 2 , MSG , sizeof(MSG) );
 	return;
@@ -206,8 +245,9 @@  _mcleanup(void)
 	return;
     }
 #   ifdef DEBUG
-	fprintf( stderr , "[mcleanup] sbuf 0x%x ssiz %d\n" , sbuf , ssiz );
+	fprintf( stderr , "[mcleanup] sbuf %#x ssiz %d\n" , sbuf , ssiz );
 #   endif /* DEBUG */
+
     write( fd , sbuf , ssiz );
     endfrom = s_textsize / (HASHFRACTION * sizeof(*froms));
     for ( fromindex = 0 ; fromindex < endfrom ; fromindex++ ) {
@@ -218,7 +258,7 @@  _mcleanup(void)
 	for (toindex=froms[fromindex]; toindex!=0; toindex=tos[toindex].link) {
 #	    ifdef DEBUG
 		fprintf( stderr ,
-			"[mcleanup] frompc 0x%x selfpc 0x%x count %d\n" ,
+			"[mcleanup] frompc %#x selfpc %#x count %d\n" ,
 			frompc , tos[toindex].selfpc , tos[toindex].count );
 #	    endif /* DEBUG */
 	    rawarc.raw_frompc = (unsigned long) frompc;
@@ -230,6 +270,7 @@  _mcleanup(void)
     close( fd );
 }
 
+#ifdef __sparc__
 /*
  * The SPARC stack frame is only held together by the frame pointers
  * in the register windows. According to the SVR4 SPARC ABI
@@ -273,25 +314,99 @@  static void internal_mcount (char *, uns
 asm(".global _mcount; _mcount: mov %i7,%o1; mov %o7,%o0;b,a internal_mcount");
 /* This is for compatibility with old versions of gcc which used mcount.  */
 asm(".global mcount; mcount: mov %i7,%o1; mov %o7,%o0;b,a internal_mcount");
+#elif defined __x86_64__
+extern void internal_mcount (char *, unsigned short *);
 
-static void internal_mcount(char *selfpc, unsigned short *frompcindex)
+/* See GLIBC for additional information about this technique.  */
+asm(".globl _mcount\n" 
+    "\t.type\t_mcount, @function\n"
+    "_mcount:\n"
+    /* The compiler calls _mcount after the prologue, and does not
+       save any of the registers.  Therefore we must preserve all
+       seven registers which may contain function arguments.  */
+    "\tsubq\t$0x38,%rsp\n"
+    "\tmovq\t%rax,(%rsp)\n"
+    "\tmovq\t%rcx,0x08(%rsp)\n"
+    "\tmovq\t%rdx,0x10(%rsp)\n"
+    "\tmovq\t%rsi,0x18(%rsp)\n"
+    "\tmovq\t%rdi,0x20(%rsp)\n"
+    "\tmovq\t%r8,0x28(%rsp)\n"
+    "\tmovq\t%r9,0x30(%rsp)\n"
+    /* Get SELFPC (pushed by the call to this function) and
+       FROMPCINDEX (via the frame pointer.  */
+    "\tmovq\t0x38(%rsp),%rdi\n"
+    "\tmovq\t0x8(%rbp),%rsi\n"
+    "\tcall\tinternal_mcount\n"
+    /* Restore the saved registers.  */
+    "\tmovq\t0x30(%rsp),%r9\n"
+    "\tmovq\t0x28(%rsp),%r8\n"
+    "\tmovq\t0x20(%rsp),%rdi\n"
+    "\tmovq\t0x18(%rsp),%rsi\n"
+    "\tmovq\t0x10(%rsp),%rdx\n"
+    "\tmovq\t0x08(%rsp),%rcx\n"
+    "\tmovq\t(%rsp),%rax\n"
+    "\taddq\t$0x38,%rsp\n"
+    "\tretq\n"
+    );
+#else
+extern void internal_mcount (void);
+
+ /* Solaris 2 libraries use _mcount.  */
+asm(".globl _mcount; _mcount: jmp internal_mcount");
+ /* This is for compatibility with old versions of gcc which used mcount.  */
+asm(".globl mcount; mcount: jmp internal_mcount");
+#endif
+
+#ifdef __sparc__
+static
+#endif
+void
+internal_mcount (
+#if defined __sparc__ || defined __x86_64__
+		 char *selfpc,
+		 unsigned short *frompcindex
+#else
+		 void
+#endif
+		 )
 {
+#if !defined __sparc__ && !defined __x86_64__
+	register char			*selfpc;
+	register unsigned short		*frompcindex;
+#endif
 	register struct tostruct	*top;
 	register struct tostruct	*prevtop;
 	register long			toindex;
 	static char already_setup;
 
+#if !defined __sparc__ && !defined __x86_64__
 	/*
 	 *	find the return address for mcount,
 	 *	and the return address for mcount's caller.
 	 */
 
+	/* selfpc = pc pushed by mcount call.
+	   This identifies the function that was just entered.  */
+	selfpc = (void *) __builtin_return_address (0);
+	/* frompcindex = pc in preceding frame.
+	   This identifies the caller of the function just entered.  */
+	frompcindex = (void *) __builtin_return_address (1);
+#endif
+
 	if(!already_setup) {
           extern char etext[];
+#ifdef __sparc__
 	  extern char _start[];
 	  extern char _init[];
+#endif
 	  already_setup = 1;
+#if defined __sparc__
 	  monstartup(_start < _init ? _start : _init, etext);
+#elif defined __x86_64__
+	  monstartup(0, etext);
+#else
+	  monstartup((char*)0x08040000, etext);
+#endif
 #ifdef USE_ONEXIT
 	  on_exit(_mcleanup, 0);
 #else
@@ -410,7 +525,8 @@  static void moncontrol(int mode)
 	/* start */
 	profil((unsigned short *)(sbuf + sizeof(struct phdr)),
 	       ssiz - sizeof(struct phdr),
-	       (long)s_lowpc, s_scale);
+	       (size_t)s_lowpc, s_scale);
+
 	profiling = 0;
     } else {
 	/* stop */
diff --git a/gcc/config/i386/sol2-c1.asm b/libgcc/config/i386/sol2-c1.S
rename from gcc/config/i386/sol2-c1.asm
rename to libgcc/config/i386/sol2-c1.S
diff --git a/gcc/config/i386/sol2-ci.asm b/libgcc/config/i386/sol2-ci.S
rename from gcc/config/i386/sol2-ci.asm
rename to libgcc/config/i386/sol2-ci.S
diff --git a/gcc/config/i386/sol2-cn.asm b/libgcc/config/i386/sol2-cn.S
rename from gcc/config/i386/sol2-cn.asm
rename to libgcc/config/i386/sol2-cn.S
diff --git a/gcc/config/i386/sol2-gc1.asm b/libgcc/config/i386/sol2-gc1.S
rename from gcc/config/i386/sol2-gc1.asm
rename to libgcc/config/i386/sol2-gc1.S
diff --git a/libgcc/config/i386/t-crtfm b/libgcc/config/i386/t-crtfm
--- a/libgcc/config/i386/t-crtfm
+++ b/libgcc/config/i386/t-crtfm
@@ -1,5 +1,4 @@ 
 # This is an endfile, Use -minline-all-stringops to ensure
 # that __builtin_memset doesn't refer to the lib function memset().
 crtfastmath.o: $(gcc_srcdir)/config/i386/crtfastmath.c
-	$(gcc_compile) -msse -minline-all-stringops -c \
-	$(gcc_srcdir)/config/i386/crtfastmath.c
+	$(gcc_compile) -msse -minline-all-stringops -c $<
diff --git a/libgcc/config/i386/t-sol2 b/libgcc/config/i386/t-sol2
--- a/libgcc/config/i386/t-sol2
+++ b/libgcc/config/i386/t-sol2
@@ -1,24 +1,6 @@ 
-# gmon build rule:
-$(T)gmon.o:	$(gcc_srcdir)/config/i386/gmon-sol2.c $(GCC_PASSES) $(CONFIG_H)
-	$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(CFLAGS) \
-		-c $(gcc_srcdir)/config/i386/gmon-sol2.c -o $(T)gmon.o
-
 # Assemble startup files.
-# Apparently Sun believes that assembler files don't need comments, because no
-# single ASCII character is valid (tried them all).  So we manually strip out
-# the comments with sed.  This bug may only be in the Early Access releases.
-$(T)gcrt1.o: $(gcc_srcdir)/config/i386/sol2-gc1.asm $(GCC_PASSES)
-	sed -e '/^!/d' <$(gcc_srcdir)/config/i386/sol2-gc1.asm >gcrt1.s
-	$(GCC_FOR_TARGET) $(CFLAGS) -c -o $(T)gcrt1.o gcrt1.s
-$(T)crt1.o: $(gcc_srcdir)/config/i386/sol2-c1.asm $(GCC_PASSES)
-	sed -e '/^!/d' <$(gcc_srcdir)/config/i386/sol2-c1.asm >crt1.s
-	$(GCC_FOR_TARGET) $(CFLAGS) -c -o $(T)crt1.o crt1.s
-$(T)crti.o: $(gcc_srcdir)/config/i386/sol2-ci.asm $(GCC_PASSES)
-	sed -e '/^!/d' <$(gcc_srcdir)/config/i386/sol2-ci.asm >crti.s
-	$(GCC_FOR_TARGET) $(CFLAGS) -c -o $(T)crti.o crti.s
-$(T)crtn.o: $(gcc_srcdir)/config/i386/sol2-cn.asm $(GCC_PASSES)
-	sed -e '/^!/d' <$(gcc_srcdir)/config/i386/sol2-cn.asm >crtn.s
-	$(GCC_FOR_TARGET) $(CFLAGS) -c -o $(T)crtn.o crtn.s
+gcrt1.o: $(srcdir)/config/$(cpu_type)/sol2-gc1.S
+	$(gcc_compile) -c $<
 
 # We need to use -fPIC when we are using gcc to compile the routines in
 # crtstuff.c.  This is only really needed when we are going to use gcc/g++
@@ -29,9 +11,7 @@ 
 # We must also enable optimization to avoid having any code appear after
 # the call & alignment statement, but before we switch back to the
 # .text section.
-
 CRTSTUFF_T_CFLAGS = -fPIC -O2
-TARGET_LIBGCC2_CFLAGS = -fPIC
 
 # Add support for the introduction of 128-bit long double.
 SHLIB_MAPFILES += $(srcdir)/config/i386/libgcc-sol2.ver
diff --git a/gcc/config/sparc/sol2-c1.asm b/libgcc/config/sparc/sol2-c1.S
rename from gcc/config/sparc/sol2-c1.asm
rename to libgcc/config/sparc/sol2-c1.S
diff --git a/gcc/config/sparc/sol2-ci.asm b/libgcc/config/sparc/sol2-ci.S
rename from gcc/config/sparc/sol2-ci.asm
rename to libgcc/config/sparc/sol2-ci.S
diff --git a/gcc/config/sparc/sol2-cn.asm b/libgcc/config/sparc/sol2-cn.S
rename from gcc/config/sparc/sol2-cn.asm
rename to libgcc/config/sparc/sol2-cn.S
diff --git a/gcc/config/sparc/t-sol2 b/libgcc/config/sparc/t-sol2
rename from gcc/config/sparc/t-sol2
rename to libgcc/config/sparc/t-sol2
--- a/gcc/config/sparc/t-sol2
+++ b/libgcc/config/sparc/t-sol2
@@ -1,5 +1,5 @@ 
 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001,
-# 2002 Free Software Foundation, Inc.
+# 2002, 2011 Free Software Foundation, Inc.
 #
 # This file is part of GCC.
 #
@@ -17,27 +17,13 @@ 
 # along with GCC; see the file COPYING3.  If not see
 # <http://www.gnu.org/licenses/>.
 
-# gmon build rule:
-$(T)gmon.o:	$(srcdir)/config/sparc/gmon-sol2.c $(GCC_PASSES) \
-  $(TCONFIG_H) tsystem.h coretypes.h $(TM_H) stmp-int-hdrs
-	$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) \
-		-c $(srcdir)/config/sparc/gmon-sol2.c -o $(T)gmon.o
-
 # Assemble startup files.
-$(T)crt1.o: $(srcdir)/config/sparc/sol2-c1.asm $(GCC_PASSES)
-	$(GCC_FOR_TARGET) $(MULTILIB_CFLAGS) -c -o $(T)crt1.o -x assembler-with-cpp $(srcdir)/config/sparc/sol2-c1.asm
-$(T)crti.o: $(srcdir)/config/sparc/sol2-ci.asm $(GCC_PASSES)
-	$(GCC_FOR_TARGET) $(MULTILIB_CFLAGS) -c -o $(T)crti.o -x assembler-with-cpp $(srcdir)/config/sparc/sol2-ci.asm
-$(T)crtn.o: $(srcdir)/config/sparc/sol2-cn.asm $(GCC_PASSES)
-	$(GCC_FOR_TARGET) $(MULTILIB_CFLAGS) -c -o $(T)crtn.o -x assembler-with-cpp $(srcdir)/config/sparc/sol2-cn.asm
-$(T)gcrt1.o: $(srcdir)/config/sparc/sol2-c1.asm $(GCC_PASSES)
-	$(GCC_FOR_TARGET) $(MULTILIB_CFLAGS) -c -DGCRT1 -o $(T)gcrt1.o -x assembler-with-cpp $(srcdir)/config/sparc/sol2-c1.asm
+gcrt1.o: $(srcdir)/config/$(cpu_type)/sol2-gc1.S
+	$(gcc_compile) -c -DGCRT1 $<
 
 # We need to use -fPIC when we are using gcc to compile the routines in
 # crtstuff.c.  This is only really needed when we are going to use gcc/g++
 # to produce a shared library, but since we don't know ahead of time when
 # we will be doing that, we just always use -fPIC when compiling the
 # routines in crtstuff.c.
-
 CRTSTUFF_T_CFLAGS = -fPIC
-TARGET_LIBGCC2_CFLAGS = -fPIC
diff --git a/libgcc/config/sparc/t-crtfm b/libgcc/config/t-crtfm
rename from libgcc/config/sparc/t-crtfm
rename to libgcc/config/t-crtfm
--- a/libgcc/config/sparc/t-crtfm
+++ b/libgcc/config/t-crtfm
@@ -1,2 +1,2 @@ 
-crtfastmath.o: $(gcc_srcdir)/config/sparc/crtfastmath.c
-	$(gcc_compile) -c $(gcc_srcdir)/config/sparc/crtfastmath.c
+crtfastmath.o: $(gcc_srcdir)/config/$(cpu_type)/crtfastmath.c
+	$(gcc_compile) -c $<
diff --git a/gcc/config/t-slibgcc-sld b/libgcc/config/t-slibgcc
rename from gcc/config/t-slibgcc-sld
rename to libgcc/config/t-slibgcc
--- a/gcc/config/t-slibgcc-sld
+++ b/libgcc/config/t-slibgcc
@@ -1,4 +1,5 @@ 
-# Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2011
+# Free Software Foundation, Inc.
 #
 # This file is part of GCC.
 #
@@ -16,35 +17,35 @@ 
 # along with GCC; see the file COPYING3.  If not see
 # <http://www.gnu.org/licenses/>.
 
-# Build a shared libgcc library with the Solaris linker.
+# Build a shared libgcc library for ELF.
 
 SHLIB_EXT = .so
 SHLIB_SOLINK = @shlib_base_name@.so
-SHLIB_SONAME = @shlib_base_name@.so.1
+SHLIB_SOVERSION = 1
+SHLIB_SONAME = @shlib_base_name@.so.$(SHLIB_SOVERSION)
 SHLIB_MAP = @shlib_map_file@
 SHLIB_OBJS = @shlib_objs@
 SHLIB_DIR = @multilib_dir@
 SHLIB_SLIBDIR_QUAL = @shlib_slibdir_qual@
+SHLIB_LC = -lc
+SHLIB_MAKE_SOLINK = $(LN_S) $(SHLIB_SONAME) $(SHLIB_DIR)/$(SHLIB_SOLINK)
+SHLIB_INSTALL_SOLINK = $(LN_S) $(SHLIB_SONAME) \
+	$(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK)
 
-SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \
-	-Wl,-h,$(SHLIB_SONAME) -Wl,-z,text -Wl,-z,defs \
-	-Wl,-M,$(SHLIB_MAP) -o $(SHLIB_DIR)/$(SHLIB_SONAME).tmp \
-	@multilib_flags@ $(SHLIB_OBJS) -lc && \
+SHLIB_LINK = $(CC) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \
+	$(SHLIB_LDFLAGS) \
+	-o $(SHLIB_DIR)/$(SHLIB_SONAME).tmp @multilib_flags@ \
+	$(SHLIB_OBJS) $(SHLIB_LC) && \
 	rm -f $(SHLIB_DIR)/$(SHLIB_SOLINK) && \
 	if [ -f $(SHLIB_DIR)/$(SHLIB_SONAME) ]; then \
 	  mv -f $(SHLIB_DIR)/$(SHLIB_SONAME) \
 		$(SHLIB_DIR)/$(SHLIB_SONAME).backup; \
 	else true; fi && \
 	mv $(SHLIB_DIR)/$(SHLIB_SONAME).tmp $(SHLIB_DIR)/$(SHLIB_SONAME) && \
-	$(LN_S) $(SHLIB_SONAME) $(SHLIB_DIR)/$(SHLIB_SOLINK)
-# $(slibdir) double quoted to protect it from expansion while building
-# libgcc.mk.  We want this delayed until actual install time.
+	$(SHLIB_MAKE_SOLINK)
 SHLIB_INSTALL = \
-	$$(mkinstalldirs) $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL); \
+	$(mkinstalldirs) $(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL); \
 	$(INSTALL_DATA) $(SHLIB_DIR)/$(SHLIB_SONAME) \
-	  $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SONAME); \
-	rm -f $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK); \
-	$(LN_S) $(SHLIB_SONAME) \
-	  $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK)
-SHLIB_MKMAP = $(srcdir)/mkmap-symver.awk
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver
+	  $(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SONAME); \
+	rm -f $(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK); \
+	$(SHLIB_INSTALL_SOLINK)
diff --git a/libgcc/config/t-slibgcc-elf-ver b/libgcc/config/t-slibgcc-elf-ver
new file mode 100644
--- /dev/null
+++ b/libgcc/config/t-slibgcc-elf-ver
@@ -0,0 +1,21 @@ 
+# Copyright (C) 2011 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC 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, or (at your option)
+# any later version.
+#
+# GCC 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 GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# Build a shared libgcc library for ELF.
+
+SHLIB_MAPFILES = $(gcc_srcdir)/libgcc-std.ver
diff --git a/libgcc/config/t-slibgcc-gld b/libgcc/config/t-slibgcc-gld
new file mode 100644
--- /dev/null
+++ b/libgcc/config/t-slibgcc-gld
@@ -0,0 +1,25 @@ 
+# Copyright (C) 2011
+# Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC 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, or (at your option)
+# any later version.
+#
+# GCC 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 GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# Build a shared libgcc library for ELF with symbol versioning
+# with the GNU linker.
+
+SHLIB_LDFLAGS = -Wl,--soname=$(SHLIB_SONAME) \
+	-Wl,--version-script=$(SHLIB_MAP)
+SHLIB_MKMAP = $(gcc_srcdir)/mkmap-symver.awk
diff --git a/libgcc/config/t-slibgcc-sld b/libgcc/config/t-slibgcc-sld
new file mode 100644
--- /dev/null
+++ b/libgcc/config/t-slibgcc-sld
@@ -0,0 +1,24 @@ 
+# Copyright (C) 2011
+# Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC 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, or (at your option)
+# any later version.
+#
+# GCC 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 GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# Build a shared libgcc library with the Solaris linker.
+
+SHLIB_LDFLAGS = -Wl,-h,$(SHLIB_SONAME) -Wl,-z,text -Wl,-z,defs \
+	-Wl,-M,$(SHLIB_MAP)
+SHLIB_MKMAP = $(gcc_srcdir)/mkmap-symver.awk
diff --git a/gcc/config/t-sol2 b/libgcc/config/t-sol2
copy from gcc/config/t-sol2
copy to libgcc/config/t-sol2
--- a/gcc/config/t-sol2
+++ b/libgcc/config/t-sol2
@@ -1,4 +1,4 @@ 
-# Copyright (C) 2004, 2008, 2009, 2010 Free Software Foundation, Inc.
+# Copyright (C) 2004, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
 #
 # This file is part of GCC.
 #
@@ -16,21 +16,23 @@ 
 # along with GCC; see the file COPYING3.  If not see
 # <http://www.gnu.org/licenses/>.
 
-# Solaris-specific format checking and pragmas
-sol2-c.o: $(srcdir)/config/sol2-c.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
-  tree.h c-family/c-format.h $(C_PRAGMA_H) $(C_COMMON_H) $(CPPLIB_H) \
-  intl.h $(TM_H) $(TM_P_H)
-	$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
-	  $(srcdir)/config/sol2-c.c
-
-# Solaris-specific attributes
-sol2.o: $(srcdir)/config/sol2.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
-  tree.h output.h $(TM_H) $(TM_P_H) $(GGC_H)
-	$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
-	  $(srcdir)/config/sol2.c
-
 # Use unwind-dw2-fde-glibc.c.  Unless linker support and dl_iterate_phdr
 # are present, automatically falls back to unwind-dw2-fde.c.
-LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde-glibc.c \
-  $(srcdir)/unwind-sjlj.c $(srcdir)/gthr-gnat.c $(srcdir)/unwind-c.c
+LIB2ADDEH = $(gcc_srcdir)/unwind-dw2.c $(gcc_srcdir)/unwind-dw2-fde-glibc.c \
+  $(gcc_srcdir)/unwind-sjlj.c $(gcc_srcdir)/gthr-gnat.c $(gcc_srcdir)/unwind-c.c
 LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h unwind-dw2-fde.c
+
+# gmon build rule:
+gmon.o:	$(srcdir)/config/gmon-sol2.c
+	$(gcc_compile) -c $<
+
+# Assemble startup files.
+crt1.o: $(srcdir)/config/$(cpu_type)/sol2-c1.S
+	$(gcc_compile) -c $<
+crti.o: $(srcdir)/config/$(cpu_type)/sol2-ci.S
+	$(gcc_compile) -c $<
+crtn.o: $(srcdir)/config/$(cpu_type)/sol2-cn.S
+	$(gcc_compile) -c $<
+
+HOST_LIBGCC2_CFLAGS = -fPIC
+CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS)
diff --git a/libgcc/configure.ac b/libgcc/configure.ac
--- a/libgcc/configure.ac
+++ b/libgcc/configure.ac
@@ -4,6 +4,7 @@  sinclude(../config/enable.m4)
 sinclude(../config/tls.m4)
 sinclude(../config/acx.m4)
 sinclude(../config/no-executables.m4)
+sinclude(../config/lib-ld.m4)
 sinclude(../config/override.m4)
 sinclude(../config/dfp.m4)
 
@@ -166,6 +167,8 @@  AC_CACHE_CHECK([whether fixed-point is s
 fixed_point=$libgcc_cv_fixed_point
 AC_SUBST(fixed_point)
 
+AC_LIB_PROG_LD_GNU
+
 # Check for assembler CFI support.
 AC_CACHE_CHECK([whether assembler supports CFI directives], [libgcc_cv_cfi],
 	       [AC_COMPILE_IFELSE(
@@ -268,6 +271,7 @@  tmake_file="${tmake_file_}"
 AC_SUBST(tmake_file)
 
 # Substitute configuration variables
+AC_SUBST(cpu_type)
 AC_SUBST(extra_parts)
 AC_SUBST(asm_hidden_op)