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
Converted to html by: xorc

If This Dont Help You You Can Also Check The Following:
Join The EggDrop mailing list by:
mailing: majordomo@sodre.net with, subscribe eggdrop in the body of your message,
Or go to the newsgroup: alt.irc.bots.eggdrop


A. EggDrop Problems:

Pick The Problem You Are Having:
  1. UNDEFINED REFERENCES IN NET.O (SunOS)
  2. COMPILE STOPS AT THE LAST MINUTE WITH "LD FATAL SIGNAL 11"! (Linux)
  3. LD: -ltcl7.4: EXPECTED LIBX.SO(.MAJOR.MINOR.XXX) (various)
  4. 'TCL_DONT_WAIT' UNDECLARED IN MAIN.C (various)
  5. '_Tcl_DoOneEvent' UNDEFINED SYMBOL (various)
  6. STRIP TERMINATED WITH SIGNAL 6 (various)
  7. 'DIR' UNDECLARED (AND A WHOLE BUNCH OF OTHERS) (AIX 4)
  8. 'FD_SET' UNDECLARED (AND A WHOLE BUNCH OF OTHERS) (AIX 4)
  9. UNRESOLVED OR UNDEFINED SYMBOLS: ldclose, ldopen, ldnshread (AIX 3)
  10. UNSATISIFED SYMBOLS 'shl_findsym' and 'shl_load' (HP-UX 9)
  11. R_OK/X_OK UNDECLARE, IMPLICIT DECLARATION OF 'access' (Linux 1.2.13)

B. TCL Problems:

Pick The Problem You Are Having:
  1. REDECLARATION IN COMPAT/UNISTD.H (Tcl 7.4/AIX 4)
  2. CONFLICTING TYPES FOR 'waitpid' (Tcl 7.5/SunOS 5.4)
  3. UNDEFINED SYMBOLS IN tclUnixChan.o -- And Many Others (Tcl 7.5/SunOS 5.4)
  4. UNDEFINED SYMBOL 'getwd' IN getcwd.o (Tcl 7.5/SunOS 5.4)



1. UNDEFINED REFERENCES IN NET.O (SunOS)
[ The Error: ]

Undefined first referenced
symbolin file
socketnet.o
gethostbynamenet.o
acceptnet.o
bindnet.o
setsockoptnet.o
gethostbyaddrnet.o
getsocknamenet.o
gethostnamenet.o
listennet.o
connectnet.o
ld: fatal: Symbol referencing errors. No output written to eggdrop

[ The Fix: ]

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.


[ Back To Top ]



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.


[ Back To Top ]



3. LD: -ltcl7.4: EXPECTED LIBX.SO(.MAJOR.MINOR.XXX) (various)

[ The Error: ]

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'

[ The Fix: ]

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.


[ Back To Top ]



4. 'TCL_DONT_WAIT' UNDECLARED IN MAIN.C (various)

[ The Error: ]

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

[ The Fix: ]

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


[ Back To Top ]



5. '_Tcl_DoOneEvent' UNDEFINED SYMBOL (various)

[ The Error: ]


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'

[ The Fix: ]

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


[ Back To Top ]



6. STRIP TERMINATED WITH SIGNAL 6 (various)

[ The Error: ]


collect2: strip terminated with signal 6 [IOT/Abort trap]
*** Exit 1
Stop.
*** Exit 1
Stop.

[ The Fix: ]

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='


[ Back To Top ]



7. 'DIR' UNDECLARED (AND A WHOLE BUNCH OF OTHERS) (AIX 4)

[ The Error: ]


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.

[ The Fix: ]

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


[ Back To Top ]



8. 'FD_SET' UNDECLARED (AND A WHOLE BUNCH OF OTHERS) (AIX 4)

[ The Error: ]


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.

[ The Fix: ]

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>)


[ Back To Top ]



9. UNRESOLVED OR UNDEFINED SYMBOLS: ldclose, ldopen, ldnshread (AIX 3)

[ The Error: ]


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: option will create a load map.
.ldclose
.ldopen
.ldnshread
make: 1254-004 The error code from the last command is 8.

[ The Fix: ]

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'


[ Back To Top ]



10. UNSATISIFED SYMBOLS 'shl_findsym' and 'shl_load' (HP-UX 9)

[ The Error: ]


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.

[ The Fix: ]

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.


[ Back To Top ]



11. R_OK/X_OK UNDECLARE, IMPLICIT DECLARATION OF 'access' (Linux 1.2.13)

[ The Error: ]


/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

[ The Fix: ]

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


[ Back To Top ]



1. REDECLARATION IN COMPAT/UNISTD.H (Tcl 7.4/AIX 4)

[ The Error: ]


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.

[ The Fix: ]

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


[ Back To Top ]



2. CONFLICTING TYPES FOR 'waitpid' (Tcl 7.5/SunOS 5.4)

[ The Error: ]


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

[ The Fix: ]

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.


[ Back To Top ]



3. UNDEFINED SYMBOLS IN tclUnixChan.o -- And Many Others (Tcl 7.5/SunOS 5.4)

[ The Error: ]


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

[ The Fix: ]

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


[ Back To Top ]



4. UNDEFINED SYMBOL 'getwd' IN getcwd.o (Tcl 7.5/SunOS 5.4)

[ The Error: ]


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

[ The Fix: ]

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.



Web hosting Co-Location Dialups Shell Dedicated
Domain Name Support Policy About Home


This page is Copyright© 1998 The Internet Hardlink Co
28 South Main Street,129, Randolph, MA 02368
Telephone: (781) 961-4982, Fax: (781) 961-4981
Email: webmaster@hardlink.net