¿Hay alguna manera de determinar qué paquetes o bibliotecas deben cargarse para admitir un ejecutable?

11

Hay un ejecutable que quiero instalar en una computadora que no puedo recompilar y que no se creó como un paquete, y quiero descargar las bibliotecas que requiere para ejecutarlos.

A continuación se muestra parte de la salida que se ejecuta ldden él

libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)
libcairo.so.2 => /usr/lib/i386-linux-gnu/libcairo.so.2 (0xb6f64000)
libatk-1.0.so.0 => /usr/lib/i386-linux-gnu/libatk-1.0.so.0 (0xb6f43000)
libsqlite3.so.0 => /usr/lib/i386-linux-gnu/libsqlite3.so.0 (0xb6e9e000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6cf4000)
/lib/ld-linux.so.2 (0xb786e000)
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb6cd3000)
libgio-2.0.so.0 => /usr/lib/i386-linux-gnu/libgio-2.0.so.0 (0xb6b7c000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb6b4f000)

¿Existe alguna herramienta que pueda usar esta información para seleccionar qué paquetes deben descargarse o, mejor aún, extraer solo las bibliotecas enumeradas y sus dependencias, para minimizar el uso del disco? El sistema se ejecuta en una máquina virtual sin cabeza y el programa se mostrará a través de VNC.

Aunque sospecho que un escritorio de gráficos completo proporcionará la mayoría de las bibliotecas necesarias, quiero descargar solo las bibliotecas necesarias, sus dependencias y la cantidad suficiente del paquete X Windows para admitirlo.

vfclists
fuente
1
Que sistema operativo Los paquetes y sus nombres, así como el administrador de paquetes cambian entre distribuciones (y esto supone que está ejecutando algún tipo de Linux).
terdon
Es Debian y Ubuntu en este caso
vfclists
En ese caso, mi respuesta debería funcionar para usted.
terdon
De hecho, estoy a punto de probarlo, con retraso. Simplemente lo olvidé y solo hice una pregunta similar que hizo que esta se mostrara como la pregunta relacionada principal, LOL
vfclists

Respuestas:

14

No ha dicho qué sistema operativo está utilizando, por lo que asumiré Linux y usaré Debian como ejemplo. La respuesta rápida a su pregunta es no, que yo sepa. Sin embargo, esta podría ser una solución útil:

ldd your_prog | awk '{print $1}' | sed 's/\..*//' | 
  while read n; do echo "----- $n ----"; apt-cache search ^$n; done

Esto analizará la lddsalida y luego se ejecutará apt-cache(reemplace eso con el equivalente para su sistema operativo) para buscar en los repositorios paquetes cuyo nombre y descripción contengan la primera parte del nombre de la biblioteca devuelta por ldd.

Esto no los encontrará a todos y dará demasiados resultados para algunos (como libc), pero podría ser útil.


@FaheemMitha señaló que apt-filepodría ser una mejor manera. Por ejemplo:

ldd /bin/bash | awk '/=>/{print $(NF-1)}'  | 
 while read n; do apt-file search $n; done |
  awk '{print $1}' | sed 's/://' | sort | uniq

Eso devolverá una lista de nombres de paquetes que proporcionan las bibliotecas vinculadas.

terdon
fuente
1
apt-file searchen el archivo real en el lado derecho de la flecha podría ser más efectivo.
Faheem Mitha
@FaheemMitha muy buen punto, gracias. Respuesta editada.
terdon
¿Cómo se puede ajustar el comando para probar la existencia de la biblioteca en el sistema para encontrar aquellos que necesitan ser descargados? Creo que la pregunta que hice recientemente está más en esa línea. Estoy pidiendo que se vuelva a abrir.
vfclists
@vfclists realmente no vale la pena, solo apt-get installse ignorarán todos los que ya estén instalados.
terdon
La razón es crear una máquina virtual sin bibliotecas superfluas para descargas rápidas. Las instalaciones de paquetes contienen muchos elementos innecesarios y solo necesito los archivos de la biblioteca y sus dependencias requeridas por los ejecutables. También me da la oportunidad de perfeccionar mis habilidades de bash y Linux. Sin pitón.
vfclists
3

La respuesta de @terdon es excelente, pero es aún más fácil hacer esto usando, a dpkg-querydiferencia de lo que apt-fileestá instalado por defecto en los sistemas Debian.

ldd /bin/bash | awk '/=>/{print $(NF-1)}' | while read n; do dpkg-query -S $n; done | sed 's/^\([^:]\+\):.*$/\1/' | uniq

Esto produce una lista de paquetes.

jcoffland
fuente
1

Su mejor opción es encontrar un paquete que realmente respalde su distribución. Pero si eso no va a funcionar para ti, entonces sé otra manera.

Ejecute ldd como lo hizo, luego instale manualmente esas dependencias.

Por ejemplo libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)

Para mí significaría instalar apt-get install libpango:i386y rezar para que la versión en Debian inestable fuera lo suficientemente buena.

Tendría que pasar por cada línea de ldd, Google, buscar en sus repositorios disponibles y, básicamente, tener suerte. Luego instálelos uno por uno. Hasta que el programa realmente se ejecute. Sin embargo, ldd solo funcionará para programas "simples". Los programas que llaman complementos o que ejecutan código arbitrario son una cuestión completamente diferente. Para aquellos que necesitará ejecutar desde la consola, y corregir los bloqueos / errores a medida que ocurren.

Dicho esto, un ejecutable solo binario es terriblemente difícil de mantener. Es posible que desee considerar el uso de otra cosa. Si su distribución está un poco por delante o un poco por detrás del sistema que creó ese ejecutable, es posible que nunca lo haga funcionar.

coteyr
fuente