home *** CD-ROM | disk | FTP | other *** search
- EGGDROP AND TCL COMPILING ERRORS AND RESOLUTION FAQ
- (in other words, maybe this FAQ will help you get eggdrop compiled).
- by Chad Wagner <cmwagner@sodre.net> and contributors
- Last revised: July 28, 1996
-
-
- A. EGGDROP
- 1. UNDEFINED REFERENCES IN NET.O (SunOS)
-
- Undefined first referenced
- symbol in file
- socket net.o
- gethostbyname net.o
- accept net.o
- bind net.o
- setsockopt net.o
- gethostbyaddr net.o
- getsockname net.o
- gethostname net.o
- listen net.o
- connect net.o
- ld: fatal: Symbol referencing errors. No output written to eggdrop
-
- This seems to be caused by a few libraries not being detected by the
- auto-configure program, it is relatively easy to fix. Edit your Makefile,
- note that yours may be slightly different than this one when it comes to
- the tcl library, but here is the way it probably is:
-
- GMAKE = ${MAKE} 'CC=gcc' 'AWK=awk' 'OBJS=${OBJS}' 'TCLLIBFN=tcl.a'\
- 'CFLAGS=${CFLAGS}' 'XREQ=${XREQ}' 'XLIBS= -L/usr/local/lib -ltcl -lm'\
- 'TCLLIB=${TCLLIB}' 'RANLIB=:' 'STRIP='
-
- And here is what you need to change:
-
- GMAKE = ${MAKE} 'CC=gcc' 'AWK=awk' 'OBJS=${OBJS}' 'TCLLIBFN=tcl.a'\
- 'CFLAGS=${CFLAGS}' 'XREQ=${XREQ}' 'XLIBS=-lsocket -ldl -lnsl -L/usr/local/lib -ltcl -lm'\
- 'TCLLIB=${TCLLIB}' 'RANLIB=:' 'STRIP='
-
- You are adding in three libraries to be linked in, socket, dl, and nsl. This
- will resolve the net.o errors.
-
-
- 2. COMPILE STOPS AT THE LAST MINUTE WITH "LD FATAL SIGNAL 11"! (Linux)
-
- This seems to be caused by a non-ELF Tcl library binary, and the compiler
- doesn't seem to like it. The first thing you want to do is download and
- compile tcl yourself. And then follow this set of commands to help you
- reconfigure eggdrop using the newly compiled Tcl library (all of this
- should be done from your home directory):
-
- cd
- mkdir lib
- mkdir include
- find . -name libtcl*
-
- The output from the find command should give you the location of the library,
- take the output of that and do the next command with the output of find
- replacing $$find$$:
-
- mv $$find$$ lib/libtcl.a
-
- Now we continue with another find to help us locate tcl.h:
-
- find . -name tcl.h
-
- The output from the find command should give you the location of the header
- file, take the output of that and do the next command with the output of
- find replacing $$find$$:
-
- mv $$find$$ include
-
- Hopefully you know what shell you are using and can pick out which commands
- to use, if the first two setenv commands give command not found then use
- the next two, if not then don't use the next two. First set are for csh/tcsh
- users, following set is for bash/ksh users.
-
- csh/tcsh:
- setenv TCLLIB '$HOME/lib'
- setenv TCLINC '$HOME/include'
-
- bash/ksh:
- export TCLLIB='$HOME/lib'
- export TCLINC='$HOME/include'
-
- And then finally run configure again for eggdrop and then make, and hopefully
- it will work.
-
-
- 3. LD: -ltcl7.4: EXPECTED LIBX.SO(.MAJOR.MINOR.XXX) (various)
-
- ld: -ltcl7.4: expected libx.so(.major.minor.xxx)
- collect2: ld returned 4 exit status
- *** Error code 1
- make: Fatal error: Command failed for target `eggdrop'
-
-
- On some Unix boxes this seems to be caused by the linker, it is expecting
- a specific filename format and when it doesn't live up to it's expectations
- it usually barfs. I always see this caused by when the library for Tcl is
- called libtcl7.4.a or libtcl7.5.a, rename it to simply libtcl.a if you
- installed Tcl yourself, if you didn't and your using the Tcl that the
- system installed then do this:
-
- View your Makefile, look for the line (should be close to the top) that says
-
- XREQ = /usr/local/lib/libtcl7.4.a
-
- And remember that FULL pathname. Go to your home directory, and do the
- following:
-
- mkdir lib
- cd lib
- ln -s $$xreq$$ libtcl.a
-
- Replace $$xreq$$ with the full pathname from the XREQ line from the Makefile.
-
- And finally the next thing you want to do depending on what shell your
- using is: (try the first one, if it gives bad command then use the second)
-
- csh/tcsh:
- setenv TCLLIB '$HOME/lib'
-
- bash/ksh:
- export TCLLIB='$HOME/lib'
-
- Did I say finally? Heh, finally run configure and then make again.
-
-
- 4. 'TCL_DONT_WAIT' UNDECLARED IN MAIN.C (various)
-
- main.c: In function `main':main.c:864: `TCL_DONT_WAIT' undeclared (first use this function)
- main.c:864: (Each undeclared identifier is reported only once
- main.c:864: for each function it appears in.)
- make[1]: *** [main.o] Error 1
-
-
- This seems to be caused by a beta release of Tcl 7.5 on eggdrop 1.0a and
- later bots, the solution is relatively simple. The solution would be to
- edit your config.h file and change the following line:
-
- /* #undef MODERN_TCL */
-
- to
-
- #undef MODERN_TCL
-
-
- 5. '_Tcl_DoOneEvent' UNDEFINED SYMBOL (various)
-
- gcc -s -o eggdrop chan.o chanprog.o chanset.o cmds.o dcc.o dccutil.o filedb.o fileq.o files.o gotdcc.o hash.o main.o match.o mem.o misc.o mode.o msgcmds.o msgnotice.o net.o tandcmd.o tandem.o tcl.o tclhash.o userrec.o users.o -ldl -L/usr/local/lib -ltc
- l -lm
- collect2: ld returned 2 exit status
- ld: Undefined symbol
- _Tcl_DoOneEvent
- *** Error code 1
- make: Fatal error: Command failed for target `eggdrop'
-
-
- This is actually the same problem as #4, again. Only difference is
- TCL_DONT_WAIT seems to be defined by Tcl_DoOneEvent function doesn't exist.
- The solution would be to edit your config.h file and change the following
- line:
-
- /* #undef MODERN_TCL */
-
- to
-
- #undef MODERN_TCL
-
- 6. STRIP TERMINATED WITH SIGNAL 6 (various)
-
- collect2: strip terminated with signal 6 [IOT/Abort trap]
- *** Exit 1
- Stop.
- *** Exit 1
- Stop.
-
- I don't really know what the hell is causing this, but I find that if you
- don't strip the binary you cut out the problem (obviously), edit your
- Makefile and change this line from:
-
- GMAKE = ${MAKE} 'CC=gcc' 'AWK=awk' 'OBJS=${OBJS}' 'TCLLIBFN=tcl.a'\
- 'CFLAGS=${CFLAGS}' 'XREQ=${XREQ}' 'XLIBS= -L/usr/local/lib -ltcl -lm' \
- 'TCLLIB=${TCLLIB}' 'RANLIB=ranlib' 'STRIP=-s'
-
- To this line below: (your lines may differ, but what you are doing is
- changing 'STRIP=-s' to 'STRIP=')
-
- GMAKE = ${MAKE} 'CC=gcc' 'AWK=awk' 'OBJS=${OBJS}' 'TCLLIBFN=tcl.a'\
- 'CFLAGS=${CFLAGS}' 'XREQ=${XREQ}' 'XLIBS= -L/usr/local/lib -ltcl -lm' \
- 'TCLLIB=${TCLLIB}' 'RANLIB=ranlib' 'STRIP='
-
- 7. 'DIR' UNDECLARED (AND A WHOLE BUNCH OF OTHERS) (AIX 4)
-
- gcc -c -O2 -fno-strength-reduce -I.. -DHAVE_CONFIG_H filedb.c
- filedb.c: In function `filedb_update':
- filedb.c:209: `DIR' undeclared (first use this function)
- filedb.c:209: (Each undeclared identifier is reported only once
- filedb.c:209: for each function it appears in.)
- filedb.c:209: `dir' undeclared (first use this function)
- filedb.c:209: parse error before `*'
- filedb.c:217: warning: assignment makes pointer from integer without a cast
- filedb.c:218: `name' undeclared (first use this function)
- filedb.c:218: dereferencing pointer to incomplete type
- filedb.c:220: dereferencing pointer to incomplete type
- filedb.c:220: dereferencing pointer to incomplete type
- filedb.c:224: dereferencing pointer to incomplete type
- filedb.c:224: dereferencing pointer to incomplete type
- filedb.c:225: dereferencing pointer to incomplete type
- filedb.c:230: `s' undeclared (first use this function)
- filedb.c:231: `st' undeclared (first use this function)
- filedb.c:232: `fdb' undeclared (first use this function)
- filedb.c:232: `where' undeclared (first use this function)
- filedb.c:237: `fdb1' undeclared (first use this function)
- filedb.c:253: warning: assignment makes pointer from integer without a cast
- make: The error code from the last command is 1.
-
- This seems like one of the components of configure was broken, because what
- apparently happened was it didn't detect that this particular system had
- dirent.h and sys/dir.h, edit your config.h and change the following two
- lines (these lines are not right next to each other, but they are close):
-
- /* Define if you have the <dirent.h> header file. */
- /* #undef HAVE_DIRENT_H */
-
- /* Define if you have the <sys/dir.h> header file. */
- /* #undef HAVE_SYS_DIR_H */
-
- to
-
- /* Define if you have the <dirent.h> header file. */
- #define HAVE_DIRENT_H 1
-
- /* Define if you have the <sys/dir.h> header file. */
- #define HAVE_SYS_DIR_H 1
-
- 8. 'FD_SET' UNDECLARED (AND A WHOLE BUNCH OF OTHERS) (AIX 4)
-
- gcc -c -O2 -fno-strength-reduce -I.. -DHAVE_CONFIG_H -DHAVE_DIRENT_H -DHAVE_SYS_DIR_H net.c
- net.c: In function `sockread':
- net.c:390: `fd_set' undeclared (first use this function)
- net.c:390: (Each undeclared identifier is reported only once
- net.c:390: for each function it appears in.)
- net.c:390: parse error before `fd'
- net.c:396: `fd' undeclared (first use this function)
- make: The error code from the last command is 1.
-
- Again, this seems that one of configure's components (sed, awk, or something
- along those lines) was broken, and it failed to detect that this system needed
- sys/select.h, edit your config.h and change the following line:
-
- /* Define if you have the <sys/select.h> header file. */
- /* #undef HAVE_SYS_SELECT_H */
-
- to:
-
- /* Define if you have the <sys/select.h> header file. */
- #define HAVE_SYS_SELECT_H 1
-
- (I suppose they thought a minor error would deter anyone from continuing
- onward, but I am not just anyone, I am a blockhead... <grin>)
-
- 9. UNRESOLVED OR UNDEFINED SYMBOLS: ldclose, ldopen, ldnshread (AIX 3)
-
- cc -s -o eggdrop chan.o chanprog.o chanset.o cmds.o dcc.o dccutil.o filedb.o fileq.o files.o gotdcc.o hash.o main.o match.o mem.o misc.o mode.o msgcmds.o msgnotice.o net.o tandcmd.o tandem.o tcl.o tclhash.o userrec.o users.o -L/home2/f/foster/lib -ltcl
- 7.5 -lm
- 0706-317 ERROR: Unresolved or undefined symbols detected:
- Symbols in error (followed by references) are
- dumped to the load map.
- The -bloadmap:<filename> option will create a load map.
- .ldclose
- .ldopen
- .ldnshread
- make: 1254-004 The error code from the last command is 8.
-
- Apparently what is happening is a library called ld is required, and either
- configure doesn't know it is needed or it simple can't find it, or maybe
- this is a unique case, solution was to have ld linked in with the final
- binary.
-
- Edit your Makefile and find the line that looks something like this:
-
- GMAKE = ${MAKE} 'CC=cc' 'AWK=awk' 'OBJS=${OBJS}' 'TCLLIBFN=tcl7.5.a'\
- 'CFLAGS=${CFLAGS}' 'XREQ=${XREQ}' 'XLIBS= -L/home2/f/foster/lib -ltcl7.5 -lm'\
- 'TCLLIB=${TCLLIB}' 'RANLIB=ranlib' 'STRIP=-s'
-
- And add in -lld into the XLIBS assignment, like this...
-
- GMAKE = ${MAKE} 'CC=cc' 'AWK=awk' 'OBJS=${OBJS}' 'TCLLIBFN=tcl7.5.a'\
- 'CFLAGS=${CFLAGS}' 'XREQ=${XREQ}' 'XLIBS=-lld -L/home2/f/foster/lib -ltcl7.5 -lm'\
- 'TCLLIB=${TCLLIB}' 'RANLIB=ranlib' 'STRIP=-s'
-
- 10. UNSATISIFED SYMBOLS 'shl_findsym' and 'shl_load' (HP-UX 9)
-
- gcc -s -o eggdrop chan.o chanprog.o chanset.o cmds.o dcc.o dccutil.o filedb.o fileq.o files.o gotdcc.o hash.o main.o match.o mem.o misc.o mode.o msgcmds.o msgnotice.o net.o tandcmd.o tandem.o tcl.o tclhash.o userrec.o users.o -L/home/hltran/tcl/lib -lt
- cl7.5 -lm
- /bin/ld: Unsatisfied symbols:
- shl_findsym (code)
- shl_load (code)
- collect2: ld returned 1 exit status
- *** Error code 1
- Stop.
-
- I forwarded this one to Robey and he said that Tcl 7.5 the dl library, and that
- apparently configure couldn't detect that this was required in this case. So
- try this fix, and if it works, great, if not then use Tcl 7.4, I hear this
- works. :)
-
- GMAKE = ${MAKE} 'CC=gcc' 'AWK=awk' 'OBJS=${OBJS}' 'TCLLIBFN=tcl7.5.a'\
- 'CFLAGS=${CFLAGS}' 'XREQ=${XREQ}' 'XLIBS= -L/usr/local/lib -ltcl7.5 -lm'\
- 'TCLLIB=${TCLLIB}' 'RANLIB=:' 'STRIP='
-
- And here is what you need to change:
-
- GMAKE = ${MAKE} 'CC=gcc' 'AWK=awk' 'OBJS=${OBJS}' 'TCLLIBFN=tcl7.5.a'\
- 'CFLAGS=${CFLAGS}' 'XREQ=${XREQ}' 'XLIBS=-ldl -L/usr/local/lib -ltcl7.5 -lm'\
- 'TCLLIB=${TCLLIB}' 'RANLIB=:' 'STRIP='
-
- Basically what you are doing is adding in -ldl to the XLIBS declaration,
- essentially at link time you are tell it to also link in the dl library which
- apparently resolves this problem.
-
-
- 11. R_OK/X_OK UNDECLARE, IMPLICIT DECLARATION OF 'access' (Linux 1.2.13)
-
- /usr/include/linux/types.h:20: warning: useless keyword or type name in empty declaration
- /usr/include/linux/types.h:20: warning: empty declaration
- filedb.c: In function `filedb_open':
- filedb.c:285: warning: implicit declaration of function `access'
- filedb.c:285: `R_OK' undeclared (first use this function)
- filedb.c:285: (Each undeclared identifier is reported only once
- filedb.c:285: for each function it appears in.)
- filedb.c:285: `X_OK' undeclared (first use this function)
- make[1]: *** [filedb.o] Error 1
-
- Apparently configure didn't find unistd.h, this should be able to fix the
- problem, edit your config.h and change the following line:
-
- /* Define if you have the <unistd.h> header file. */
- /* #undef HAVE_UNISTD_H */
-
- to
-
- /* Define if you have the <unistd.h> header file. */
- #define HAVE_UNISTD_H 1
-
-
- B. TCL
-
- 1. REDECLARATION IN COMPAT/UNISTD.H (Tcl 7.4/AIX 4)
-
- cc -c -O -I. -I. -DHAVE_________=1 -DSTDC_HEADERS=1 -DNO_UNION_WAIT=1 -DNEED_MATHERR=1 -Dvfork=fork -DTCL_LIBRARY=\"/usr/local/lib/tcl7.4\" regexp.c
- "compat/unistd.h", line 42.12: 1506-343 (S) Redeclaration of execl differs from previous declaration on line 121 of "/usr/include/unistd.h".
- "compat/unistd.h", line 42.12: 1506-378 (I) Prototype for function execl cannot contain "..." when mixed with a nonprototype declaration.
- "compat/unistd.h", line 43.12: 1506-343 (S) Redeclaration of execle differs from previous declaration on line 123 of "/usr/include/unistd.h".
- "compat/unistd.h", line 43.12: 1506-378 (I) Prototype for function execle cannot contain "..." when mixed with a nonprototype declaration.
- "compat/unistd.h", line 44.12: 1506-343 (S) Redeclaration of execlp differs from previous declaration on line 125 of "/usr/include/unistd.h".
- "compat/unistd.h", line 44.12: 1506-378 (I) Prototype for function execlp cannot contain "..." when mixed with a nonprototype declaration.
- make: The error code from the last command is 1.
-
- Seems that configure had a brain fart... Would you believe this was the same
- system as in A.6 and A.7, heh, it was. Apparently it thought this system
- didn't have unistd.h, and was using it's compatible header, solution was to
- edit Makefile and change this line:
-
- AC_FLAGS = -DHAVE_________=1 -DSTDC_HEADERS=1 -DNO_UNION_WAIT=1 -DNEED_MATHERR=1 -Dvfork=fork
-
- to the following:
-
- AC_FLAGS = -DHAVE_UNISTD_H=1 -DSTDC_HEADERS=1 -DNO_UNION_WAIT=1 -DNEED_MATHERR=1 -Dvfork=fork
-
-
- 2. CONFLICTING TYPES FOR 'waitpid' (Tcl 7.5/SunOS 5.4)
-
- cc -c -O -I./../generic -I. -DNO_STRERROR=1 -DNO_GETWD=1 -DNO_WAIT3=1 -DNO_UNAME=1 -DNO_DIRENT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_SYS_TIME_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_TIMEZONE_VAR=1 -DUSE_DIRENT2_H=1 -DNO_UNION_WAIT=1 -DNEED_MATHERR=1 -Dvfork=fork -DN
- O_GETTOD=1 -DGETTOD_NOT_DECLARED=1 -DTCL_SHLIB_EXT=\".so\"
- ./../compat/waitpid.c
- ./../compat/waitpid.c:69: conflicting types for `waitpid'
- /usr/include/sys/wait.h:80: previous declaration of `waitpid'
- make: *** [waitpid.o] Error 1
-
- Configure apparently couldn't figure this one out, probably because the system
- it was configured on sucks badly. Change the following line in Makefile:
-
- COMPAT_OBJS = getcwd.o opendir.o strstr.o strtol.o tmpnam.o waitpid.o strstr.o strtoul.o strtod.o strncasecmp.o
-
- To the following
-
- COMPAT_OBJS = getcwd.o opendir.o strstr.o strtol.o tmpnam.o strstr.o strtoul.o strtod.o strncasecmp.o
-
- We are deleting the waitpid.o object file. The problem was that configure
- didn't detect that waitpid() wasn't necessary, so it caused a compatible
- waitpid() function to be compiled.
-
-
- 3. UNDEFINED SYMBOLS IN tclUnixChan.o -- AND MANY OTHERS (Tcl 7.5/SunOS 5.4)
-
- gcc tclAppInit.o -L/export/home/rewt/tcl7.5/unix -ltcl7.5 -ldl -lm -lc \
- -o tclsh
- Undefined first referenced
- symbol in file
- socket /export/home/rewt/tcl7.5/unix/libtcl7.5.a(tclUnixChan.o)
- getpeername /export/home/rewt/tcl7.5/unix/libtcl7.5.a(tclUnixChan.o)
- recv /export/home/rewt/tcl7.5/unix/libtcl7.5.a(tclUnixChan.o)
- gethostbyname /export/home/rewt/tcl7.5/unix/libtcl7.5.a(tclUnixChan.o)
- accept /export/home/rewt/tcl7.5/unix/libtcl7.5.a(tclUnixChan.o)
- send /export/home/rewt/tcl7.5/unix/libtcl7.5.a(tclUnixChan.o)
- bind /export/home/rewt/tcl7.5/unix/libtcl7.5.a(tclUnixChan.o)
- setsockopt /export/home/rewt/tcl7.5/unix/libtcl7.5.a(tclUnixChan.o)
- getwd /export/home/rewt/tcl7.5/unix/libtcl7.5.a(getcwd.o)
- getservbyname /export/home/rewt/tcl7.5/unix/libtcl7.5.a(tclIOSock.o)
- gethostbyaddr /export/home/rewt/tcl7.5/unix/libtcl7.5.a(tclUnixChan.o)
- getsockopt /export/home/rewt/tcl7.5/unix/libtcl7.5.a(tclIOSock.o)
- inet_addr /export/home/rewt/tcl7.5/unix/libtcl7.5.a(tclUnixChan.o)
- inet_ntoa /export/home/rewt/tcl7.5/unix/libtcl7.5.a(tclUnixChan.o)
- getsockname /export/home/rewt/tcl7.5/unix/libtcl7.5.a(tclUnixChan.o)
- listen /export/home/rewt/tcl7.5/unix/libtcl7.5.a(tclUnixChan.o)
- connect /export/home/rewt/tcl7.5/unix/libtcl7.5.a(tclUnixChan.o)
- ld: fatal: Symbol referencing errors. No output written to tclsh
- make: *** [tclsh] Error 1
-
- Configure couldn't find or detect that nsl and socket libraries were required,
- so we have to force it to use them. The solution is to edit Makefile and
- change the following line:
-
- LIBS = -ldl
-
- To the following:
-
- LIBS = -ldl -lnsl -lsocket
-
-
- 4. UNDEFINED SYMBOL 'getwd' IN getcwd.o (Tcl 7.5/SunOS 5.4)
-
- gcc tclAppInit.o -L/export/home/rewt/tcl7.5/unix -ltcl7.5 -ldl -lnsl -lsocket -lm -lc \
- -o tclsh
- Undefined first referenced
- symbol in file
- getwd /export/home/rewt/tcl7.5/unix/libtcl7.5.a(getcwd.o)
- ld: fatal: Symbol referencing errors. No output written to tclsh
- make: *** [tclsh] Error 1
-
-
- Configure apparently couldn't figure this one out, probably because the system
- it was configured on sucks badly. Change the following line in Makefile:
-
- COMPAT_OBJS = getcwd.o opendir.o strstr.o strtol.o tmpnam.o strstr.o strtoul.o strtod.o strncasecmp.o
-
- To the following
-
- COMPAT_OBJS = opendir.o strstr.o strtol.o tmpnam.o strstr.o strtoul.o strtod.o strncasecmp.o
-
- We are deleting the getcwd.o object file. The problem was that configure
- didn't detect that getcwd() wasn't necessary, so it caused a compatible
- getcwd() function to be compiled.
-
-
-
-