jac*_*nad 14 fedora make glibc
当我尝试在 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
Run Code Online (Sandbox Code Playgroud)
我需要使用旧版本的 make (make381) 可能是因为内核是旧的并且是定制的 (2.6.22.19-39-sigma) 并且目标是 MIPS。我还在我的系统上安装了 ncurses-static、glibc-static.i686 和 glibc-devel.i686。我需要为 make381 兼容的 libc.a 吗?如果是这样,我在哪里可以找到它?如果没有,我下一步应该在哪里修复这个构建?
完整的控制台输出在这里。
pet*_*rph 10
make本身可能与问题没有太大关系。典型的症状是使用错误的工具链和/或库。输出表明正在使用的链接器是股票 Fedora ld,这在 64 位 Fedora 上意味着能够生成 x86_64 二进制文件的工具链。
skipping incompatible /usr/lib/libc.a
Run Code Online (Sandbox Code Playgroud)
告诉你,链接器试图与链接/usr/lib/libc.a,但发现它(二进制)与编译代码的其余部分不兼容md5_x86_64.o和mfsrv_x86_64.o。这通常是由于架构不匹配引起的 - 在这种情况下,构建系统似乎尝试将 64 位目标文件与 32 位库链接(请注意,32 位二进制文件的相同命令执行-m32得很好)。因此,在链接 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
Run Code Online (Sandbox Code Playgroud)
也就是说:一部分使用交叉工具链构建,一部分使用原生工具链,并且有 64 位和 32 位两种版本。这可能没问题,但看起来有点奇怪。