Sei que existem perguntas semelhantes por aí, mas não encontrei uma solução nem esse caso exato. O binário foi construído no Arch Linux usando seu GCC 4.7. O pacote funciona bem no sistema de compilação. Os comandos abaixo foram executados em:
Linux vbox-ubuntu 3.2.0-29-generic # 46-Ubuntu SMP Fri Jul 27 17:03:23 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux
O arquivo em questão está localizado aqui . É um compilador cruzado de 64 bits para Linux de 64 bits. Descompactá-lo para ~/
fornece um único ~/mingw64
diretório que contém tudo o necessário.
Quando tento executar, ~/mingw64/x86_64-w64-mingw32/bin/as
é isso que recebo:
bash: /home/ruben/mingw64/x86_64-w64-mingw32/bin/as: No such file or directory
Correr file ~/mingw64/x86_64-w64-mingw32/bin/as
me dá:
/home/ruben/mingw64/x86_64-w64-mingw32/bin/as: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x0b8e50955e7919b76967bac042f49c5876804248, not stripped
Correr ldd ~/mingw64/x86_64-w64-mingw32/bin/as
me dá:
linux-vdso.so.1 => (0x00007fff3e367000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f2ceae7e000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2ceaac1000)
/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f2ceb0a8000)
Estou verdadeiramente perdido. Qualquer ajuda é muito apreciada.
EDIT : Mais alguns detalhes: O sistema de compilação é o Arch Linux (atualmente glibc 2.16). A saída de ls -l
é:
-rwxr-xr-x 2 ruben users 1506464 11 aug 23:49 /home/ruben/mingw64/bin/x86_64-w64-mingw32-as
A saída de objdump -p
é:
Version References:
required from libz.so.1:
0x0827e5c0 0x00 05 ZLIB_1.2.0
required from libc.so.6:
0x0d696917 0x00 06 GLIBC_2.7
0x06969194 0x00 04 GLIBC_2.14
0x0d696913 0x00 03 GLIBC_2.3
0x09691a75 0x00 02 GLIBC_2.2.5
A saída do ldd -v
Ubuntu 12.04 é:
linux-vdso.so.1 => (0x00007fff225ff000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fd525c71000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd5258b4000)
/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fd525e9b000)
Version information:
/home/ruben/mingw64/x86_64-w64-mingw32/bin/as:
libz.so.1 (ZLIB_1.2.0) => /lib/x86_64-linux-gnu/libz.so.1
libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libz.so.1:
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc.so.6:
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
Os outros sistemas operacionais testados são o Fedora 17 (glibc 2.15) e o Ubuntu 12.04 (eglibc 2.15). Os requisitos das versões zlib e glibc são atendidos.
Respostas:
Se eu executar
ldd -v as
no meu sistema, recebo:Então, sim, parece que esses binários estão procurando por um
GLIBC_2.14
símbolo, o qual você presumivelmente está ausente no sistema. Como o svenx apontou, parece que ele está procurando omemcpy@@GLIBC_2.14
símbolo. Mais informações sobre o motivo pelo qualmemcpy
foi fornecida uma nova versão são descritas neste relatório de bug .A instalação de uma nova versão do
glibc
sistema de destino deve corrigi-la. Se você quiser tentar reconstruir o binário para continuar trabalhando na versão antigaglibc
, tente truques como o listado aqui . Talvez você também possa se dar bem com um calço que apenas fornece a versão específica domemcpy
símbolo que você precisa, mas que pode ser um pouco hacky.Depois de ler sua atualização : você está certo, esse não foi o seu problema. Mas acho que encontrei: o seu binário está solicitando o intérprete
/lib/ld-linux-x86-64.so.2
, que não existe nos sistemas Ubuntu 12.04:Embora
ldd
soubesse encontrá-lo/lib64
, suponho que o kernel não saiba disso quando tenta executar o binário e não consegue encontrar o intérprete solicitado do arquivo. Você pode tentar executá-lo manualmente através do intérprete:Não tenho 100% de certeza de que isso está funcionando corretamente - no meu sistema, a execução
gcc
dessa maneira gera uma falha de segmentação. Mas isso é pelo menos um problema diferente.fonte
:(
/lib64
amd64, e aparentemente o Arch corrige manualmente suas fontes gcc para mudar isso, garantindo assim a incompatibilidade com todas as outras distribuições Linux disponíveis. Veja os comentários deste relatório de bug para o seu raciocínio bizarro. Para mim, isso seria um sinal de alerta claro para ficar longe do Arch Linux.patchelf
funcionou para eles.Seu problema é uma variante da mensagem Obtendo "Não encontrado" ao executar um binário de 32 bits em um sistema de 64 bits : você tem um executável que menciona um carregador dinâmico que não existe.
No seu caso, o carregador dinâmico
/lib/ld-linux-x86-64.so.2
existe, mas em um local diferente/lib64/ld-linux-x86-64.so.2
. A maneira mais simples de fazer seus programas funcionarem seria criar um link simbólico:fonte