Podczas próby zbudowania wbudowanego systemu Linux na 64-bitowej Fedorze 16 (Verne) pojawia się następujący błąd:
make[3]: Entering directory `/export/home/git/minerva-5.x/third_party/multifiles'
mips-linux-gnu-gcc -EL -O -D_GNU_SOURCE -Wall -isystem /export/home/git/minerva-5.x/cs_rootfs_1.2.15/cross_rootfs/include -c -o md5.o md5.c
mips-linux-gnu-gcc -EL -O -D_GNU_SOURCE -Wall -isystem /export/home/git/minerva-5.x/cs_rootfs_1.2.15/cross_rootfs/include -c -o bitmapfs.o bitmapfs.c
mips-linux-gnu-gcc -EL -O -D_GNU_SOURCE -Wall -isystem /export/home/git/minerva-5.x/cs_rootfs_1.2.15/cross_rootfs/include -c -o mfcln.o mfcln.c
mips-linux-gnu-gcc -EL -Wl,-rpath /export/home/git/minerva-5.x/cs_rootfs_1.2.15/cross_rootfs/lib -L/export/home/git/minerva-5.x/cs_rootfs_1.2.15/cross_rootfs/lib -o mfcln md5.o bitmapfs.o mfcln.o mulfiles.h mulfiles_msg.h md5.h bitmapfs.h
gcc -O -Wall -m32 -c -o md5_x86_32.o md5.c
gcc -O -Wall -m32 -c -o mfsrv_x86_32.o mfsrv.c
gcc -O -m32 -o mfsrv32 md5_x86_32.o mfsrv_x86_32.o
gcc -O -m32 -static -o mfsrv32-static md5_x86_32.o mfsrv_x86_32.o
gcc -O -Wall -c -o md5_x86_64.o md5.c
gcc -O -Wall -c -o mfsrv_x86_64.o mfsrv.c
gcc -O -o mfsrv64 md5_x86_64.o mfsrv_x86_64.o
gcc -O -static -o mfsrv64-static md5_x86_64.o mfsrv_x86_64.o
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.6.3/../../../libc.a when searching for -lc
/usr/bin/ld: skipping incompatible /usr/lib/libc.a when searching for -lc
/usr/bin/ld: cannot find -lc
collect2: ld returned 1 exit status
make[3]: *** [mfsrv64-static] Error 1
Potrzebuję użyć starszej wersji make (make381) prawdopodobnie dlatego, że jądro jest stare i dostosowane (2.6.22.19-39-sigma), a celem jest MIPS. Zainstalowałem także ncurses-static, glibc-static.i686 i glibc-devel.i686 w moim systemie. Czy potrzebuję kompatybilnego libc.a dla make381? Jeśli tak, to gdzie mogę to znaleźć? Jeśli nie, gdzie szukać dalej, aby naprawić tę kompilację?
Pełne wyjście konsoli znajduje się tutaj .
Odpowiedzi:
make
sam prawdopodobnie nie ma wiele wspólnego z tym problemem. Objawy są typowe dla używania niewłaściwego łańcucha narzędzi i / lub bibliotek. Dane wyjściowe wskazują, że używany linker jest standardową Fedorąld
, co w 64-bitowej Fedorze oznaczałoby łańcuch narzędzi zdolny do tworzenia plików binarnych x86_64.informuje cię, że linker próbował połączyć się z,
/usr/lib/libc.a
ale stwierdził, że (binarny) jest niekompatybilny z resztą skompilowanego kodu wmd5_x86_64.o
imfsrv_x86_64.o
. Zwykle wynika to z niedopasowania architektury - w tym przypadku wydaje się, że system kompilacji próbuje połączyć 64-bitowe pliki obiektowe z biblioteką 32-bitową (pamiętaj, że to samo polecenie dla 32-bitowego pliku binarnego-m32
poszło dobrze). Wydaje się więc, że kompilator nie otrzymuje właściwych opcji podczas łączenia 64-bitowego pliku binarnego. Pierwszym krokiem w debugowaniu może być próba zbudowania ręcznie - tj. Ręczne wydanie błędnego polecenia w drzewie kompilacji.W twoim przypadku zaskakujące jest (przynajmniej dla mnie):
to znaczy: część kompilacji przy użyciu krzyżowego zestawu narzędzi i część przy użyciu natywnego oraz w wersjach 64-bitowych i 32-bitowych. Co może być w porządku, ale wygląda nieco dziwnie.
źródło