Un file segnalato come "non eseguibile dinamico" da 'ldd' dipende da altre librerie?


9

Mi sto solo assicurando di aver capito bene - chiamo

ldd /path/to/executable

e restituisce "non un eseguibile dinamico". Ciò significa che non dipende da altre librerie, giusto? In tal caso, significa che può essere trasferito su un'altra casella Ubuntu senza preoccuparsi delle dipendenze?

Risposte:


3

Corretto, ma c'è qualcosa da prendere in considerazione.

Dalla lddmanpage:

ldd non funziona su librerie condivise a.out.

ldd non funziona con alcuni programmi a.out estremamente vecchi creati prima dell'aggiunta del supporto ldd alle versioni del compilatore. Se usi ldd su uno di questi programmi, il programma tenterà di funzionare con argc = 0 e i risultati saranno imprevedibili.


3
Un altro motivo può essere che il binario è stato creato per un sistema a 32 bit ma lo si sta verificando su un sistema a 64 bit.
Ferdinand Prantl,

@FerdinandPrantl Se è costruito per 32 bit, lddstampa comunque le dipendenze a 32 bit.
Calmarius

@Calmarius non è vero, quando non hai libgcc1 di base a 32 bit. Appena verificato su una nuova installazione di Ubuntu Server: Devi installare libgcc1: i386 per rendere felice ldd per i binari a 32 bit.
Falsaff,

1

@Calmarius è corretto, questo accade se si considera un exe a 32 bit, senza nemmeno le librerie di base a 32 bit.

Sto tentando di aggiornare il mio sistema (una nuova installazione di Ubuntu 16.04, dalla 12.04), devo installare un vecchio servizio propiziatorio a 32 bit avserver, che richiede ia32-libs(non più disponibile). Questo mezzo sia dpkge apt-getsono infelici (qualunque cosa io faccia, mi spinge a apt-get -f install, e se corro che, insiste disinstalla il pacchetto di servizi), e il mio servizio non si avvia.

Per dimostrare che ciò dipende dalle librerie a 32 bit mancanti, ho montato il mio vecchio sistema (Ubuntu 12.04, con ia32-libse librerie a 32 bit) /sda2. Assicurarsi che /opt(contenente il mio binario a 32 bit) sia montato /sda2/opt, posso chroot /sda2e lddquindi funziona come previsto.

Per risolvere questo problema, avrei potuto installare manualmente tutti i pacchetti di librerie dipendenti con: i386 (arch). Comunque ho deciso piuttosto che cercare di capire quali fossero le mie dipendenze, ho installato wine (che è principalmente a 32 bit, quindi installa le librerie di base e un carico in più di cui non ho davvero bisogno, ma sto bene con quello).

Per riparare dpkge apt-get, ho modificato /var/lib/dpkg/status, trovando il pacchetto per il mio servizio e rimosso ia32-libs. Adesso dpkge apt-getsiamo felici

Fatto ciò, lddriporta felicemente: - 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)


Installare wine è un trucco molto intelligente per ottenere tutte le librerie a 32 bit di cui hai bisogno !!
psitae,
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.