clang and static linking?

Steve Kargl sgk at troutmask.apl.washington.edu
Thu Nov 8 23:49:33 UTC 2012


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)
@@ -40,7 +40,6 @@
 	u.d = d;
 	return (u.bits.exp == 2047 && (u.bits.manl != 0 || u.bits.manh != 0));
 }
-#endif
 
 int
 __isnanf(float f)
@@ -51,6 +50,9 @@
 	return (u.bits.exp == 255 && u.bits.man != 0);
 }
 
+__weak_reference(__isnanf, isnanf);
+#endif
+
 int
 __isnanl(long double e)
 {
@@ -60,5 +62,3 @@
 	mask_nbit_l(u);
 	return (u.bits.exp == 32767 && (u.bits.manl != 0 || u.bits.manh != 0));
 }
-
-__weak_reference(__isnanf, isnanf);

-- 
Steve


More information about the freebsd-current mailing list