Cross-Compiler Linux nach FreeBSD

grisu

Active Member
Hallo zusammen,
ich versuche mir gerade einen Cross-Compiler einzurichten um unter Linux Binarys für FreeBSD zu compilieren. Der Grund ist der, dass ich mir einen alten Rechner für FreeBSD abgestellt habe ( 800Mhz P3 512MB RAM) und beim Compilieren auf der Ports gerne mittels icecc die anderen im Haushaltbefindlichen Rechner als Compile-Farm nutzen will. Problem an der Sache, die anderen 4 Rechner sind alles Linux-Rechner und mal eben so umstellen ist nicht. Bei Icecream / icecc ist ja an sich das arbeiten mit verschiedenen Archtikturen kein ding ( Linux-x86 und Linux-mips-bigendian).
Ein Problem war, das icecc Linux und FreeBSD Rechner unterscheiden können muss, da ist aber durch ein Paar quelltext modifikationen zu bewerkstelligen.
Nun das Problem um was es mir hier gehen soll:
Einen Cross-Compile Toolchain für FreeBSD 7 ( nur Compiler und assembler, libs, header und präprozessor werden nicht gebraucht)...

zu erste binutlis-2.15 mittels:
Code:
CC=gcc-3.4 ./configure --prefix=/usr/local/cross --target=i386-portbld-freebsd7.0
make && make install
überstetzt.

Anschließend nach /usr/local/cross/include das /usr/include aus freebsd kopiert.

