当我尝试在 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 吗?如果是这样,我在哪里可以找到它?如果没有,下一步我该去哪里修复这个构建?
完整的控制台输出是这里。
答案1
make
本身有可能与问题没有太大关系。这些症状是使用错误的工具链和/或库的典型症状。输出表明正在使用的链接器是库存 Fedora ld
,这在 64 位 Fedora 上意味着能够生成 x86_64 二进制文件的工具链。
skipping incompatible /usr/lib/libc.a
告诉您,链接器尝试链接 ,但发现它(二进制)与和/usr/lib/libc.a
中的其余已编译代码不兼容。这通常是由于架构不匹配而引起的 - 在这种情况下,构建系统似乎尝试将 64 位目标文件与 32 位库链接(请注意,针对 32 位二进制文件的相同命令运行得很好)。因此,编译器在链接 64 位二进制文件时似乎没有获得正确的选项。作为调试的第一步,您可能需要尝试手动构建 - 即手动在构建树中发出失败的命令。md5_x86_64.o
mfsrv_x86_64.o
-m32
在你的例子中,同样令人惊讶的(至少对我来说)是这样的:
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 位版本。这可能没问题,但看起来有点奇怪。