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.


é 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.


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/

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.