From owner-freebsd-current@FreeBSD.ORG Sat Nov 10 21:39:46 2012 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 5126D879; Sat, 10 Nov 2012 21:39:46 +0000 (UTC) (envelope-from jilles@stack.nl) Received: from mx1.stack.nl (relay02.stack.nl [IPv6:2001:610:1108:5010::104]) by mx1.freebsd.org (Postfix) with ESMTP id DC6F78FC08; Sat, 10 Nov 2012 21:39:45 +0000 (UTC) Received: from snail.stack.nl (snail.stack.nl [IPv6:2001:610:1108:5010::131]) by mx1.stack.nl (Postfix) with ESMTP id 4A8D2358C65; Sat, 10 Nov 2012 22:39:43 +0100 (CET) Received: by snail.stack.nl (Postfix, from userid 1677) id 29F4F2848C; Sat, 10 Nov 2012 22:39:43 +0100 (CET) Date: Sat, 10 Nov 2012 22:39:43 +0100 From: Jilles Tjoelker To: Dimitry Andric Subject: Re: clang and static linking? Message-ID: <20121110213942.GA67444@stack.nl> References: <20121108231349.GA79485@troutmask.apl.washington.edu> <509D4548.7030806@FreeBSD.org> <20121109182810.GA61338@troutmask.apl.washington.edu> <509D5BC3.9020704@FreeBSD.org> <509D90EC.5040302@FreeBSD.org> <509DA0E4.9060906@FreeBSD.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <509DA0E4.9060906@FreeBSD.org> User-Agent: Mutt/1.5.21 (2010-09-15) Cc: freebsd-current@freebsd.org, Steve Kargl X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Nov 2012 21:39:46 -0000 On Sat, Nov 10, 2012 at 01:33:40AM +0100, Dimitry Andric wrote: > On 2012-11-10 00:25, Dimitry Andric wrote: > ... > > The more difficult way out is to not define any duplicate functions in > > libc.a and libm.a. For the shared libraries, this should not be a > > problem, since the dynamic linker will figure out which of the two > > copies will get precedence. The functions must stay available for > > backwards compatibility reasons anyway. > > For static libraries, this compatibility seems to be unnecessary, as > > they will only be used to link new programs. Therefore, it would > > probably be best to remove the whole isnan.o member from libc.a, and > > move all the isnan functions to libm.a instead. > > Currently, isnan() is commented out in lib/msun/src/s_isnan.c, maybe we > > can enable it whenever PIC is not defined? Then we could simply skip > > building lib/libc/gen/isnan.c for libc.a. > More concretely, here is a patch that seems to achieve the above: I see this has already been committed, but anyway... > - Only define isnan, isnanf, __isnan and __isnanf in libc.so, not in > libc.a and libc_p.a. OK, but please add a comment about this. > - Define isnan in libm.a and libm_p.a, not in libm.so. I don't think > there is a need to define __isnan in the .a files, so I left that out. Removing symbols from a .so causes subtle ABI breakage and is not needed for fixing static linking. More concretely, dlsym of isnan on libm.so will stop working and a different version of isnan will be chosen if the search list is libm.so, libother.so, libc.so and libother.so contains another isnan. > Index: lib/libc/gen/isnan.c > =================================================================== > --- lib/libc/gen/isnan.c (revision 242841) > +++ lib/libc/gen/isnan.c (working copy) > @@ -35,6 +35,7 @@ > * binary compat until we can bump libm's major version number. > */ > > +#ifdef PIC > __weak_reference(__isnan, isnan); > __weak_reference(__isnanf, isnanf); > > @@ -55,3 +56,4 @@ __isnanf(float f) > u.f = f; > return (u.bits.exp == 255 && u.bits.man != 0); > } > +#endif /* PIC */ > Index: lib/msun/src/s_isnan.c > =================================================================== > --- lib/msun/src/s_isnan.c (revision 242841) > +++ lib/msun/src/s_isnan.c (working copy) > @@ -30,8 +30,9 @@ > > #include "fpmath.h" > > -/* Provided by libc */ > -#if 0 > +/* Provided by libc.so */ > +#ifndef PIC > +#undef isnan > int > isnan(double d) > { > @@ -40,7 +41,7 @@ isnan(double d) > u.d = d; > return (u.bits.exp == 2047 && (u.bits.manl != 0 || u.bits.manh != 0)); > } > -#endif > +#endif /* !PIC */ > > int > __isnanf(float f) -- Jilles Tjoelker