Un fichier signalé comme «pas un exécutable dynamique» par «ldd» dépend-il d'autres bibliothèques?

9

Je m'assure juste d'avoir bien compris - j'appelle

ldd /path/to/executable

et il renvoie "pas un exécutable dynamique". Cela signifie qu'il ne dépend pas d'autres bibliothèques, n'est-ce pas? Si oui, cela signifie-t-il qu'il peut être transféré vers une autre boîte Ubuntu sans se soucier des dépendances?

Jason
la source

Réponses:

3

Exact, mais il y a quelque chose à prendre en compte.

Depuis la lddpage de manuel:

ldd ne fonctionne pas sur les bibliothèques partagées a.out.

ldd ne fonctionne pas avec certains programmes a.out extrêmement anciens qui ont été construits avant que le support ldd ne soit ajouté aux versions du compilateur. Si vous utilisez ldd sur l'un de ces programmes, le programme tentera de s'exécuter avec argc = 0 et les résultats seront imprévisibles.

Eric Carvalho
la source
3
Une autre raison peut être que le binaire a été construit pour un système 32 bits mais que vous le vérifiez sur un système 64 bits.
Ferdinand Prantl
@FerdinandPrantl S'il est construit pour 32 bits, lddimprime toujours les dépendances 32 bits.
Calmarius
@Calmarius qui n'est pas vrai, quand vous n'avez pas libgcc1 32 bits de base. Juste vérifié sur une nouvelle installation du serveur Ubuntu: vous devez installer libgcc1: i386 pour rendre ldd heureux pour les binaires 32 bits.
falstaff
1

@Calmarius est correct, cela se produit si vous considérez un exe 32 bits, sans même les bibliothèques 32 bits de base.

J'essaie de mettre à niveau mon système (une nouvelle installation d'Ubuntu 16.04, à partir du 12.04), je dois installer un ancien service 32 bits propitiatoire avserver, qui nécessite ia32-libs(n'est plus disponible). Ce moyen à la fois dpkget ne apt-getsont pas satisfaits (quoi que je fasse, il me pousse à apt-get -f install, et si je lance cela, il insiste pour que je désinstaller le package de service), et mon service ne démarre pas.

Pour prouver que cela est dû aux bibliothèques 32 bits manquantes, j'ai monté mon ancien système (Ubuntu 12.04, avec ia32-libset bibliothèques 32 bits) /sda2. Assurer /opt(contenant mon binaire 32 bits) est monté dans /sda2/opt, je peux chroot /sda2et lddpuis fonctionne comme prévu.

Pour résoudre ce problème, j'aurais pu installer manuellement tous les packages de bibliothèque dépendants avec: i386 (arch). Cependant, j'ai décidé plutôt que d'essayer de comprendre quelles étaient mes dépendances, j'ai installé wine (qui est principalement en 32 bits, et installe donc les bibliothèques de base et une charge supplémentaire dont je n'ai pas vraiment besoin, mais je suis d'accord avec ça).

Pour corriger dpkget apt-get, j'ai édité /var/lib/dpkg/status, trouver le package pour mon service et supprimé ia32-libs. Maintenant dpkget apt-getheureux

Cela fait, lddrapporte joyeusement: - 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
la source
Installer wine est une astuce très astucieuse pour obtenir toutes les bibliothèques 32 bits dont vous avez besoin !!
psitae