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:
- Only define isnan, isnanf, __isnan and __isnanf in libc.so, not in
  libc.a and libc_p.a.
- 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.
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)
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to