Bug #14862 | undefined reference to `isinf' on SOLARIS - strings/strtod.c | ||
---|---|---|---|
Submitted: | 11 Nov 2005 13:21 | Modified: | 26 Apr 2007 16:55 |
Reporter: | Tim Berke | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server | Severity: | S3 (Non-critical) |
Version: | 5.0.15 | OS: | Solaris (Solaris 8 sparcv9, Solaris 10) |
Assigned to: | Magnus Blåudd | CPU Architecture: | Any |
[11 Nov 2005 13:21]
Tim Berke
[15 Nov 2005 16:02]
Valeriy Kravchuk
Thank you for a problem report. Sorry, but I was not able to repeat it on Solaris 9 (the closest machine to yours we have here). I did the following: cd mysql-5.0.15 export PATH=/export/home/mysqldev/butch-64bit/bin:/opt/sfw/bin:/usr/sfw/bin:/usr/local/bin:/usr/bin:/usr/xpg4/bin:/usr/sbin:/usr/openwin/bin:/usr/dt/bin:/usr/ccs/bin:/usr/ucb:/opt/SUNWspro/bin export LD_LIBRARY_PATH=/usr/lib:/usr/local/lib:/usr/local/lib/sparcv9 ./configure --prefix=/users/vkravchuk/dbs/5.0-butch --enable-assembler --with-gnu-ld (other your options seems irrelevant for me) make -- no errors similar to yours echo $? -- gave 0 make install echo $? -- gave 0 cd ~/dbs/5.0-butch/ bin/mysqld_safe --socket=/users/vkravchuk/mysql5.sock --skip-networking & Server started without any problems. Then: bash-2.05$ bin/mysql -V bin/mysql Ver 14.12 Distrib 5.0.15, for sun-solaris2.9 (sparc) using EditLine wrapper bash-2.05$ file libexec/mysqld libexec/mysqld: ELF 32-bit MSB executable SPARC Version 1, dynamically linked, not stripped bash-2.05$ uname -a SunOS butch 5.9 Generic_118558-09 sun4u sparc SUNW,UltraAX-i2 Any ideas on how to repeat the problem you described are welcomed.
[15 Nov 2005 16:10]
Tim Berke
It would seem there is a library (sun) differance between what I have and your later SOLARIS version. Perhaps this is now included in the standard SOLARIS libraries or you have the SUNPRO compiler installed. This was really for anyone else who might need this hack. I found others on the web trying to solve the same problems. Thanx much, tim
[15 Nov 2005 16:24]
Valeriy Kravchuk
I had found another machine, with Solaris 8: Sun Sunfire v100 UltraSPARC-IIe 550 MHz 1 GB RAM Sun Solaris 8 (solaris2.8-sparc) But it has Sun Studio 9 C/C++ 5.6 + gcc 3.3. In my test gcc was used, but on all our SPARCs Sun Studio or Sun Forte compilers are installed. I can not change that. So, would you like me to try build on the machine described above? Or can I simply close this report as can't repeat? Your hint is already stored in our bugs database forever...
[15 Nov 2005 16:49]
Tim Berke
Hi Valeriy, This sounds like a close as can't repeat. I do not think this is worth trying to rebuild a sun. Thanx, tim
[15 Nov 2005 16:53]
Valeriy Kravchuk
Closed as agreed with the bug reporter.
[29 Nov 2005 19:02]
Jonathan Miner
Easily repeatable on Solaris 9 with GCC 4.0.2 I do not have SUN compilers installed.
[8 Dec 2005 6:10]
Robert Cohen
I have also seen this problem on Solaris 9 with gcc 4.0.2 I don't get it with gcc 3.4.4 Normally isinf is handled by gcc as a built in function. I can use gcc 4.0.2 to compile test programs with isinf without problem. However something in the mysql compilation environment is stopping gcc from handling it as a builtin function.
[9 Dec 2005 1:59]
Robert Cohen
Actually after further playing I have discovered that even if you workaround the isinf issue, the compilation blows up later with massive linking problems. So I suspect that mysql and gcc 4.0.2 just don't get on. Chances are its a gcc bug/issue since it works fine in gcc 3.4.x
[11 Dec 2005 8:53]
Marcos Della
I too am running gcc 4.0.2 under Solaris 8 and have the exact same error and linking problems. I tried the workaround and managed to get past the error, however once past, ran into the same issues with linker errors as well. I've actually tried this compile under Solaris 8, and Solaris 9 both under Sparc and x86 architectures and haven't gotten it to work. The next "step" is to downgrade the gcc compiler and see if that helps...
[11 Dec 2005 17:06]
Marcos Della
Well, after a long evening of frustrating work, we managed to build a new solaris machine w/o gcc on it and installed 3.4.2 (sunfreeware version) and did the same compile and managed to get MySQL 5.0.16 to compile under Solaris_8_Sparc as well as Solaris_8_x86. Have not yet done the same thing with Solaris 9 or 10 yet (its a long process to do this). So as mentioned earlier, it does appear to be a compiler related interaction issue. Is there any specific dumps or outputs that anyone wants to demonstrate the issues? I still have a Solaris 8 machine with gcc 4.0.2 on it as well as (now) a set with gcc 3.4.2 on them.
[24 Jan 2006 13:22]
J Jans
I just tried to build mysql 4.1.16 and 5.0.18 using gcc 4.0.2 under Solaris 7. The machine does not have the Sun compiler suite installed - just gcc 4.0.2. I get the same error as described above. System information and compile flags can be found below. beheer$ uname -a SunOS white 5.7 Generic_106541-07 sun4u sparc SUNW,Ultra-250 Solaris beheer$ gcc -v Using built-in specs. Target: sparc-sun-solaris2.7 Configured with: ../gcc-4.0.2/configure --prefix=/opt/software/gcc-4.0.2 --disable-nls --disable-multilib --with-gnu-as --with-as=/opt/local/bin/as --with-gnu-ld --with-ld=/opt/local/bin/ld --with-cpu=ultrasparc --enable-languages=c,c++ Thread model: posix gcc version 4.0.2 beheer$ ld -v GNU ld version 2.16 beheer$ as -v GNU assembler version 2.16 (sparc-sun-solaris2.7) using BFD version 2.16 beheer$ make -v GNU Make 3.80 Copyright (C) 2002 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. beheer$ env | egrep "FLAG|PATH" LD_LIBRARY_PATH=/opt/local/lib:/usr/lib:/usr/openwin/lib MANPATH=/opt/local/man:/usr/man:/usr/local/man:/opt/gcc/man:/opt/perl5/man:/opt/tex/man CPPFLAGS=-O3 -I/opt/local/include -fPIC -fomit-frame-pointer -m32 -mcpu=ultrasparc LDFLAGS=-L/opt/local/lib -R/opt/local/lib PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/usr/local/bin:/usr/ccs/bin:/usr/sbin:/usr/openwin/bin:/opt/perl5/bin:/opt/bdb/bin:/opt/tex/bin:/opt/mysql/bin:/opt/openssl/bin:. CFLAGS=-O3 -I/opt/local/include -fPIC -fomit-frame-pointer -m32 -mcpu=ultrasparc beheer$ ./configure --prefix=/opt/software/mysql-5.0.18 --with-gnu-ld --with-mysqld-user=mysql --with-openssl=/opt/local --with-berkeley-db=/opt/local --with-big-tables <completes> beheer$ make ... <snipped> ... make[2]: Entering directory `/home/beheer/jja_build_env/build/mysql-5.0.18/extra' if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../include -I../include -I../sql -O3 -I/opt/local/include -fPIC -fomit-frame-pointer -m32 -mcpu=ultrasparc -DDBUG_OFF -O3 -I/opt/local/include -fPIC -fomit-frame-pointer -m32 -mcpu=ultrasparc -DHAVE_CURSES_H -I/home/beheer/jja_build_env/build/mysql-5.0.18/include -DHAVE_RWLOCK_T -MT comp_err.o -MD -MP -MF ".deps/comp_err.Tpo" -c -o comp_err.o comp_err.c; \ then mv -f ".deps/comp_err.Tpo" ".deps/comp_err.Po"; else rm -f ".deps/comp_err.Tpo"; exit 1; fi /bin/ksh ../libtool --preserve-dup-deps --mode=link gcc -DDBUG_OFF -O3 -I/opt/local/include -fPIC -fomit-frame-pointer -m32 -mcpu=ultrasparc -DHAVE_CURSES_H -I/home/beheer/jja_build_env/build/mysql-5.0.18/include -DHAVE_RWLOCK_T -L/opt/local/lib -R/opt/local/lib -o comp_err comp_err.o ../mysys/libmysys.a ../dbug/libdbug.a ../strings/libmystrings.a -lpthread -lthread -lposix4 -lcrypt -lgen -lsocket -lnsl -lm -lpthread -lthread mkdir .libs gcc -DDBUG_OFF -O3 -I/opt/local/include -fPIC -fomit-frame-pointer -m32 -mcpu=ultrasparc -DHAVE_CURSES_H -I/home/beheer/jja_build_env/build/mysql-5.0.18/include -DHAVE_RWLOCK_T -o comp_err comp_err.o -L/opt/local/lib ../mysys/libmysys.a ../dbug/libdbug.a ../strings/libmystrings.a -lpthread -lthread -lposix4 -lcrypt -lgen -lsocket -lnsl -lm -lpthread -lthread -Wl,--rpath -Wl,/opt/local/lib ../strings/libmystrings.a(strtod.o): In function `my_strtod': strtod.c:(.text+0xf8): undefined reference to `isinf' collect2: ld returned 1 exit status make[2]: *** [comp_err] Error 1 make[2]: Leaving directory `/home/beheer/jja_build_env/build/mysql-5.0.18/extra' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/home/beheer/jja_build_env/build/mysql-5.0.18' make: *** [all] Error 2
[25 Jan 2006 14:39]
J Jans
I found this piece of information on the web explaining some of the differences in how gcc handles calls between version 3.x and 4.x http://lists.ee.ethz.ch/rrd-developers/msg01552.html Although this refers to rrd-tool my guess is the same problem shows up with MySQL. ---- The configure script checks isinf with <math.h> as following. #include <math.h> int main () { float f = 0.0; isinf(f) ; return 0; } Gcc-4.0.0 or later eliminates calls to pure functions whose return value is not used.[1] So compilation of the above code is succeed and the HAVE_ISINF macro is defined if the system does not have isinf(). Therefore, the following isinf(a) macro is not defined. /* Solaris */ #if (! defined(HAVE_ISINF) && defined(HAVE_FPCLASS)) # define HAVE_ISINF 1 # define isinf(a) (fpclass(a) == FP_NINF || fpclass(a) == FP_PINF) #endif ----
[3 Jul 2006 8:47]
Sveta Smirnova
We have duplicate bug #20602. Reporter gives idea how to repeat and fix it. How to repeat: 1. Load gcc 4.1 sources 2. Compile they as recommended: CC=gcc CXX=g++ ./configure --with-gnu-as --with-as=/usr/sfw/bin/gas --without-gnu-ld --with-ld=/usr/ccs/bin/ld --disable-multilib --prefix=/opt/sfw/gcc-4.1 make su make install 3. cd to directory with MySQL sources 4. BUILD/autorun.sh CC=/opt/sfw/gcc-4.1/bin/gcc CXX=/opt/sfw/gcc-4.1/bin/g++ ./configure --prefix=/export/home/sveta/mysql-5.0gcc make .... make[2]: Entering directory `/export/home/sveta/Documents/src/mysql-5.0/extra' if /opt/sfw/gcc-4.1/bin/gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../include -I../include -I../sql -O3 -DDBUG_OFF -DHAVE_RWLOCK_T -MT comp_err.o -MD -MP -MF ".deps/comp_err.Tpo" -c -o comp_err.o comp_err.c; \ then mv -f ".deps/comp_err.Tpo" ".deps/comp_err.Po"; else rm -f ".deps/comp_err.Tpo"; exit 1; fi /bin/bash ../libtool --preserve-dup-deps --mode=link --tag=CC /opt/sfw/gcc-4.1/bin/gcc -O3 -DDBUG_OFF -DHAVE_RWLOCK_T -o comp_err comp_err.o ../mysys/libmysys.a ../dbug/libdbug.a ../strings/libmystrings.a -lpthread -lthread -lposix4 -lgen -lsocket -lnsl -lm -lpthread -lthread mkdir .libs /opt/sfw/gcc-4.1/bin/gcc -O3 -DDBUG_OFF -DHAVE_RWLOCK_T -o comp_err comp_err.o ../mysys/libmysys.a ../dbug/libdbug.a ../strings/libmystrings.a -lpthread -lthread -lposix4 -lgen -lsocket -lnsl -lm -lpthread -lthread Undefined first referenced symbol in file isinf ../strings/libmystrings.a(strtod.o) ld: fatal: Symbol referencing errors. No output written to comp_err collect2: ld returned 1 exit status make[2]: *** [comp_err] Error 1 make[2]: Leaving directory `/export/home/sveta/Documents/src/mysql-5.0/extra' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/export/home/sveta/Documents/src/mysql-5.0' make: *** [all] Error 2 It is not repeatable on Linux.
[25 Aug 2006 0:13]
Shea Lovan
I have duplicated the problem on a Solaris 10 Update 2 system (no Sun Pro compiler installed) using GCC 4.1.1. When I attempted the change to the configure script referenced in bug 20626, the problem was *not* resolved. As a workaround on that system, I undefined HAVE_ISINF in both config.h and include/my_config.h. This appears to have provided a functional binary.
[12 Sep 2006 13:48]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/11771 ChangeSet@1.2232, 2006-09-12 15:47:48+02:00, msvensson@shellback.(none) +1 -0 Bug#14862 undefined reference to `isinf' on SOLARIS - strings/strtod.c - Change the configure test looking for 'isinf' so the value returned from isinf is used. That avoids the call to isinf being optimized away.
[15 Sep 2006 22:20]
Chad MILLER
Available in 5.1.12-beta.
[15 Sep 2006 23:30]
Paul DuBois
No changelog entry needed.
[8 Jan 2007 20:18]
Sergei Golubchik
if the latest comments in bug#20602 are correct - the fix is incomplete
[9 Feb 2007 21:33]
Andy Fiddaman
My version of gcc on Solaris still optimises out the code in PHP 5.2.1 configure, it is clever enough to work out that the function will always return 0 at -O3. % gcc -v Using built-in specs. Target: sparcv9-sun-solaris2.9 Configured with: /data/src/build/gcc-4.1.1/configure --prefix=/opt/GNUgcc --enable-languages=c,c++ --disable-nls sparcv9-sun-solaris2.9 Thread model: posix gcc version 4.1.1 % cat c.c #include <math.h> int main () { float f = 0.0; int r = isinf(f); return r; return 0; } Since Solaris doesn't have isinf() unless you link with libsunmath.so it fails to compile. % gcc -o c c.c Undefined first referenced symbol in file isinf /var/tmp//cc0nUdeU.o ld: fatal: Symbol referencing errors. No output written to c collect2: ld returned 1 exit status Configure with CFLAGS=-O3 shows that I have isinf() though. checking for isinf with <math.h>... yes At -O3 it compiles ok. % gcc -O3 -o c c.c % ./c zsh: exit 0 ./c I've patched configure.in with this which fixes it for me.. it's enough to stop the compiler from optimising the test. --- configure.in.dist 2007-02-09 21:32:35.312086444 +0000 +++ configure.in 2007-02-09 21:32:47.211204683 +0000 @@ -1962,7 +1962,7 @@ # isinf() could be a function or a macro (HPUX) AC_MSG_CHECKING(for isinf with <math.h>) -AC_TRY_LINK([#include <math.h>], [float f = 0.0; int r = isinf(f); return r], +AC_TRY_LINK([#include <math.h>], [float f = rand(10); int r = isinf(f); return r], AC_MSG_RESULT(yes) AC_DEFINE(HAVE_ISINF, [1], [isinf() macro or function]), AC_MSG_RESULT(no))
[9 Feb 2007 21:36]
Andy Fiddaman
Please ignore the reference to PHP in the last post, I need some sleep. I'm compiling 5.0.33
[5 Apr 2007 16:14]
James Coleman
This suggested fix (in configure isinf test): float f = 0.0; int r = isinf(f); return r; return 0; Doesn't work for gcc 4.1.1 on solaris 10. (if -O3 is used, O3 is suggested in the manual) It is a bit weird as the compiler itself seems to know how to call isinf. What I see is if the optimizer can determine that the calling value is fixed then the function is optimized out. So, anyway, either of the three below tests determine (for gcc 4.1.1 on solaris 10) that isinf is not available: float f = 1 / 0.0; int r = isinf(f); return r; float f = 0.0; float i = f / f; int r = isinf(i); return r; #include <stdlib.h> float f = random(); int r = isinf(f); return r;
[12 Apr 2007 8:29]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/24366 ChangeSet@1.2440, 2007-04-12 10:29:22+02:00, msvensson@pilot.blaudden +1 -0 Bug#14862 undefined reference to `isinf' on SOLARIS - strings/strtod.c - Rely only on HAVE_ISINF to determine if 'isinf' can be used.
[26 Apr 2007 11:35]
Bugs System
Pushed into 5.0.42
[26 Apr 2007 11:37]
Bugs System
Pushed into 5.1.18-beta
[26 Apr 2007 16:55]
Paul DuBois
No changelog entry needed.
[21 May 2007 14:39]
Philip Walker
I have the same problem on Solaris 10, AMD Sun Fire V40z. GCC version=4.1.2 ld version=Solaris Link Editors 5.10-1.482 trying to install 5.0.41 and 5.1.18-beta. If patch has been included in 5.1.18-beta, it is not working for my case.
[21 May 2007 15:59]
Philip Walker
tried MySQL 4.1.22 and it choked on the libmystrings.a (strtod.o) undefined isinf also. I was still using GCC 4.1.2
[24 May 2007 13:32]
Philip Walker
Loaded GCC 4.2.0 and tried to compile MySQL 4.1.22 again, got same error about libmystrings.a
[24 May 2007 18:16]
Magnus Blåudd
This problem was reported and fixed in MySQL 5.0 and higer. If you are having a problem in 4.1 you need to open a separate bug for that.