From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1610 invoked by alias); 19 Nov 2008 17:33:51 -0000 Received: (qmail 1313 invoked by uid 22791); 19 Nov 2008 17:33:48 -0000 X-Spam-Check-By: sourceware.org Received: from smarthost.piip.TechFak.Uni-Bielefeld.DE (HELO smarthost.TechFak.Uni-Bielefeld.DE) (129.70.137.17) by sourceware.org (qpsmtpd/0.31) with ESMTP; Wed, 19 Nov 2008 17:32:55 +0000 Received: from manam.TechFak.Uni-Bielefeld.DE (manam.TechFak.Uni-Bielefeld.DE [129.70.137.47]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smarthost.TechFak.Uni-Bielefeld.DE (Postfix) with ESMTP id 6F07C48333; Wed, 19 Nov 2008 18:32:51 +0100 (CET) From: Rainer Orth Message-ID: <18724.19904.50430.479602@manam.TechFak.Uni-Bielefeld.DE> Date: Wed, 19 Nov 2008 17:41:00 -0000 To: Ian Lance Taylor Cc: gcc-patches@gcc.gnu.org Subject: Re: 4.3/4.4 PATCH: Fix Solaris/x86 bootstrap with Sun ld (PR bootstrap/33100) In-Reply-To: References: <18671.26770.804364.445962@manam.TechFak.Uni-Bielefeld.DE> <18705.54181.858026.33670@manam.TechFak.Uni-Bielefeld.DE> X-Mailer: VM 6.62 under Emacs 19.34.1 Mime-Version: 1.0 (generated by tm-edit 7.106) Content-Type: text/plain; charset=US-ASCII X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2008-11/txt/msg00992.txt.bz2 Ian Lance Taylor writes: > Rainer Orth 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 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 <&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