Wie man “inkompatible /usr/lib/libc.a überspringen” behebt

13

Ich erhalte die folgende Fehlermeldung, wenn ich versuche, ein eingebettetes Linux-Ziel auf einem 64-Bit-Fedora 16 (Verne) zu erstellen:

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

Ich muss wahrscheinlich eine ältere Version von make (make381) verwenden, da der Kernel alt und angepasst ist (2.6.22.19-39-sigma) und das Ziel MIPS ist. Ich habe auch ncurses-static, glibc-static.i686 und glibc-devel.i686 auf meinem System installiert. Benötige ich eine kompatible libc.a für make381? Wenn ja, wo finde ich es? Wenn nicht, wo sehe ich als nächstes nach, um diesen Build zu reparieren?

Die vollständige Konsolenausgabe finden Sie hier .

Jacknad
quelle
@ MarkPlotnick: Es sieht nicht so aus, als würde der Cross-GCC abstürzen, sondern der PC (x86), auf dem einige der Tools erstellt werden. Ich habe die Konsolenausgabe in der ursprünglichen Nachricht erweitert , dies zu zeigen , und die vollständige Ausgabe der Konsole hinzugefügt hier .
Jacknad

Antworten:

9

makeselbst hat wohl nicht viel mit dem problem zu tun. Die Symptome sind typisch für die Verwendung falscher Toolchain und / oder Bibliotheken. Die Ausgabe gibt an, dass der verwendete Linker das Standard-Fedora ist ld, was auf 64-Bit-Fedora eine Toolchain bedeuten würde, die x86_64-Binärdateien erzeugen kann.

skipping incompatible /usr/lib/libc.a

teilt Ihnen mit, dass der Linker versucht hat, eine Verknüpfung zu /usr/lib/libc.aerstellen, diese jedoch als (binär) inkompatibel mit dem Rest des kompilierten Codes in md5_x86_64.ound befunden hat mfsrv_x86_64.o. Dies ist in der Regel auf eine nicht übereinstimmende Architektur zurückzuführen. In diesem Fall scheint das Build-System zu versuchen, 64-Bit-Objektdateien mit einer 32-Bit-Bibliothek zu verknüpfen (beachten Sie, dass derselbe Befehl für 32-Bit-Binärdateien einwandfrei -m32durchlaufen wurde). Daher scheint es, dass der Compiler beim Verknüpfen der 64-Bit-Binärdatei nicht die richtigen Optionen erhält. Als ersten Schritt beim Debuggen möchten Sie möglicherweise versuchen, manuell zu erstellen - dh den fehlgeschlagenen Befehl im Build-Baum manuell ausgeben.

Was (zumindest für mich) in Ihrem Fall auch ziemlich überraschend ist, ist Folgendes:

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

Das heißt: Teil des Builds unter Verwendung der Cross-Toolchain und Teil des nativen Builds und sowohl in den 64-Bit- als auch in den 32-Bit-Varianten. Was vielleicht in Ordnung ist, aber ein bisschen seltsam aussieht.

peterph
quelle