web-dev-qa-db-ja.com

「互換性のない/usr/lib/libc.aをスキップ」を修正する方法

64ビットFedora 16(Verne)で組み込みLinuxターゲットをビルドしようとすると、次のエラーが発生します。

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

古いバージョンのmake(make381)を使用する必要があるのは、おそらくカーネルが古くてカスタマイズされており(2.6.22.19-39-sigma)、ターゲットがMIPSだからです。システムにncurses-static、glibc-static.i686、およびglibc-devel.i686もインストールしました。 make381には互換性のあるlibc.aが必要ですか?もしそうなら、どこでそれを見つけることができますか?そうでない場合、このビルドを修正するために次にどこを見ればよいですか?

完全なコンソール出力は here です。

13
jacknad

make自体には可能性が高い問題とはあまり関係がありません。症状は、間違ったツールチェーンやライブラリを使用する場合によく見られます。出力は、使用中のリンカーがストックのFedora ldであることを示しています。これは、64ビットのFedoraでは、x86_64バイナリを生成できるツールチェーンを意味します。

skipping incompatible /usr/lib/libc.a

リンカが/usr/lib/libc.aとのリンクを試みたが、それが(バイナリ)がmd5_x86_64.omfsrv_x86_64.oの残りのコンパイル済みコードと互換性がないことが判明したことを伝えます。これは通常、アーキテクチャの不一致が原因で発生します。この場合、ビルドシステムは64ビットのオブジェクトファイルを32ビットのライブラリとリンクしようとしているようです(-m32を使用した32ビットバイナリの同じコマンドは問題なく実行されていることに注意してください)。したがって、64ビットバイナリをリンクするときにコンパイラが正しいオプションを取得していないようです。デバッグの最初のステップとして、手動でビルドすることをお勧めします。つまり、失敗したコマンドをビルドツリーで手動で発行します。

あなたの場合(少なくとも私にとって)かなり驚くべきこともこれです:

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

つまり、クロスツールチェーンを使用したビルドの一部と、ネイティブのものを使用した一部と、64ビットと32ビットの両方のフレーバーです。大丈夫かもしれませんが、少し奇妙に見えます。

9
peterph