Lorsque LD-Linux résout un symbole, il effectue des recherches dans les bibliothèques partagées dans un ordre particulier et s'arrête lorsqu'il trouve une bibliothèque partagée avec un symbole correspondant. P>
Qu'est-ce qui détermine la commande qu'il recherche dans les bibliothèques? Fait-il une différence si le symbole non résolu est dans le programme principal ou dans une autre bibliothèque partagée? P>
Comment pourrais-je déterminer la commande de recherche par programme sans appeler des programmes externes tels que LDD? P>
3 Réponses :
Ce livre http://www.network-theory.co .uk / docs / gccintro / gccintro_18.html suggère un ordre de gauche à droite comme indiqué sur la ligne de commande code> GCC code>. (J'ai appris depuis longtemps pour toujours placer aha, merci pour la mise à jour. Vous allez avoir besoin d'analyser vous-même l'elfe. Recherchez des "dépendances d'objet partagées" et "dt_rpath" dans http: //www.muppetlabs .COM / ~ BADBOX / LOGICIEL / ELF.TXT . (Je recommande également http://www.muppetlabs.com/~breadbox/ Software / Teensy.html , mais il est moins applicable à votre problème - juste une lecture amusante.) p>
-lm code> comme la toute dernière bibliothèque dans une liste de bibliothèques pour lier, mais j'ai aussi longtemps oublié la raison de la cargaison pour cela.) p>
/usr/include/linux/elf.h code> a tous les TYPEDFS. p>
Merci, mais j'en ai besoin de travailler avec des programmes arbitraires, même si je ne connais pas la ligne de liaison, le programme a été compilé.
de http://www.muppetlabs.com/~breadbox/software/elf .txt (comme mentionné par Sarnold): P>
Lorsque vous résolvez des références symboliques, La liaison dynamique examine le symbole Tables avec une première recherche de largeur. C'est-à-dire, il regarde d'abord le symbole Tableau du programme exécutable elle-même, alors aux tables de symboles de les entrées DT_NEED (dans l'ordre), puis aux secondes entrées DT_Needed, et ainsi de suite. p> blockQuote>
En réalité, l'ordre de liaison peut être déduit en utilisant LDD; Si la bibliothèque1 est dans la ligne de commande Linker avant la bibliothèque2, alors LDD affichera la bibliothèque1 avant la bibliothèque2
maintenant basée sur cela, j'ai écrit un bref script Python qui affiche les bibliothèques partagées dans la commande de liaison - il effectue une première recherche sur toutes les dépendances affichées par LDD (Pour un exécutable donné. p>
Voici le script p>
EDIT: Notez que le script utilise LDD, peut toujours être utile; -) p>
La question dit "sans appeler des programmes externes comme LDD". Votre programme appelle un programme externe, nommément LDD.