6
votes

Linux / GCC: fonctionnalité LDD à partir d'un programme C / C ++

Y a-t-il un moyen simple et efficace de savoir qu'un elf lié ​​de manière dynamique est indispensable est absolu .SO pour qu'il fonctionne, tous de la à l'intérieur d'un C / Programme C ++?

J'ai besoin d'un programme avec une fonctionnalité quelque peu similaire comme LDD , sans tenter d'exécuter le elf 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 =)

Remarque: la lecture du code source du ldd n'a pas été très utile pour mes intentions: il semble que ldd est en train de faire un autre processus et d'exécuter le programme.

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 elf Tout de l'intérieur de mon programme?

merci d'avance =)


3 commentaires

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.


3 Réponses :


1
votes

Avez-vous essayé dlopen fonction? Vous pouvez l'utiliser pour charger une bibliothèque dynamique (ou, pour votre cas, ckeck si une bibliothèque peut être chargée).

Avoir une liste des bibliothèques requises est plus difficile, jetez un coup d'œil à manipul_dynamic fonction sur Source de rétendement


1 commentaires

Cette fonction est intéressante, je peux voir le RPATH et un autre paramètre .. Je vais enquêter plus loin, merci



8
votes

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");


3 commentaires

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 et exécu ( tuyau Si vous souhaitez une sortie et fdopen Si vous voulez vraiment un fichier * ) au lieu de popen . Ceci est fondamentalement interroger ld-linux.so sans avoir à du code dur quel ld-linux.so .



-1
votes

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.


0 commentaires