executando arquivo binário: arquivo não encontrado

9

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 ~/mingw64diretó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/asme 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/asme 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 -vUbuntu 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.

rubenvb
fonte
é apenas um erro de digitação ou você está realmente tentando executar '~ / mingw64 / x86_64-w64-mingw32 / como' ... está faltando a pasta 'bin'.
Triplicou em 11/08/12
@ tripledes type e corrigido.
rubenvb
estranho, apenas tentei baixar, untar sob o meu ~ e recebo o resultado esperado. Você poderia fornecer um ls -l ~ / mingw64 / x86_64-w64-mingw32 / bin / as?
Triplicou em 11/08/12
11
Poderia ser uma incompatibilidade de versão libc? Tente executar "objdump -p <caminho / para / como>" e inspecione a seção "Referências de versão". Pode parecer que depende do GLIBC_2.14, que pode ser considerado relativamente novo. Qual é a sua versão do sistema? "readelf -a <caminho / para / como> | menos" e grep para GLIBC, você verá que ele está usando o memcpy da 2.14. Não sei por que a versão varia tanto entre diferentes chamadas de biblioteca.
svenx

Respostas:

8

Se eu executar ldd -v asno meu sistema, recebo:

./as: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by ./as)
        linux-vdso.so.1 =>  (0x00007fff89ab1000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f1e4c81f000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1e4c498000)
        /lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f1e4ca6d000)

Então, sim, parece que esses binários estão procurando por um GLIBC_2.14símbolo, o qual você presumivelmente está ausente no sistema. Como o svenx apontou, parece que ele está procurando o memcpy@@GLIBC_2.14símbolo. Mais informações sobre o motivo pelo qual memcpyfoi fornecida uma nova versão são descritas neste relatório de bug .

A instalação de uma nova versão do glibcsistema de destino deve corrigi-la. Se você quiser tentar reconstruir o binário para continuar trabalhando na versão antiga glibc, 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 do memcpysí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:

$ readelf -a ./as | grep interpreter
      [Requesting program interpreter: /lib/ld-linux-x86-64.so.2]

Embora lddsoubesse 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:

$ pwd
/home/jim/mingw64/x86_64-w64-mingw32/bin
$ ./as --version
-bash: ./as: No such file or directory
$ /lib64/ld-linux-x86-64.so.2 ./as --version
GNU assembler (rubenvb-4.7.1-1-release) 2.23.51.20120808
Copyright 2012 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `x86_64-w64-mingw32'.

Não tenho 100% de certeza de que isso está funcionando corretamente - no meu sistema, a execução gccdessa maneira gera uma falha de segmentação. Mas isso é pelo menos um problema diferente.

Jim Paris
fonte
11
Seria bom, se fosse esse o caso. Veja atualização:(
rubenvb
Eu atualizei minha resposta.
Jim Paris
Uau OK. Esse tipo de merda. Não consigo pensar em uma maneira decente de solucionar esse problema (e continuar desenvolvendo o Arch). Você tem alguma idéia brilhante?
rubenvb
11
Na verdade não. O Arch está apenas sendo estúpido - o Padrão de Heirarquia do Sistema de Arquivos diz claramente que as bibliotecas devem estar no /lib64amd64, 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.
Jim Paris
11
Dito isto, você pode alterar a localização do intérprete usando o patchelf . Consulte esta postagem para outra pessoa que está enfrentando esse problema, que alegou que patchelffuncionou para eles.
Jim Paris
0

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.2existe, 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:

ln -s ../lib64/ld-linux-x86-64.so.2 /lib/
Gilles 'SO- parar de ser mau'
fonte
bem, como este é um pacote destinado à redistribuição, esse link simbólico não está realmente no meu controle. Eu pensei que os binários Linux seriam mais portáteis ... acho que não.
rubenvb