From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15088 invoked by alias); 9 Sep 2009 11:24:59 -0000 Received: (qmail 14873 invoked by uid 22791); 9 Sep 2009 11:24:53 -0000 X-SWARE-Spam-Status: No, hits=-2.2 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_63,SPF_HELO_PASS,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 09 Sep 2009 11:24:48 +0000 Received: from int-mx04.intmail.prod.int.phx2.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.17]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n89BOcZn008570; Wed, 9 Sep 2009 07:24:39 -0400 Received: from tyan-ft48-01.lab.bos.redhat.com (tyan-ft48-01.lab.bos.redhat.com [10.16.42.4]) by int-mx04.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id n89BObjc023842 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 9 Sep 2009 07:24:38 -0400 Received: (from jakub@localhost) by tyan-ft48-01.lab.bos.redhat.com (8.14.2/8.14.2/Submit) id n89BOamd013488; Wed, 9 Sep 2009 13:24:36 +0200 Date: Wed, 09 Sep 2009 11:24:00 -0000 From: Jakub Jelinek To: Matthias Klose , Alexandre Oliva , Nathan Froyd Cc: GCC Patches , Paolo Carlini , GCJ-patches , Ralf Wildenhues Subject: Re: [patch] PR40134, use a linker script on arm-linux to link with -lgcc_s -lgcc Message-ID: <20090909112436.GV14664@tyan-ft48-01.lab.bos.redhat.com> Reply-To: Jakub Jelinek References: <4A530F5C.4040500@ubuntu.com> <20090707091425.GB4462@tyan-ft48-01.lab.bos.redhat.com> <4A5B32BB.5010308@ubuntu.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4A5B32BB.5010308@ubuntu.com> User-Agent: Mutt/1.5.18 (2008-05-17) 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: 2009-09/txt/msg00592.txt.bz2 On Mon, Jul 13, 2009 at 09:12:27AM -0400, Matthias Klose wrote: > this doesn't seem to work together with -nostdlib, e.g. how libstdc++ is linked > (libstdc++ ends up with undefined symbols from libgcc). Current libtool has it's > own idea about linking with libgcc, and doesn't link with -lgcc (explicitely > removing it from the command line if it's there). So do we have to change > libtool at the same time to support linking with both libgcc_s and libgcc? After discussing this with Alex on IRC today, we agreed that the linker script for targets that need it is probably easier. But, completely duplicating the SHLIB_LINK/SHLIB_INSTALL variables, especially without all the variables that can tweak it, is IMHO a wrong idea. We should avoid the duplication. The following patch has been tested on powerpc64-linux --with-cpu=default32 together with a --- rs6000.c.jj 2009-09-04 16:42:37.465404822 +0200 +++ rs6000.c 2009-09-09 12:15:01.502404904 +0200 @@ -18011,7 +18011,7 @@ static bool no_global_regs_above (int first, bool gpr) { int i; - for (i = first; i < gpr ? 32 : 64 ; i++) + for (i = first; i < (gpr ? 32 : 64) ; i++) if (global_regs[i]) return false; return true; fix (I know Nathan has a more complete patch). arm*-*-linux* could add the same into config.gcc, similarly sh*-*-linux* (you said sh uses it already, but I couldn't find anything like that in config/sh/t-*). If this patch is committed, I hope Nathan could commit his rs6000 fix as well (would it be acceptable to 4.4 as well)? 2009-09-09 Jakub Jelinek * config/t-slibgcc-elf-ver (SHLIB_MAKE_SOLINK, SHLIB_INSTALL_SOLINK): New variables. (SHLIB_LINK, SHLIB_INSTALL): Use them. * config/t-slibgcc-libgcc: New file. * config.gcc (powerpc*-*-linux*, powerpc*-*-gnu*): Use it. --- gcc/config/t-slibgcc-elf-ver.jj 2009-05-04 16:46:30.000000000 +0200 +++ gcc/config/t-slibgcc-elf-ver 2009-09-09 11:45:36.000000000 +0200 @@ -28,6 +28,9 @@ 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,--soname=$(SHLIB_SONAME) \ @@ -40,7 +43,7 @@ SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2 $(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) + $(SHLIB_MAKE_SOLINK) # $(slibdir) double quoted to protect it from expansion while building # libgcc.mk. We want this delayed until actual install time. SHLIB_INSTALL = \ @@ -48,7 +51,6 @@ SHLIB_INSTALL = \ $(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_INSTALL_SOLINK) SHLIB_MKMAP = $(srcdir)/mkmap-symver.awk SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver --- gcc/config/t-slibgcc-libgcc.jj 2009-09-09 12:01:29.000000000 +0200 +++ gcc/config/t-slibgcc-libgcc 2009-09-09 11:54:46.000000000 +0200 @@ -0,0 +1,32 @@ +# Copyright (C) 2009 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 +# . + +# Instead of creating $(SHLIB_SOLINK) symlink create a GNU ld +# linker script which sources in both $(SHLIB_SONAME) and libgcc.a. +# This is needed on targets where libgcc.a contains routines that aren't in +# $(SHLIB_SONAME) and are needed for shared libraries. + +SHLIB_MAKE_SOLINK = \ + (echo "/* GNU ld script"; \ + echo " Use the shared library, but some functions are only in"; \ + echo " the static library. */"; \ + echo "GROUP ( $(SHLIB_SONAME) libgcc.a )" \ + ) > $(SHLIB_DIR)/$(SHLIB_SOLINK) +SHLIB_INSTALL_SOLINK = \ + $(INSTALL_DATA) $(SHLIB_DIR)/$(SHLIB_SOLINK) \ + $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK) --- gcc/config.gcc.jj 2009-09-03 09:59:40.000000000 +0200 +++ gcc/config.gcc 2009-09-09 12:03:28.000000000 +0200 @@ -1927,7 +1927,7 @@ powerpc-*-linux* | powerpc64-*-linux*) tm_file="${tm_file} rs6000/linux.h glibc-stdint.h" ;; esac - tmake_file="${tmake_file} rs6000/t-fprules-softfp soft-fp/t-softfp" + tmake_file="${tmake_file} t-slibgcc-libgcc rs6000/t-fprules-softfp soft-fp/t-softfp" case ${target} in powerpc*-*-linux*altivec*) tm_file="${tm_file} rs6000/linuxaltivec.h" ;; @@ -1943,19 +1943,19 @@ powerpc-*-linux* | powerpc64-*-linux*) powerpc64-*-gnu*) tm_file="${tm_file} elfos.h svr4.h freebsd-spec.h gnu.h rs6000/sysv4.h rs6000/default64.h rs6000/linux64.h rs6000/gnu.h glibc-stdint.h" extra_options="${extra_options} rs6000/sysv4.opt rs6000/linux64.opt" - tmake_file="t-slibgcc-elf-ver t-gnu" + tmake_file="t-slibgcc-elf-ver t-slibgcc-libgcc t-gnu" ;; powerpc-*-gnu-gnualtivec*) tm_file="${cpu_type}/${cpu_type}.h elfos.h svr4.h freebsd-spec.h gnu.h rs6000/sysv4.h rs6000/linux.h rs6000/linuxaltivec.h rs6000/gnu.h glibc-stdint.h" extra_options="${extra_options} rs6000/sysv4.opt" - tmake_file="rs6000/t-fprules rs6000/t-fprules-fpbit rs6000/t-ppcos t-slibgcc-elf-ver t-gnu rs6000/t-ppccomm" + tmake_file="rs6000/t-fprules rs6000/t-fprules-fpbit rs6000/t-ppcos t-slibgcc-elf-ver t-slibgcc-libgcc t-gnu rs6000/t-ppccomm" if test x$enable_threads = xyes; then thread_file='posix' fi ;; powerpc-*-gnu*) tm_file="${cpu_type}/${cpu_type}.h elfos.h svr4.h freebsd-spec.h gnu.h rs6000/sysv4.h rs6000/linux.h rs6000/gnu.h glibc-stdint.h" - tmake_file="rs6000/t-fprules rs6000/t-fprules-fpbit rs6000/t-ppcos t-slibgcc-elf-ver t-gnu rs6000/t-ppccomm" + tmake_file="rs6000/t-fprules rs6000/t-fprules-fpbit rs6000/t-ppcos t-slibgcc-elf-ver t-slibgcc-libgcc t-gnu rs6000/t-ppccomm" extra_options="${extra_options} rs6000/sysv4.opt" if test x$enable_threads = xyes; then thread_file='posix' Jakub