Strona główna › Forums › Dla programistów › x86 Cross compiler GCC 4.5.4+ –target MorphOS
Otóż w związku z eksperymentem przeportowania pewnego programu na MorphOS (działającego w linii poleceń), zapragnąłem posiadania kompilatora GCC nowszego niż 4.4.5. Temu kod nie bardzo pasuje i zabawa kończy się error-em. Mogę dokonać kompilacji portowanego programu za pomocą GCC 2.95.3 (po wyłączeniu podczas konfigu części kodu w C++) jednak podczas kompilacji często przewija się kilka warnig-ów z którymi nie bardzo mogę sobie poradzić. Prawdobnie dlatego przeportowany program działa mocno niestabilnie.
Sprawdzonym kompilatorem w tej dziedzinie jest GCC 4.6.4 (przynajmniej na Linux-ie). Na początek zbudowałem kroskompilator GCC w wersji 4.4.5, na bazie aktualnego sdk-source dla MorphOS i z pomocą skryptu Bigfoot-a. Praktycznie kompilator ten działa identycznie jak pod MorphOS-em.
Następnie podjąłem się próby wprowadzenia do mosowego SDK źródeł GCC w wersji 4.6.4. Szybko okazało się że brakuje jednego pakietu z infrastruktury GCC. Po wielu próbach i błędach udało mi się dojść do etapu kompilacji GCC z możliwością linkowania z dołączonym, brakującym wcześniej pakietem (mpc-0.8.1). Niefortunnie (w prawdzie spodziewałem się czegoś takiego) konfiguracja jednego z wewnętrznych składników GCC kończy się błędem.
Problem w tym, że jak dotąd potrafiłem sobie wyprowadzić dodatkowe interesujące mnie dane (oprócz tych ze standardowego logu) i "posklejać" co nieco, tak przy tym błędzie nie wiem gdzie szukać. Wiem, że w źródłach GCC 4.4.5 z SDK MOSa znajdują się morphosowe patche Marka Szyprowskiego. Patch-y z GCC 4.4.5 nie użyłem. Z tego co wyczytałem domyślam się, że wymagane są głównie do budowy kompilatora pod MorphOS, a nie koniecznie kroskompilatora, choć jako co najwyżej progr-amator mogę się mylić rzecz jasna .
Dobra daję ten błąd tak poglądowo chociaż, może ktoś mnie nakieruje.
Wstęp – konfiguracja intl :
mkdir -p -- ./intl
Configuring in ./intl
configure: creating cache ./config.cache
checking whether make sets $(MAKE)... yes
checking for a BSD-compatible install... /usr/bin/install -c
checking whether NLS is requested... yes
checking for msgfmt... no
checking for gmsgfmt... :
checking for xgettext... no
checking for msgmerge... no
checking for i686-pc-linux-gnu-gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking for i686-pc-linux-gnu-ranlib... ranlib
checking for library containing strerror... none required
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ANSI C header files... yes
checking for an ANSI C-conforming const... yes
checking for inline... inline
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for off_t... yes
checking for size_t... yes
checking for working alloca.h... yes
checking for alloca... yes
checking for stdlib.h... (cached) yes
checking for unistd.h... (cached) yes
checking for getpagesize... yes
checking for working mmap... yes
checking whether we are using the GNU C Library 2.1 or newer... yes
checking whether integer division by zero raises SIGFPE... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unsigned long long... yes
checking for inttypes.h... yes
checking whether the inttypes.h PRIxNN macros are broken... no
checking for ld used by GCC... ld
checking if the linker (ld) is GNU ld... yes
checking for shared library run path origin... done
checking argz.h usability... yes
checking argz.h presence... yes
checking for argz.h... yes
checking limits.h usability... yes
checking limits.h presence... yes
checking for limits.h... yes
checking locale.h usability... yes
checking locale.h presence... yes
checking for locale.h... yes
checking nl_types.h usability... yes
checking nl_types.h presence... yes
checking for nl_types.h... yes
checking malloc.h usability... yes
checking malloc.h presence... yes
checking for malloc.h... yes
checking stddef.h usability... yes
checking stddef.h presence... yes
checking for stddef.h... yes
checking for stdlib.h... (cached) yes
checking for string.h... (cached) yes
checking for unistd.h... (cached) yes
checking sys/param.h usability... yes
checking sys/param.h presence... yes
checking for sys/param.h... yes
checking for feof_unlocked... yes
checking for fgets_unlocked... yes
checking for getc_unlocked... yes
checking for getcwd... yes
checking for getegid... yes
checking for geteuid... yes
checking for getgid... yes
checking for getuid... yes
checking for mempcpy... yes
checking for munmap... yes
checking for putenv... yes
checking for setenv... yes
checking for setlocale... yes
checking for stpcpy... yes
checking for strcasecmp... yes
checking for strdup... yes
checking for strtoul... yes
checking for tsearch... yes
checking for __argz_count... yes
checking for __argz_stringify... yes
checking for __argz_next... yes
checking for __fsetlocking... yes
checking for iconv... yes
checking for iconv declaration... install-shextern size_t
iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
char * *outbuf, size_t *outbytesleft);
checking for nl_langinfo and CODESET... yes
checking for LC_MESSAGES... yes
checking for bison... bison
checking version of bison... 2.5, ok
checking whether NLS is requested... yes
checking whether included gettext is requested... no
checking for GNU gettext in libc... yes
checking whether to use NLS... yes
checking where the gettext function comes from... libc
checking for aclocal... no
checking for autoconf... no
checking for autoheader... no
configure: updating cache ./config.cache
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.intl
config.status: creating config.h
config.status: executing default-1 commands
Configuring in ./gcc
configure: creating cache ./config.cache
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking target system type... powerpc-unknown-morphos
checking LIBRARY_PATH variable... ok
checking GCC_EXEC_PREFIX variable... ok
checking whether to place generated files in the source directory... no
checking whether a default linker was specified... yes (/gg/ppc-morphos/bin/ld - GNU ld)
checking whether a default assembler was specified... yes (/gg/ppc-morphos/bin/as - GNU as)
checking for i686-pc-linux-gnu-gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
Finał:
checking whether getrusage is declared... yes
checking whether ldgetname is declared... no
checking whether times is declared... yes
checking whether sigaltstack is declared... yes
checking for struct tms... yes
checking for clock_t... yes
checking for .preinit_array/.init_array/.fini_array support... yes
checking if mkdir takes one argument... no
*** Configuration powerpc-unknown-morphos not supported
make[2]: *** [configure-gcc] Error 1
make[2]: Leaving directory `/tmp/tmp.sXoYHomyZp/gcc4/gcc-4.4.5/build'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/tmp/tmp.sXoYHomyZp/gcc4/gcc-4.4.5/build'
make: *** [gcc4_make] Error 2
Ewentualnie jestem w stanie na privie oddać stery przez ssh jakby co 😉 z małym info.
Ps. Fakt że katalog z gcc jest jako gcc-4.4.5 teoretycznie nie gra roli, nie zmieniłem tego aby uniknąć niepotrzebnych błędów już na początku. Rzeczywiście jest tam kod 4.6.4.
Coś jakby wydaje mi się, że można przełączać się między wersjami kompilowanego GCC przy pomocy jednej opcji w configu, trzeba sprawdzić.
No nie jedną ale da się to zrobić elegankco . Na chwilę obecną 4.4.7 z z mosowym sdk kompiluje się i działa bez problemu. Teraz walczę z 4.5.0, jak przebrnę to następne podejście 4.5.4.
Tak na marginesie, zastanawiam się co to za genialny kod, że kompiluje się pod 4.6.4 a pod 4.4.5 nie…
Tak dla ścisłości, ten "genialny kod" kompiluje się na 4.6.4 dla Linuxa i docelowo na Linuxa (wersji GCC w dół na Linux nie sprawdzałem). Pod 4.4.5 nie kompiluje się na MorphOS, a na tym mi najbardziej zależy. Sprawdzałem z aktualnym SDK MorphOS-a i na kroskompilatorze pod Linuxem (z tym samym SDK).
Nawiasem mówiąc port tego genialnego programu jest na MOS-a, leży sobie na Aminecie (itix sportował)
ale niestety działa niestabilnie, a o zgrozo wersja dla OS4 pod OS4 Emu "działa jak fabryka chciała".
Tak dla ścisłości, ten "genialny kod" kompiluje się na 4.6.4 dla Linuxa i docelowo na Linuxa (wersji GCC w dół na Linux nie sprawdzałem). Pod 4.4.5 nie kompiluje się na MorphOS, a na tym mi najbardziej zależy. Sprawdzałem z aktualnym SDK MorphOS-a i na kroskompilatorze pod Linuxem (z tym samym SDK).
Nawiasem mówiąc port tego genialnego programu jest na MOS-a, leży sobie na Aminecie (itix sportował)
ale niestety działa niestabilnie, a o zgrozo wersja dla OS4 pod OS4 Emu "działa jak fabryka chciała".
wielkość stosu możesz na pewno ustawić w programie. Niestety jestem po za domem (jeszcze przez kilka dni) i nie powiem Ci dokładnie w jaki sposób, ale pytaj Kiera – powinien gdzieś błakac się po kanałach ircowych na freenode. On mi kilka lat temu zwrócił na to uwagę, gdy coś portowalem dla lubmilli.
@Kaczuś: No i fajnie, że można coś z tym stosem robić – już się cieszę chociaż nie wiem jeszcze jak tego dokonać 😉
@Kraszan: Stestowałem dbm2wav na 4.4.7 pod mosa i gitarka 🙂 Trochę cichy łejwik wyszedł ale MD5 się zgadza co najważniejsze.
Zauważyłem, że w mosowym sdk brak jest robodoc. Co więcej, zdaje się chochlik porwał jedną linijkę z makefile – ale pewnie już poprawione. Ja dorobiłem sobie tak:
dbminfo.o: dbminfo.c libdigibooster3.h musicmodule.h dsp.h lists.h
i zadziałało
@Kaczuś: No i fajnie, że można coś z tym stosem robić – już się cieszę chociaż nie wiem jeszcze jak tego dokonać 😉
Na razie znalazlem zrodlowke pod libniksa:
dajesz w jednym z plikow twojego programu:
__stack = wielkość_stosu;
na razie nie mogę znaleźć jak to jest wprzypadku ixemul, alemożliwe, że podobnie
Na razie znalazlem zrodlowke pod libniksa:
dajesz w jednym z plikow twojego programu:
__stack = wielkość_stosu;
na razie nie mogę znaleźć jak to jest wprzypadku ixemul, alemożliwe, że podobnie
Możliwe że będzie podobnie dla ixemul. Tak mi się wydaje, bo ogólnie w binarkach na dysku można znaleźć ciąg znaków "__stack " a coś takiego z ixstack to już nie bardzo. No ale to tylko pochopne domysły z mojej strony , w każdym razie dzięki za info.
Copyright 2014 - Wszelkie prawa zastrzeżone MorphOS.pl