This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: 4.3/4.4 PATCH: Fix Solaris/x86 bootstrap with Sun ld (PR bootstrap/33100)


Ian Lance Taylor writes:

> Rainer Orth <ro@techfak.uni-bielefeld.de> writes:
> 
> > As I suggested in the original patch submission, it should be possible to
> > move the inclusion of i386/t-crtstuff to libgcc/configure.ac and make it
> > conditional on a linker test there.  This way, only systems with broken Sun
> > linkers would be penalized.  I could well try that approach, since it's
> > certainly cleaner and doesn't break unwind information on recent Solaris 11
> > where we don't have to.  What do you think?
> 
> I think it's up to you.  You can also just split the config.gcc test
> on the solaris version number.

I've just implemented the approach suggested in my submission.
Unfortunately, it proved to be more involved than I thought initially:

* The test for the linker bug is as I had suggested.  The only complication
  is that I have to link it with -nostartfiles -nodefaultlibs since neither
  exist at libgcc configure time.

* Initially, moving i386/t-crtstuff to libgcc had no effect.  It took me
  some time to figure out that the files in extra_parts were still built in
  gcc and later copied to libgcc, with own rules in gcc/Makefile.in
  unaffected by libgcc configure ;-(

  After I realized that, I had to move i386/t-sol2 to libgcc, too, so the
  make rules for gmon.o are present.

After that, I tested the resulting patch in three different ways:

* Solaris 10/x86 with GNU as 2.15 and Sun ld (broken)

* Solaris 10/x86 with GNU as 2.15 and GNU ld 2.19 (ok)

* Solaris 11/x86 with GNU as 2.15 and Sun ld (fixed)

As expected, i386/t-crtstuff isn't used in the first configuration while it
is in the other two.

The first two bootstraps completed without regressions, while the third
(the first time I tested on Solaris 11/x86) showed several unrelated
problems: I get many warnings from Sun ld like

ld: warning: file ./.libs/libgcj.so: section .strtab: malformed string table, initial or final byte

I'm pretty sure this is unrelated and will investigate/take this up with
the Sun linker maintainers.

Ok for mainline and 4.3 branch?

I realize this might be considered too intrusive for the 4.3 branch, if so
I'd like to install the original patch (already on the 4.2 branch) there so
that 4.3 doesn't remain the only unfixed release branch.

	Rainer

-----------------------------------------------------------------------------
Rainer Orth, Faculty of Technology, Bielefeld University



Tue Nov 18 20:19:32 2008  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>

	gcc:
	PR bootstrap/33100
	* config.gcc (i[34567]86-*-solaris2*): Don't include
	i386/t-crtstuff here.
	Move extra_parts, i386/t-sol2 in tmake_file to libgcc/config.host.
	* config/i386/t-sol2: Move to libgcc/config/i386.
	
	libgcc:
	PR bootstrap/33100
	* configure.ac (i?86-*-solaris2.1[0-9]*): Only include
	i386/t-crtstuff if linker supports ZERO terminator unwind entries.
	* configure: Regenerate.
	* config.host (i[34567]86-*-solaris2*): Move i386/t-sol2 in
	tmake_file here from config.gcc.
	Move extra_parts here from config.gcc.
	* config/i386/t-sol2: Move here from gcc/config/i386.
	Use gcc_srcdir instead of srcdir.
	
Index: gcc/config.gcc
===================================================================
--- gcc/config.gcc	(revision 142008)
+++ gcc/config.gcc	(working copy)
@@ -1173,7 +1173,7 @@ i[34567]86-*-solaris2*)
 		;;
 	esac
 	tm_file="${tm_file} i386/sol2.h"
-	tmake_file="${tmake_file} t-sol2 i386/t-sol2 t-svr4"
+	tmake_file="${tmake_file} t-sol2 t-svr4"
 	c_target_objs="${c_target_objs} sol2-c.o"
 	cxx_target_objs="${cxx_target_objs} sol2-c.o"
 	extra_objs="sol2.o"
@@ -1192,7 +1192,10 @@ i[34567]86-*-solaris2*)
 	*-*-solaris2.1[0-9]*)
 		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-crtstuff i386/t-sol2-10"
+		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
 		case X"${with_cpu}" in
 		Xgeneric|Xcore2|Xnocona|Xx86-64|Xamdfam10|Xbarcelona|Xk8|Xopteron|Xathlon64|Xathlon-fx)
@@ -1208,12 +1211,6 @@ i[34567]86-*-solaris2*)
 			exit 1
 			;;
 		esac
-		# 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
 	case ${enable_threads}:${have_pthread_h}:${have_thread_h} in
