¿Un archivo reportado como "no un ejecutable dinámico" por 'ldd' depende de otras bibliotecas?

9

Solo asegurándome de que entendí bien, llamo

ldd /path/to/executable

y devuelve "no un ejecutable dinámico". Esto significa que no depende de otras bibliotecas, ¿correcto? Si es así, ¿significa que se puede transferir a otro cuadro de Ubuntu sin preocuparse por las dependencias?

Jason
fuente

Respuestas:

3

Correcto, pero hay algo a tener en cuenta.

Desde la página del lddmanual:

ldd no funciona en a.out bibliotecas compartidas.

ldd no funciona con algunos programas a.out extremadamente antiguos que se crearon antes de que se agregara soporte ldd a las versiones del compilador. Si usa ldd en uno de estos programas, el programa intentará ejecutarse con argc = 0 y los resultados serán impredecibles.

Eric Carvalho
fuente
3
Otra razón puede ser que el binario se creó para un sistema de 32 bits, pero lo está comprobando en un sistema de 64 bits.
Ferdinand Prantl
@FerdinandPrantl Si está construido para 32 bits, lddaún imprime las dependencias de 32 bits.
Calmarius
@Calmarius eso no es cierto, cuando no tienes libgcc1 básico de 32 bits. Recién verificado en una nueva instalación de Ubuntu Server: debe instalar libgcc1: i386 para que ldd esté contento con los binarios de 32 bits.
falstaff
1

@Calmarius es correcto, esto sucede si considera un exe de 32 bits, incluso sin bibliotecas básicas de 32 bits.

Estoy intentando actualizar mi sistema (una nueva instalación de Ubuntu 16.04, desde 12.04), tengo que instalar un antiguo servicio de 32 bits propiciatorio avserver, que requiere ia32-libs(ya no está disponible). Esto significa que ambos dpkgy apt-getestán descontentos (lo que haga, que me incita a apt-get -f install, y si funciono eso, insiste puedo desinstalar el paquete de servicios), y mi servicio no se iniciará.

Para demostrar que esto se debe a la falta de bibliotecas de 32 bits, he montado mi antiguo sistema (Ubuntu 12.04, con ia32-libsy bibliotecas de 32 bits) /sda2. Asegurándome /opt(que contiene mi binario de 32 bits) está montado /sda2/opt, puedo chroot /sda2y lddluego se ejecuta según lo previsto.

Para solucionar esto, podría haber instalado manualmente todos los paquetes de la biblioteca dependiente con: i386 (arch). Sin embargo, decidí en lugar de tratar de averiguar cuáles eran mis dependencias, instalé wine (que es principalmente de 32 bits, por lo que instala las bibliotecas básicas y una carga más que realmente no necesito, pero estoy de acuerdo con eso).

Para arreglar dpkgy apt-get, edité /var/lib/dpkg/status, encontrar el paquete para mi servicio, y lo eliminé ia32-libs. Ahora dpkgy apt-getson felices

Hecho esto, lddfelizmente informa: 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)

sibaz
fuente
¡Instalar wine es un truco muy inteligente para obtener todas las bibliotecas de 32 bits que necesita!
psitae