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
and의 나머지 컴파일된 코드와 (바이너리) 호환되지 않는 것을 발견했음을 알려줍니다. 이는 일반적으로 아키텍처 불일치로 인해 발생합니다. 이 경우 빌드 시스템은 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비트 버전이 있습니다. 아마도 괜찮을 것 같지만 조금 이상해 보입니다.