Hallo, ich bin gerade dabei einen dedizierten Server von OpenTTD (links dazu weiter unten) aufzusetzen. Weil ich später einen bestimmten Wrapper um diesen Server nutzen will muss ich das Programm 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. 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) 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/
adsci <adsci@gmx.net> [Fr, 22 Jul 2005 21:43:54 +0200]:
Weil ich später einen bestimmten Wrapper um diesen Server nutzen will muss ich das Programm gegen den glibc-ersatz "dietlibc" kompilieren.
Viel Spass! In der Vergangenheit ist dietlibc eher durch Bugs aufgefallen.
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
Ich kann nur hoffen, dass das gut geht.
===> 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
Welche errno.h? Hier muss *zwingend* der Header der dietlibc verwendet werden! Wie sieht denn die Definition von errno im Header der dietlibc aus (vermutlich "extern int errno;")? Wie sieht die *komplette* Befehlszeile zum Linken aus? Enthält die dietlibc.a das entsprechende errno Symbol (nm --defined-only dietlibc.a| fgrep errno)?
Gegen die glibc kompiliert und linked das Programm korrekt.
Das beweist nicht viel. Philipp PS suse-programming wäre die passendere Liste gewesen.
participants (2)
-
adsci
-
Philipp Thomas