Um arquivo relatado como "não é um executável dinâmico" por 'ldd' depende de outras bibliotecas?


9

Apenas certificando-me de que entendi direito - eu ligo

ldd /path/to/executable

e retorna "não é um executável dinâmico". Isso significa que não depende de outras bibliotecas, correto? Em caso afirmativo, isso significa que pode ser transferido para outra caixa do Ubuntu sem se preocupar com dependências?

Respostas:


3

Correto, mas há algo a ser levado em consideração.

Na página de lddmanual:

O ldd não funciona em a.out bibliotecas compartilhadas.

O ldd não funciona com alguns programas a.out extremamente antigos que foram criados antes do suporte ao ldd ser adicionado às versões do compilador. Se você usar o ldd em um desses programas, o programa tentará executar com argc = 0 e os resultados serão imprevisíveis.


3
Outro motivo pode ser que o binário foi construído para um sistema de 32 bits, mas você o está verificando em um sistema de 64 bits.
Ferdinand Prantl

@FerdinandPrantl Se for construído para 32 bits, lddainda imprime as dependências de 32 bits.
Calmarius

@Calmarius que não é verdade, quando você não possui a libgcc1 básica de 32 bits. Acabei de verificar em uma nova instalação do Ubuntu Server: Você precisa instalar o libgcc1: i386 para deixar o ldd satisfeito com os binários de 32 bits.
21815 Falsaff

1

@Calmarius está correto, isso acontece se você considerar um exe de 32 bits, sem bibliotecas básicas de 32 bits.

Estou tentando atualizar meu sistema (uma nova instalação do Ubuntu 16.04, a partir de 12.04), tenho que instalar um antigo serviço de 32 bits propiciatório avserver, que requer ia32-libs(não está mais disponível). Isto significa tanto dpkge apt-getsão infelizes (o que quer que eu faça, leva-me a apt-get -f install, e se eu executar isso, ele insiste que eu desinstalar o pacote de serviços), e meu serviço não será iniciado.

Para provar que isso se deve a falta de bibliotecas de 32 bits, montei meu sistema antigo (Ubuntu 12.04, com ia32-libse bibliotecas de 32 bits) /sda2. Assegurando que /opt(contendo meu binário de 32 bits) esteja montado /sda2/opt, eu posso chroot /sda2e, em lddseguida, execute conforme o planejado.

Para corrigir isso, eu poderia ter instalado manualmente todos os pacotes de bibliotecas dependentes com: i386 (arch). No entanto, decidi, em vez de tentar descobrir quais eram minhas dependências, instalei o wine (que geralmente é de 32 bits e instala as bibliotecas básicas e uma carga maior do que realmente não preciso, mas estou de acordo com isso).

Para corrigir dpkge apt-get, editei /var/lib/dpkg/status, localizando o pacote para o meu serviço e removi ia32-libs. Agora dpkge apt-geté feliz

Feito isso, lddfelizmente relata: - root@withnail:/opt/<service path># ldd avserver linux-gate.so.1 => (0xf77a6000) libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf778f000) libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7772000) libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xf776b000) libresolv.so.2 => /lib/i386-linux-gnu/libresolv.so.2 (0xf7752000) libcrypt.so.1 => /lib/i386-linux-gnu/libcrypt.so.1 (0xf7720000) libktssl.so.1.0.0 => /opt/<service path>/libktssl.so.1.0.0 (0xf76cb000) libktcrypto.so.1.0.0 => /opt/<service path>/libktcrypto.so.1.0.0 (0xf756b000) libktz.so.1 => /opt/<service path>/libktz.so.1 (0xf7558000) librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xf754f000) libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf73d8000) libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7383000) libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7366000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf71af000) /lib/ld-linux.so.2 (0x565b1000)


Instalar o wine é um truque muito inteligente para obter todas as bibliotecas de 32 bits necessárias!
Psitae 12/09/19
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.