Y a-t-il un moyen simple et efficace de savoir qu'un J'ai besoin d'un programme avec une fonctionnalité quelque peu similaire comme Remarque: la lecture du code source du S'il n'est pas possible de savoir qu'un programme a des dépendances non satisfaites sans l'exécuter, il y a au moins un moyen de répertorier rapidement le fichier .so requis pour ce merci d'avance =) p> elf code> lié de manière dynamique est indispensable est absolu .SO pour qu'il fonctionne, tous de la à l'intérieur fort> d'un C / Programme C ++? P>
LDD code>, sans tenter d'exécuter le
elf code> pour découvrir les dépendances (remplies / non satisfaites) dans le système. Peut-être demander à l'utilitaire LD-LINUX.SO via une bibliothèque? (Je suis un débutant dans cette partie de Linux =) P>
ldd code> n'a pas été très utile pour mes intentions: il semble que
ldd code> est en train de faire un autre processus et d'exécuter le programme. p>
blockQuote>
elf code> Tout de l'intérieur de mon programme? p>
3 Réponses :
Avez-vous essayé Avoir une liste des bibliothèques requises est plus difficile, jetez un coup d'œil à dlopen code> fonction? Vous pouvez l'utiliser pour charger une bibliothèque dynamique (ou, pour votre cas, ckeck si une bibliothèque peut être chargée). P>
manipul_dynamic code> fonction sur Source de rétendement P>
Cette fonction est intéressante, je peux voir le RPATH et un autre paramètre .. Je vais enquêter plus loin, merci
Selon LD.SO (8) , réglage de la variable d'environnement ld_trace_chargé_Objects code> sur une chaîne non vide donnera
ldd code> - ressemblant à des résultats (au lieu d'exécuter la bibliothèque ou la bibliothèque normalement).
setenv("LD_TRACE_LOADED_OBJECTS", "1", 1);
FILE *ldd = popen("/lib/libz.so");
Oui, cela donnera exactement la même sortie que LDD (Eh bien, avec peut-être un couple supplémentaire d'env autres) en fait, LDD n'est rien d'autre que votre code .. mais bien sûr, cette solution est la même que celle de l'appelant LDD qui à son tour appellera votre code .. Je cherchais une autre solution, peut-être demandé à LD-Linux.so de manière plus directe.
.. et sans invoquer une coquille =)
Sans appeler une coquille est facile - juste Fork code> et
exécu code> (
tuyau code> Si vous souhaitez une sortie et
fdopen code> Si vous voulez vraiment un fichier
* code>) au lieu de
popen code>. Ceci est fondamentalement interroger
ld-linux.so code> sans avoir à du code dur quel i>
ld-linux.so code>.
Qu'en est-il d'utiliser pTrace () pour suivre tous les appels ouverts () pour trouver tout ce que le programme dépend de (Toutefois, la sortie comprend des fichiers, pas seulement des bibliothèques) peut-être filtrer la sortie par le préfixe du nom de fichier "/ lib "aide. P>
Avez-vous une bonne raison pour laquelle vous n'invoyez pas simplement l'utilitaire LDD et d'analyser sa sortie? Sous Linux, une telle technique est largement utilisée.
Je préférerais ne pas appeler la coquille pour exécuter autre chose que mon propre programme .. Outre, ce n'est pas très efficace pour la fourchette, démarrer une coquille, etc. Juste pour essayer si un exécutable fonctionnera par essai et erreurs. Mais oui, mais oui, mais oui, Je soupçonne que l'invoquant LDD est un bon choix standard.
Désolé, c'est un mythe. La fourchette n'est pas du tout chère de nos jours et la plupart des appels EXEC * () n'utilisent pas Shell pour exécuter un binaire. Il est facilement possible que vous tuez plus de temps en plongeant dans des internes LD-Linux par rapport aux frais de surcharge Fork () / Exec () pour toutes les invocations futures.