9
votes

Dans quel ordre les bibliothèques partagées LD-LINUX.SO

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.

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?

Comment pourrais-je déterminer la commande de recherche par programme sans appeler des programmes externes tels que LDD?


0 commentaires

3 Réponses :


3
votes

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 GCC . (J'ai appris depuis longtemps pour toujours placer -lm 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.)

Modifier

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.)

/usr/include/linux/elf.h a tous les TYPEDFS.


1 commentaires

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é.



11
votes

de http://www.muppetlabs.com/~breadbox/software/elf .txt (comme mentionné par Sarnold):

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.


0 commentaires

-1
votes

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é.

Voici le script

EDIT: Notez que le script utilise LDD, peut toujours être utile; -) xxx


1 commentaires

La question dit "sans appeler des programmes externes comme LDD". Votre programme appelle un programme externe, nommément LDD.