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, ela não funciona e não sei 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 é executada, "ldd ./uclsyn_linux" retorna uma lista inteira de dependências. Encontrei os pacotes que fornecem essas bibliotecas compartilhadas e todas parecem estar instaladas.
Pacotes necessá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 Feb 21 12:50:49 UTC 2013 i686 i686 i386 GNU / Linux
strace ./uclsyn
? Isso pode nos dar uma dica sobre o que está faltando primeiro.strace
um programa não vinculado corretamente.Respostas:
Eu só tive o problema com uma solução binária de 32 bits:
apt-get install gcc-multilib
fonte
O erro aqui ocorreu devido à falta de RAM suficiente no VirtualMachine. A execução
strace ./programname
indicava que o programa estava sendo morto exatamente como 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
Houve algumas respostas úteis de outras pessoas, como @slm, que forneceu comandos úteis para verificar se cada uma das bibliotecas existia, e @lgeorget, que sugere tentar o
strace
comando.fonte
Você pode postar algumas das bibliotecas às quais ele se vincula (do sistema original)? Você pode precisar instalar algumas bibliotecas ausentes.
Normalmente, em um sistema CentOS, é apenas uma questão de executar um comando yum da seguinte forma:
Você pode trabalhar ao contrário do sistema original da seguinte maneira:
Nesse saída você pode ver onde a minha cópia
/bin/ls
está pegando as bibliotecas compartilhadas .so por exemplo digamos,librt.so.1
que acontece a ser localizado aqui:/lib64/librt.so.1
.Sabendo disso, no sistema original, você pode executar este comando para descobrir qual pacote fornece esta biblioteca:
Então o pacote é chamado
glibc-2.13-2.x86_64
. Então, para instalá-lo, você faria o seguinte:fonte
yum install <package>
aqueles pacotes que você referenciou na sua pergunta?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 mais compatíveis ou disponíveis.
Neste ponto, você tem duas opções. Se você puder recompilar (o que duvido, se entendi bem o seu caso), ele será executado porque será vinculado novamente a bibliotecas compatíveis. Caso contrário, você pode tentar criar um tipo de sandbox, uma VM executando com uma versão antiga das bibliotecas GNU, por exemplo, para executar o aplicativo.
fonte
file
. E mensagens comoNo package xyz found
sugerem que as bibliotecas necessárias não estão mais disponíveis (pelo menos não do jeito que estavam, nos mesmos pacotes). É por isso que sugiro reconstruir o programa, se possível, ou executá-lo em um sistema em que se sabia que funcionava, com bibliotecas antigas.tente
readelf -l uclsyn_linux
Solicitar intérprete de programa informará o que está faltando.fonte
readelf -l <file>
contra um arquivo com o mesmoldd
comportamento (not a dynamic executable
), mas não vejo nada imediatamente indicando uma biblioteca ausente. VejoElf file type is EXEC (Executable file)
,Entry point
,Program Headers
eSection to Segment mapping
. O que exatamente devo procurar na saída?No Arch Linux , se o arquivo for elf de 32 bits, você poderá instalar lib32-gcc-libs (do repositório multilib) para resolver o problema.
fonte