C'è un modo per determinare quali pacchetti o librerie devono essere caricati per supportare un eseguibile?


11

Esiste un eseguibile che voglio installare su un computer che non riesco a ricompilare che non è stato creato come pacchetto e che voglio scaricare le librerie necessarie per eseguirle.

Di seguito è riportata una parte dell'output eseguito lddsu di esso

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)

Esiste uno strumento in grado di utilizzare queste informazioni per selezionare quali pacchetti devono essere scaricati o meglio ancora estrarre solo le librerie elencate e le relative dipendenze, al fine di ridurre al minimo l'utilizzo del disco? Il sistema è in esecuzione su una VM senza testa e il programma verrà visualizzato tramite VNC.

Anche se sospetto che un desktop grafico completo fornirà la maggior parte delle librerie necessarie, voglio scaricare solo le librerie richieste, le loro dipendenze e quanto basta del pacchetto X Windows per supportarlo.


1
Quale sistema operativo? I pacchetti, i loro nomi e il gestore dei pacchetti cambiano tra le distribuzioni (e questo presuppone che tu stia eseguendo un qualche tipo di Linux).
terdon

In questo caso sono Debian e Ubuntu
vfclists

In tal caso, la mia risposta dovrebbe funzionare per te.
terdon

In effetti sto per provarlo, in ritardo. Mi sono semplicemente dimenticato di questo e ho appena fatto una domanda simile che ha fatto sì che questo mostrasse come la domanda principale correlata, LOL
vfclists

Risposte:


14

Non hai detto quale sistema operativo stai usando, quindi assumerò Linux e userò Debian come esempio. La risposta rapida alla tua domanda non è per quanto ne so. Questa potrebbe essere una soluzione utile però:

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

Ciò analizzerà l' lddoutput e quindi verrà eseguito apt-cache(sostituendolo con l'equivalente per il sistema operativo in uso) per cercare nei repository i pacchetti il ​​cui nome e descrizione contengono la prima parte del nome della libreria restituita da ldd.

Questo non li troverà tutti e darà troppi risultati per alcuni (come libc) ma potrebbe essere utile.


@FaheemMitha ha sottolineato che apt-filepotrebbe essere un modo migliore. Per esempio:

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

Ciò restituirà un elenco di nomi di pacchetti che forniscono le librerie collegate.


1
apt-file searchsul file effettivo sul lato destro della freccia potrebbe essere più efficace.
Faheem Mitha,

@FaheemMitha ottimo punto, grazie. Risposta modificata.
terdon

Come si può regolare il comando per verificare l'esistenza della libreria sul sistema al fine di trovare quelli che devono essere scaricati? Penso che la domanda che ho posto di recente sia più su questa linea. Sto chiedendo che venga riaperto.
vfclists

@vfclists non ne vale davvero la pena, solo apt-get installtutti loro e quelli già installati verranno ignorati.
terdon

Il motivo è creare una VM senza librerie superflue per download rapidi. Le installazioni di pacchetti contengono molti elementi non necessari e ho solo bisogno dei file di libreria e delle loro dipendenze che sono richieste dagli eseguibili. Mi dà anche la possibilità di affinare le mie abilità bash e Linux. Nessun pitone.
vfclists

3

La risposta di @ terdon è ottima, ma è ancora più facile farlo usando ciò dpkg-queryche diversamente apt-fileè installato di default sui sistemi Debian.

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

Questo produce un elenco di pacchetti.


1

La soluzione migliore è trovare un pacchetto che supporti effettivamente la tua distribuzione. Ma se questo non funzionerà per te, allora conosco solo un altro modo.

Esegui ldd come hai fatto, quindi installa manualmente tali dipendenze.

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

Per me significherebbe installare apt-get install libpango:i386e pregare che la versione in Debian instabile fosse abbastanza buona.

Dovresti passare attraverso ogni linea di ldd, Google, cercare nei tuoi repository disponibili e in pratica avere fortuna. Quindi installali uno per uno. Fino a quando il programma non verrà effettivamente eseguito. ldd funzionerà solo con programmi "semplici". I programmi che chiamano plugin o che eseguono codice arbitrario sono una questione diversa tutti insieme. Per quelli dovrai eseguire dalla console e correggere gli arresti anomali / errori non appena si verificano.

Detto questo, un eseguibile solo binario è orribilmente difficile da mantenere. Potresti prendere in considerazione l'utilizzo di qualcos'altro. Se la tua distribuzione è un po 'avanti, o un po' indietro rispetto al sistema che ha creato quel file eseguibile, potresti non riuscire mai a farlo funzionare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.