Compile bug in libm with busybox (patch included)

Denys Vlasenko vda.linux at googlemail.com
Mon Feb 16 17:04:05 UTC 2009


On Sun, Feb 15, 2009 at 6:58 PM, rhabarber1848 <rhabarber1848 at web.de> wrote:
> Denys Vlasenko wrote:
>
>> Does attached patch help (instead of your proposal)?
>
> Hi,
>
> I tested uClibc SVN rev 25337 which includes your patch committed
> as rev 25329:
> http://lists.uclibc.org/pipermail/uclibc-cvs/2009-February/026000.html
>
> Unfortunately the bug is still present:
>
>> /root/tuxbox/work_uclibc2/image/cdk/lib/gcc/powerpc-tuxbox-linux-uclibc/3.4.6/../../../../powerpc-tuxbox-linux-uclibc/lib/nof/libm.so:
> undefined reference to `__GI___isnanl'
>> /root/tuxbox/work_uclibc2/image/cdk/lib/gcc/powerpc-tuxbox-linux-uclibc/3.4.6/../../../../powerpc-tuxbox-linux-uclibc/lib/nof/libm.so:
> undefined reference to `__GI___isinfl'

__isinfX are declared here:

bits/mathcalls.h

__MATHDECL_PRIV (int,isinf,, (_Mdouble_ __value), (__const__));

and the macros are (in sanitized headers, produced by "make install"):

# define __MATHDECL_PRIV(type, function,suffix, args, attrib) \
  __MATHDECL_1(type, __CONCAT(__,function),suffix, args) __attribute__ (attrib);

#define __MATHDECL_1(type, function,suffix, args) \
  extern type __MATH_PRECNAME(function,suffix) args __THROW

and __MATH_PRECNAME adds l, f, or nothing.


My patch removed libm_hidden_proto() from __MATHDECL_PRIV:

+#if defined _LIBC
+# define __MATHDECL_PRIV(type, function,suffix, args, attrib) \
+  __MATHDECL_1(type, __CONCAT(__,function),suffix, args)
__attribute__ (attrib); \
   libm_hidden_proto(__MATH_PRECNAME(__##function,suffix))
+#else
+# define __MATHDECL_PRIV(type, function,suffix, args, attrib) \
+  __MATHDECL_1(type, __CONCAT(__,function),suffix, args)
__attribute__ (attrib);
+#endif


and I theorize you just didn't clean up old headers, so libm_hidden_proto()
is still present in them, thus remapping the names to __GI_xxxx.

Please try deleting and regenerating uclibc headers.

If it does not help, find out which object file contains
references to __GI___isinfl. Say, it's a file.o.
Delete it, then run make to regenerate it.
Copy gcc commandline which does recompile,
replace -c with -E and run it.
You may need to replace -o file.o with -o file.i

This will generate preprocessed source "file.i"
Send it to me.
--
vda


More information about the uClibc mailing list