Como corrigir "ignorando /usr/lib/libc.a incompatível"

13

Eu recebo o seguinte erro ao tentar criar um destino Linux incorporado em um Fedora 16 (Verne) de 64 bits:

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

Preciso usar uma versão mais antiga do make (make381) provavelmente porque o kernel é antigo e personalizado (2.6.22.19-39-sigma) e o destino é MIPS. Também instalei o ncurses-static, glibc-static.i686 e glibc-devel.i686 no meu sistema. Preciso de uma libc.a compatível para make381? Se sim, onde posso encontrá-lo? Caso contrário, onde procurarei a seguir para corrigir essa compilação?

A saída completa do console está aqui .

jacknad
fonte
@ MarkPlotnick: Não parece que o cross gcc está travando, mas sim o PC (x86), que é usado para criar algumas das ferramentas. Expandi a saída do console na postagem original para mostrar isso e adicionei a saída completa do console aqui .
jacknad

Respostas:

9

makeprovavelmente não tem muito a ver com o problema. Os sintomas são típicos do uso de ferramentas e / ou bibliotecas incorretas. A saída indica que o vinculador em uso é o Fedora padrão ld, que no Fedora de 64 bits significaria uma cadeia de ferramentas capaz de produzir binários x86_64.

skipping incompatible /usr/lib/libc.a

informa que o vinculador tentou vincular, /usr/lib/libc.amas o achou (binário) incompatível com o restante do código compilado em md5_x86_64.oe mfsrv_x86_64.o. Isso geralmente ocorre devido a uma incompatibilidade de arquitetura - nesse caso, parece que o sistema de compilação tenta vincular um arquivo de objeto de 64 bits a uma biblioteca de 32 bits (observe que o mesmo comando para o binário de 32 bits -m32passou muito bem). Portanto, parece que o compilador não está obtendo as opções corretas ao vincular o binário de 64 bits. Como primeiro passo na depuração, você pode tentar criar manualmente - ou seja, emitir o comando com falha na árvore de construção manualmente.

O que também é bastante surpreendente (pelo menos para mim) no seu caso é o seguinte:

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

isto é: parte da compilação usando a cadeia de ferramentas cruzada e parte usando a nativa e nos sabores de 64 bits e 32 bits. O que pode estar certo, mas parece um pouco estranho.

peterph
fonte