Hallo, ich bin gerade dabei einen dedizierten Server von OpenTTD (links dazu unten) aufzusetzen. Ich versuche gerade den Server gegen den glibc-ersatz "dietlibc" kompilieren. Meine Änderungen dazu im Makefile: CC_HOST:=gcc CFLAGS_HOST:=-s -O2 -fomit-frame-pointer CFLAGS:=-nostdlib -D_BSD_SOURCE -static -L/opt/diet/lib-i386/start.o -isystem /opt/diet/include -D__dietlibc__ -s -O2 -fomit-frame-pointer -DWITH_REV -DUNIX -DWITH_ZLIB LDFLAGS:=/opt/diet/lib-i386/libc.a -lgcc /opt/diet/lib-i386/libc.a Dabei klappt auch die komplette Kompilierung. Doch beim Linkervorgang bekomme ich folgenden Fehler: ===> Linking openttd network_data.o(.text+0x317): In function `NetworkSend_Packets': : undefined reference to `errno' network_data.o(.text+0x71a): In function `NetworkRecv_Packet': : undefined reference to `errno' network_udp.o(.text+0x96d): In function `NetworkSendUDP_Packet': : undefined reference to `errno' extmidi.o(.text+0x116): In function `DoPlay': : undefined reference to `errno' collect2: ld returned 1 exit status Das merkwürdige dabei ist allerdings, dass sowohl die Pfade zu den libs und zu den Includes absolut korrekt sind, die errno.h inkludiert wird und auch sonst anscheinend alles seine Richtigkeit hat. Gegen die glibc kompiliert und linked das Programm korrekt. Ein Bekannter von mir kompiliert das Programm mit dem gleichen Makefile, nur anderem gcc und Distribution ebenfalls gegen die gleiche dietlibc problemlos. Weitere Infos: --------------------------------- Distribution: Suse 9.0 -- # gcc -v Reading specs from /usr/lib/gcc-lib/i586-suse-linux/3.3.1/specs Configured with: ../configure --enable-threads=posix --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib --enable-languages=c,c++,f77,objc,java,ada --disable-checking --enable-libgcj --with-gxx-include-dir=/usr/include/g++ --with-slibdir=/lib --with-system-zlib --enable-shared --enable-__cxa_atexit i586-suse-linux Thread model: posix gcc version 3.3.1 (SuSE Linux) -- errno.h der dietlibc. <code> #ifndef _REENTRANT extern int errno; #else #define errno (*__errno_location()) #endif extern int *__errno_location(void); </code> -- errno Symbol in /opt/diet/.../libc.a <code> # nm --defined-only /opt/diet/lib-i386/libc.a | grep errno errno.o: 00000000 V errno errno_location.o: 00000000 W __errno_location h_errno.o: 00000004 C h_errno herrno_location.o: 00000000 T __h_errno_location 00000000 W h_errno_location </code> -- linker zeile, die aus dem Makefile springt: <code> gcc /opt/diet/lib-i386/libc.a -lgcc /opt/diet/lib-i386/libc.a ai.o ... unix.o [<- alle object-dateien des programms) -lz -L/usr/local/lib -L/usr/local/lib -Wl,-rpath,/usr/local/lib -lpng12 -lz -lm -lpng12 -lz -lm -o openttd </code> --------------------------------------------------- Hat jemand eine Ahnung woran das liegen könnte? Sollten mehr Infos notwendig sein stehe ich bereit sie zu beschaffen :-) Vielen Dank! Gruß Marcel Bankmann Links: http://sourceforge.net/projects/openttd/ http://www.fefe.de/dietlibc/
Hallo, Am Sat, 23 Jul 2005, adsci schrieb:
ich bin gerade dabei einen dedizierten Server von OpenTTD (links dazu unten) aufzusetzen. Ich versuche gerade den Server gegen den glibc-ersatz "dietlibc" kompilieren.
Meine Änderungen dazu im Makefile:
CC_HOST:=gcc CFLAGS_HOST:=-s -O2 -fomit-frame-pointer CFLAGS:=-nostdlib -D_BSD_SOURCE -static -L/opt/diet/lib-i386/start.o ^^ Was soll das? Und dann auch noch in den CFLAGS? -isystem /opt/diet/include -D__dietlibc__ -s -O2 -fomit-frame-pointer -DWITH_REV -DUNIX -DWITH_ZLIB LDFLAGS:=/opt/diet/lib-i386/libc.a -lgcc /opt/diet/lib-i386/libc.a
Dabei klappt auch die komplette Kompilierung. Doch beim Linkervorgang bekomme ich folgenden Fehler:
===> Linking openttd network_data.o(.text+0x317): In function `NetworkSend_Packets': : undefined reference to `errno' [..] linker zeile, die aus dem Makefile springt:
<code> gcc /opt/diet/lib-i386/libc.a -lgcc /opt/diet/lib-i386/libc.a ai.o ... unix.o [<- alle object-dateien des programms) -lz -L/usr/local/lib -L/usr/local/lib -Wl,-rpath,/usr/local/lib -lpng12 -lz -lm -lpng12 -lz -lm -o openttd </code>
Beim statisch linken kommt es auf die Reihenfolge an. Versuch mal die libc.a hinten anzugeben: gcc ai.o ... unix.o [<- alle object-dateien des programms) -lz -L/usr/local/lib -L/usr/local/lib -Wl,-rpath,/usr/local/lib -lpng12 -lz /opt/diet/lib-i386/libm.a -lpng12 -lz -lgcc /opt/diet/lib-i386/libc.a /opt/diet/lib-i386/libm.a -o openttd Auch die libm (-lm) solltest du durch die diet-Version ersetzen. Allerdings sind wohl die anderen libs (libz, libpng usw.) gegen die glibc gelinkt, ob das ganze also geht und ob du nicht dennoch eine Abhaengigkeit zur glibc bekommst... -dnh -- Man tut was man kann. Kann amn aber wirklich immer das was man tut? [Woko° in dag°]
hi!
Beim statisch linken kommt es auf die Reihenfolge an. Versuch mal die libc.a hinten anzugeben:
gcc ai.o ... unix.o [<- alle object-dateien des programms) -lz -L/usr/local/lib -L/usr/local/lib -Wl,-rpath,/usr/local/lib -lpng12 -lz /opt/diet/lib-i386/libm.a -lpng12 -lz -lgcc /opt/diet/lib-i386/libc.a /opt/diet/lib-i386/libm.a -o openttd
Auch die libm (-lm) solltest du durch die diet-Version ersetzen. Allerdings sind wohl die anderen libs (libz, libpng usw.) gegen die glibc gelinkt, ob das ganze also geht und ob du nicht dennoch eine Abhaengigkeit zur glibc bekommst...
ja, das wars :-) und dafür sitz ich nu tagelang da und kompiliere dauernd mit verschiedenen dietlibc versionen und 2 verschiedenen gcc's :-/ vielen dank! marcel bankmann
participants (2)
-
adsci
-
David Haller