Re: clang and static linking?

From: Konstantin Belousov <kostikbel_at_gmail.com>
Date: Fri, 9 Nov 2012 14:00:12 +0200
On Thu, Nov 08, 2012 at 03:49:32PM -0800, Steve Kargl wrote:
> On Thu, Nov 08, 2012 at 03:13:49PM -0800, Steve Kargl wrote:
> > Upgraded my amd64 system, yesterday.  Needed to rebuild one
> > of my projects, and hit
> > 
> > /usr/local/openmpi-1.6.3/bin/mpif90 -static -O2 -pipe -march=native -mtune=native -funroll-loops -ftree-vectorize -Wall -rpath /usr/local/lib/gcc46 -I/home/kargl/modules -o sasmp sasmp.f90 -L/home/kargl/lib -L. -L/usr/local/lib -L. -loa -lm90 -llapack -lblas
> > //usr/lib/libc.a(isnan.o): In function `isnanf':
> > /usr/src/lib/libc/gen/isnan.c:(.text+0x40): multiple definition of `__isnanf'
> > //usr/lib/libm.a(s_isnan.o):/usr/src/lib/msun/src/s_isnan.c:(.text+0x0):
> > first defined here
> > collect2: ld returned 1 exit status
> > *** [sasmp] Error code 1
> > 
> > Stop in /usr/home/kargl/trunk/oa.
> > 
> > Can't rebuild gcc46 due to clang issue.
> > Rebuilding openmpi does not help as openmpi uses gfortran46.
> > Maybe there's a library problem.
> > 
> > Error   clang        base/gcc
> > yes    libc,libm
> > yes    libm          libc
> > no     libc          libm
> > no                   libc,libm
> > 
> > libm.a compiled with clang
> > % nm /usr/lib/libm.a | grep isnan
> >                  U __isnanl
> >                  U __isnanf
> >                  U __isnanl
> >                  U isnan
> >                  U __isnanf
> >                  U isnan
> >                  U isnanf
> > s_isnan.o:
> > 0000000000000000 T __isnanf
> > 0000000000000030 T __isnanl
> > 0000000000000000 W isnanf
> >                  U isnan
> > 
> > libm.a compiled with /usr/lib/gcc
> > troutmask:fvwm:kargl[232] nm /usr/lib/libm.a | grep isnan
> >                  U __isnanl
> >                  U __isnanf
> >                  U __isnanl
> >                  U __isnanf
> > s_isnan.o:
> > 0000000000000000 T __isnanf
> > 0000000000000030 T __isnanl
> > 0000000000000000 W isnanf
> > 
> 
> This appears to fix the problem.  Don't know if this is
> th right way to handle it.
> 
> Index: src/s_isnan.c
> ===================================================================
> --- src/s_isnan.c	(revision 242701)
> +++ src/s_isnan.c	(working copy)
> _at__at_ -40,7 +40,6 _at__at_
>  	u.d = d;
>  	return (u.bits.exp == 2047 && (u.bits.manl != 0 || u.bits.manh != 0));
>  }
> -#endif
>  
>  int
>  __isnanf(float f)
> _at__at_ -51,6 +50,9 _at__at_
>  	return (u.bits.exp == 255 && u.bits.man != 0);
>  }
>  
> +__weak_reference(__isnanf, isnanf);
> +#endif
> +
>  int
>  __isnanl(long double e)
>  {
> _at__at_ -60,5 +62,3 _at__at_
>  	mask_nbit_l(u);
>  	return (u.bits.exp == 32767 && (u.bits.manl != 0 || u.bits.manh != 0));
>  }
> -
> -__weak_reference(__isnanf, isnanf);
Is this patch against src/msun ?

This is only a workaround, which break ABI and older binaries.
The bug is apparently in clang, which inserts the undef reference
into the resulting object file, when weak alias references undefined
symbol. Gnu as does not have the bug.

There is some magic switch to reduce amount of clang bugs, like
-fno-integrated-as. Please try to compile the problematic .o with the
switch.

Received on Fri Nov 09 2012 - 11:00:24 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:32 UTC