ldd informa que meu aplicativo “não é um executável dinâmico”

16

Eu tenho um aplicativo de 32 bits (chamado uclsyn) que recebi de um professor de astronomia. Eu consegui executá-lo no CentOS há um ano, mas agora, quando estou configurando uma nova VM do CentOS, ele não funciona e não consigo descobrir por quê. Ele continua voltando com "Killed".

Esta é a troca na linha de comando:

$ ./uclsyn_linux
Killed

$ ldd ./uclsyn_linux
not a dynamic executable

$ file ./uclsyn_linux
uclsyn_linux: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped

Na máquina que está rodando, o "ldd ./uclsyn_linux" retorna toda uma lista de dependências. Eu encontrei os pacotes que fornecem essas bibliotecas compartilhadas, e todos parecem estar instalados.

Pacotes obrigatórios

  • libSM-1.1.0-7.1.el6.i686
  • libX11-1.3-2.el6.i686
  • libgcc-4.4.6-3.el6.i386
  • glibc-2.12-1.47.el6_2.9.i686
  • libuuid-2.17.2-12.4.el6.i686
  • libXau-1.0.5-1.el6.i686
  • Há também um monte de bibliotecas locais para o aplicativo que eu verifiquei e já estão instaladas.

Meu ambiente

CentOS em execução no VirtualBox

uname -a : Linux localhost.localdomain 2.6.32-358.el6.i686 # 1 SMP qui 21 fev 12:50:49 UTC 2013 i686 i686 i386 GNU / Linux

    
por Carl 08.05.2013 / 02:11

5 respostas

8

O erro aqui foi devido a não ter RAM suficiente no VirtualMachine. A execução de strace ./programname indicou que o programa estava sendo eliminado assim que começou a ser executado, antes de carregar qualquer uma das bibliotecas. Aumentar a quantidade de RAM disponível garantiu que o programa funcionasse.

Respostas úteis

Havia algumas respostas úteis de outras pessoas, como @slm, que forneciam comandos úteis para verificar se cada uma das bibliotecas existia e @lgeorget, que sugeria testar o comando strace .

    
por 08.05.2013 / 16:33
9

Acabei de ter o problema com uma solução binária de 32 bits:

apt-get install gcc-multilib

$ uname -a
Linux bla 2.6.32-028stab094.3 #1 SMP Thu Sep 22 12:47:37 MSD 2011 x86_64 GNU/Linux
    
por 21.01.2014 / 00:49
4

Você pode postar algumas das bibliotecas às quais ele faz link (do sistema original)? Você só precisa instalar algumas bibliotecas ausentes.

Normalmente, em um sistema CentOS, é apenas uma questão de executar um comando do yum da seguinte forma:

yum install <package name>

Você pode trabalhar de trás para frente a partir do sistema original da seguinte forma:

$ ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007fff519ff000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x00000034e8e00000)
    librt.so.1 => /lib64/librt.so.1 (0x00000034e8a00000)
    libcap.so.2 => /lib64/libcap.so.2 (0x0000003d6fe00000)
    libacl.so.1 => /lib64/libacl.so.1 (0x00000034fae00000)
    libc.so.6 => /lib64/libc.so.6 (0x00000034e7200000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00000034e7a00000)
    /lib64/ld-linux-x86-64.so.2 (0x00000034e6e00000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00000034e7e00000)
    libattr.so.1 => /lib64/libattr.so.1 (0x00000034f7600000)

Nessa saída, você pode ver onde minha cópia de /bin/ls está pegando as bibliotecas .so compartilhadas, por exemplo, librt.so.1 , que por acaso está localizada aqui: /lib64/librt.so.1 .

Sabendo disso, no sistema original, você pode executar este comando para descobrir qual pacote fornece essa biblioteca:

$ rpm -qf /lib64/librt.so.1
glibc-2.13-2.x86_64

Portanto, o pacote é chamado de glibc-2.13-2.x86_64 . Então, para instalá-lo, você faria isso:

$ sudo yum install glibc-2.13-2.x86_64
    
por 08.05.2013 / 04:42
2

A resposta está na sua pergunta: você tenta executar um aplicativo que foi compilado para o GNU / Linux há um ano e tenta executá-lo com novas bibliotecas, que podem não ser compatíveis ou estarem disponíveis.

Neste ponto, você tem duas escolhas. Se você puder recompilá-lo (o que duvido, se eu entender bem o seu caso), ele será executado porque será vinculado a bibliotecas compatíveis. Caso contrário, você poderia tentar construir um tipo de sandbox, uma VM rodando com uma versão antiga de bibliotecas GNU, por exemplo, para executar o aplicativo.

    
por 08.05.2013 / 02:17
0

tente readelf -l uclsyn_linux O solicitante do programa solicitará o que você está perdendo.

    
por 10.04.2017 / 15:56