Index: gcc/config/i386/t-sol2
===================================================================
--- gcc/config/i386/t-sol2	(revision 141745)
+++ gcc/config/i386/t-sol2	(working copy)
@@ -1,34 +0,0 @@
-# gmon build rule:
-$(T)gmon.o:	$(srcdir)/config/i386/gmon-sol2.c $(GCC_PASSES) $(CONFIG_H)
-	$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) \
-		-c $(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: $(srcdir)/config/i386/sol2-gc1.asm $(GCC_PASSES)
-	sed -e '/^!/d' <$(srcdir)/config/i386/sol2-gc1.asm >gcrt1.s
-	$(GCC_FOR_TARGET) $(MULTILIB_CFLAGS) -c -o $(T)gcrt1.o gcrt1.s
-$(T)crt1.o: $(srcdir)/config/i386/sol2-c1.asm $(GCC_PASSES)
-	sed -e '/^!/d' <$(srcdir)/config/i386/sol2-c1.asm >crt1.s
-	$(GCC_FOR_TARGET) $(MULTILIB_CFLAGS) -c -o $(T)crt1.o crt1.s
-$(T)crti.o: $(srcdir)/config/i386/sol2-ci.asm $(GCC_PASSES)
-	sed -e '/^!/d' <$(srcdir)/config/i386/sol2-ci.asm >crti.s
-	$(GCC_FOR_TARGET) $(MULTILIB_CFLAGS) -c -o $(T)crti.o crti.s
-$(T)crtn.o: $(srcdir)/config/i386/sol2-cn.asm $(GCC_PASSES)
-	sed -e '/^!/d' <$(srcdir)/config/i386/sol2-cn.asm >crtn.s
-	$(GCC_FOR_TARGET) $(MULTILIB_CFLAGS) -c -o $(T)crtn.o crtn.s
-
-# 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.
-#
-# 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
Index: libgcc/config.host
===================================================================
--- libgcc/config.host	(revision 141745)
+++ libgcc/config.host	(working copy)
@@ -318,6 +318,17 @@ 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)
 	;;
Index: libgcc/configure.ac
===================================================================
--- libgcc/configure.ac	(revision 141745)
+++ libgcc/configure.ac	(working copy)
@@ -171,6 +171,26 @@ esac
 # Collect host-machine-specific information.
 . ${srcdir}/config.host
 
+# Check if Solaris/x86 linker supports ZERO terminator unwind entries.
+# This is after config.host so we can augment tmake_file.
+# Link with -nostartfiles -nodefaultlibs since neither are present while
+# building libgcc.
+case ${host} in
+i?86-*-solaris2.1[[0-9]]*)
+  cat > conftest.s <<EOF
+	.section	.eh_frame,"a",@unwind
+	.zero	4
+	.section	.jcr,"aw",@progbits
+	.zero	8
+EOF
+  if AC_TRY_COMMAND(${CC-cc} -shared -nostartfiles -nodefaultlibs -o conftest.so conftest.s 1>&AS_MESSAGE_LOG_FD); then
+      # configure expects config files in libgcc/config, so need a relative
+      # path here.
+      tmake_file="${tmake_file} ../../gcc/config/i386/t-crtstuff"
+  fi
+  ;;
+esac
+
 # Check for visibility support.  This is after config.host so that
 # we can check for asm_hidden_op.
 AC_CACHE_CHECK([for __attribute__((visibility("hidden")))],
Index: libgcc/config/i386/t-sol2
===================================================================
--- libgcc/config/i386/t-sol2	(revision 141745)
+++ libgcc/config/i386/t-sol2	(working copy)
@@ -1,23 +1,23 @@
 # gmon build rule:
-$(T)gmon.o:	$(srcdir)/config/i386/gmon-sol2.c $(GCC_PASSES) $(CONFIG_H)
+$(T)gmon.o:	$(gcc_srcdir)/config/i386/gmon-sol2.c $(GCC_PASSES) $(CONFIG_H)
 	$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) \
-		-c $(srcdir)/config/i386/gmon-sol2.c -o $(T)gmon.o
+		-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: $(srcdir)/config/i386/sol2-gc1.asm $(GCC_PASSES)
-	sed -e '/^!/d' <$(srcdir)/config/i386/sol2-gc1.asm >gcrt1.s
+$(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) $(MULTILIB_CFLAGS) -c -o $(T)gcrt1.o gcrt1.s
-$(T)crt1.o: $(srcdir)/config/i386/sol2-c1.asm $(GCC_PASSES)
-	sed -e '/^!/d' <$(srcdir)/config/i386/sol2-c1.asm >crt1.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) $(MULTILIB_CFLAGS) -c -o $(T)crt1.o crt1.s
-$(T)crti.o: $(srcdir)/config/i386/sol2-ci.asm $(GCC_PASSES)
-	sed -e '/^!/d' <$(srcdir)/config/i386/sol2-ci.asm >crti.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) $(MULTILIB_CFLAGS) -c -o $(T)crti.o crti.s
-$(T)crtn.o: $(srcdir)/config/i386/sol2-cn.asm $(GCC_PASSES)
-	sed -e '/^!/d' <$(srcdir)/config/i386/sol2-cn.asm >crtn.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) $(MULTILIB_CFLAGS) -c -o $(T)crtn.o crtn.s
 
 # We need to use -fPIC when we are using gcc to compile the routines in


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]