Hängt eine von 'ldd' als "keine dynamische ausführbare Datei" gemeldete Datei von anderen Bibliotheken ab?

9

Ich stelle nur sicher, dass ich das richtig verstanden habe - ich rufe an

ldd /path/to/executable

und es gibt "keine dynamische ausführbare Datei" zurück. Dies bedeutet, dass es nicht von anderen Bibliotheken abhängt, richtig? Wenn ja, bedeutet dies, dass es auf eine andere Ubuntu-Box übertragen werden kann, ohne sich um Abhängigkeiten sorgen zu müssen?

Jason
quelle

Antworten:

3

Richtig, aber es gibt etwas zu berücksichtigen.

Aus der lddManpage:

ldd funktioniert nicht mit a.out gemeinsam genutzten Bibliotheken.

ldd funktioniert nicht mit einigen extrem alten a.out-Programmen, die erstellt wurden, bevor die ldd-Unterstützung zu den Compiler-Versionen hinzugefügt wurde. Wenn Sie ldd für eines dieser Programme verwenden, versucht das Programm, mit argc = 0 auszuführen, und die Ergebnisse sind unvorhersehbar.

Eric Carvalho
quelle
3
Ein weiterer Grund kann sein, dass die Binärdatei für ein 32-Bit-System erstellt wurde, Sie sie jedoch auf einem 64-Bit-System überprüfen.
Ferdinand Prantl
@FerdinandPrantl Wenn es für 32-Bit erstellt wurde, werden lddimmer noch die 32-Bit- Abhängigkeiten gedruckt.
Calmarius
@Calmarius, das ist nicht wahr, wenn Sie nicht über grundlegende 32-Bit-libgcc1 verfügen. Gerade bei einer neuen Ubuntu Server-Installation überprüft: Sie müssen libgcc1: i386 installieren, um ldd für 32-Bit-Binärdateien glücklich zu machen.
Falstaff
1

@Calmarius ist korrekt. Dies geschieht, wenn Sie eine 32-Bit-Exe ohne grundlegende 32-Bit-Bibliotheken in Betracht ziehen.

Ich versuche, mein System zu aktualisieren (eine Neuinstallation von Ubuntu 16.04 von 12.04). Ich muss einen alten versöhnenden 32-Bit-Dienst installieren avserver, der dies erfordert ia32-libs(nicht mehr verfügbar). Dies bedeutet beides dpkgund apt-getist unglücklich (was auch immer ich tue, es fordert mich dazu auf apt-get -f install, und wenn ich das ausführe, besteht es darauf, dass ich das Servicepaket deinstalliere), und mein Service wird nicht gestartet.

Um zu beweisen, dass dies auf fehlende 32-Bit-Bibliotheken zurückzuführen ist, habe ich mein altes System (Ubuntu 12.04 mit ia32-libsund 32-Bit-Bibliotheken) gemountet /sda2. Wenn /optich sicher /sda2/optbin, dass (mit meiner 32-Bit-Binärdatei) eingebunden ist , kann ich chroot /sda2und kann ldddann wie vorgesehen ausgeführt werden.

Um dies zu beheben, hätte ich alle abhängigen Bibliothekspakete manuell installieren können mit: i386 (arch). Ich habe mich jedoch entschieden, anstatt herauszufinden, was meine Abhängigkeiten waren, Wein zu installieren (der meistens 32-Bit ist, und so die Basisbibliotheken und eine Menge mehr zu installieren, die ich nicht wirklich brauche, aber damit bin ich einverstanden).

Zum Reparieren dpkgund apt-getBearbeiten habe /var/lib/dpkg/statusich das Paket für meinen Dienst gefunden und entfernt ia32-libs. Jetzt dpkgund apt-getsind glücklich

Das getan, lddberichtet glücklich: - 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
quelle
Die Installation von Wein ist ein sehr cleverer Trick, um alle 32-Bit-Bibliotheken zu erhalten, die Sie benötigen !!
Psitae