und nun gcc-4.2.1 mittels
Code:
./configure --prefix=/usr/local/cross/ --target=i386-portbld-freebsd7.0 --enable-languages=c,c++ --disable-shared
konfiguriert aber nach einer weile bricht make ab:
Code:
/home/grisu/Download/gcc-4.2.1/host-i686-pc-linux-gnu/gcc/xgcc -B/home/grisu/Download/gcc-4.2.1/host-i686-pc-linux-gnu/gcc/ -B/usr/local/cross//i386-portbld-freebsd7.0/bin/ -B/usr/local/cross//i386-portbld-freebsd7.0/lib/ -isystem /usr/local/cross//i386-portbld-freebsd7.0/include -isystem /usr/local/cross//i386-portbld-freebsd7.0/sys-include -O2  -O2 -g -O2  -DIN_GCC -DCROSS_COMPILE   -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition  -isystem ./include   -fPIC -pthread -g -DHAVE_GTHR_DEFAULT -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED -Dinhibit_libc -shared -nodefaultlibs -Wl,--soname=libgcc_s.so.1 -Wl,--version-script=libgcc/./libgcc.map -o ./libgcc_s.so.1.tmp  libgcc/./_muldi3_s.o libgcc/./_negdi2_s.o libgcc/./_lshrdi3_s.o libgcc/./_ashldi3_s.o libgcc/./_ashrdi3_s.o libgcc/./_cmpdi2_s.o libgcc/./_ucmpdi2_s.o libgcc/./_clear_cache_s.o libgcc/./_enable_execute_stack_s.o libgcc/./_trampoline_s.o libgcc/./__main_s.o libgcc/./_absvsi2_s.o libgcc/./_absvdi2_s.o libgcc/./_addvsi3_s.o libgcc/./_addvdi3_s.o libgcc/./_subvsi3_s.o libgcc/./_subvdi3_s.o libgcc/./_mulvsi3_s.o libgcc/./_mulvdi3_s.o libgcc/./_negvsi2_s.o libgcc/./_negvdi2_s.o libgcc/./_ctors_s.o libgcc/./_ffssi2_s.o libgcc/./_ffsdi2_s.o libgcc/./_clz_s.o libgcc/./_clzsi2_s.o libgcc/./_clzdi2_s.o libgcc/./_ctzsi2_s.o libgcc/./_ctzdi2_s.o libgcc/./_popcount_tab_s.o libgcc/./_popcountsi2_s.o libgcc/./_popcountdi2_s.o libgcc/./_paritysi2_s.o libgcc/./_paritydi2_s.o libgcc/./_powisf2_s.o libgcc/./_powidf2_s.o libgcc/./_powixf2_s.o libgcc/./_powitf2_s.o libgcc/./_mulsc3_s.o libgcc/./_muldc3_s.o libgcc/./_mulxc3_s.o libgcc/./_multc3_s.o libgcc/./_divsc3_s.o libgcc/./_divdc3_s.o libgcc/./_divxc3_s.o libgcc/./_divtc3_s.o libgcc/./_fixunssfsi_s.o libgcc/./_fixunsdfsi_s.o libgcc/./_fixunsxfsi_s.o libgcc/./_fixsfdi_s.o libgcc/./_fixunssfdi_s.o libgcc/./_floatdisf_s.o libgcc/./_floatundisf_s.o libgcc/./_fixdfdi_s.o libgcc/./_fixunsdfdi_s.o libgcc/./_floatdidf_s.o libgcc/./_floatundidf_s.o libgcc/./_fixxfdi_s.o libgcc/./_fixunsxfdi_s.o libgcc/./_floatdixf_s.o libgcc/./_floatundixf_s.o libgcc/./_fixtfdi_s.o libgcc/./_fixunstfdi_s.o libgcc/./_floatditf_s.o libgcc/./_floatunditf_s.o libgcc/./_divdi3_s.o libgcc/./_moddi3_s.o libgcc/./_udivdi3_s.o libgcc/./_umoddi3_s.o libgcc/./_udiv_w_sdiv_s.o libgcc/./_udivmoddi4_s.o libgcc/./unwind-dw2_s.o libgcc/./unwind-dw2-fde_s.o libgcc/./unwind-sjlj_s.o libgcc/./gthr-gnat_s.o libgcc/./unwind-c_s.o -lc && rm -f ./libgcc_s.so && if [ -f ./libgcc_s.so.1 ]; then mv -f ./libgcc_s.so.1 ./libgcc_s.so.1.backup; else true; fi && mv ./libgcc_s.so.1.tmp ./libgcc_s.so.1 && ln -s libgcc_s.so.1 ./libgcc_s.so
/usr/local/cross//i386-portbld-freebsd7.0/bin/ld: crti.o: No such file: Datei oder Verzeichnis nicht gefunden
collect2: ld returned 1 exit status
make[3]: *** [libgcc_s.so] Fehler 1
make[3]: Leaving directory `/home/grisu/Download/gcc-4.2.1/host-i686-pc-linux-gnu/gcc'
make[2]: *** [libgcc.a] Fehler 2
make[2]: Leaving directory `/home/grisu/Download/gcc-4.2.1/host-i686-pc-linux-gnu/gcc'
make[1]: *** [all-gcc] Fehler 2
make[1]: Leaving directory `/home/grisu/Download/gcc-4.2.1'
make: *** [all] Fehler 2

Hat jemand so einen Cross-Compiler schon mal hinbekommen. Dass das ports-system mit icecc läuft hab ich schon getestet, und das scheint zu funktionieren.

MfG Grisu


Anmerkung: Icecream/Icecc: http://en.opensuse.org/Icecream (aufgebohrtes distcc)
 
Mit distcc sollte das eingentlich einfach so funktionieren. Wenn Icecream das also nicht kann, wundere ich mich natürlich wofür es dann gut sein soll.
 
Das problem liegt zur zeit nicht an distcc / icecream. Sondern das ich kein homogenes netz habe und meiner 4 Linux rechner die so in hause verteilt sind , die Compiler Jobs für FreeBSD machen sollen ( ob nun mit icecream oder distcc lassen wir mal aussen vor). Aber ich brauch da ja auf den Linux-Hosts einen Compiler der aus den C/C++ Datein ( die nach dem Preprocecing von icecream/distcc) im netzverteilt werden, das übersetzt und zwar, das es der Linker auf dem FreeBSD als FreeBSD tauglich anerkennt und mir wie gewünscht da die binary drauß macht.
 
Distcc macht alles systemabhängige auf dem Zielsystem. Es sollte eigentlich vollkommen egal sein unter welchem OS kompiliert wird. Nur die gcc-Version sollte die gleiche sein.
 
Der aussage entnehm ich jetzt.. das die *.o dateien die die Compiler auswerfen auf unix-system, falls gleiche architektur ( in dem fall x86) das gleiche format haben und auch über betriebssystem grenzen hinweg für den gleichen source den gleichen inhalt haben.
 
So scheint es zumindest. Erst der Linker generiert ein Systemabhängiges ELF.

Ich habe jedenfalls Erfahrungsberichte von Leuten gelesen, die ihre Ports per distcc auf Windows-Rechnern bauen lassen.
 
Naja da muss ich im laufe der tage mal mit distcc proboieren. Die sache ist halt das mit der gleichen kompilerversion. Bei so was ist nämlich icecc wesentlich flexibler und der rechner der die jobs anstößt kann vorher die compiler binarys verteilen.
 
Eher "noch nicht". Es gibt Anstrengungen das Buildsystem portabel zu machen.
 
Zurück
Oben