Question

ils semblent faire la même chose, sauf que le soutien « tous les systèmes » partagés à partir de la description de la documentation, et « que certains systèmes » soutien symbolique (on ne sait pas si ce sont les mêmes des systèmes):

  

-shared       Produire un objet partagé qui peut alors être lié à d'autres objets à   former un exécutable. Tous les systèmes   soutenir cette option. pour prévisible   les résultats, vous devez également préciser la   même ensemble d'options qui ont été utilisées pour   générer un code (-fpic, -fPIC, ou d'un modèle   sous-options) lorsque vous spécifiez cette   Option 1]

     

-symbolic       Liez les références aux symboles globaux lors de la construction d'un objet partagé. Prévenir   au sujet des références non résolues   (Sauf contrordre par l'éditeur de lien   Option -Xlinker -Z -Xlinker defs).   Seuls quelques systèmes prennent en charge cette   option.

Je soupçonne que la différence est dans la partie « Produire un objet partagé qui peut alors être lié à d'autres objets pour former un exécutable », mais cela ressemble à quelque chose qui est vrai de toute bibliothèque. Est-ce que cela signifie que le résultat objet partagé peut être lié de manière statique aussi?

Était-ce utile?

La solution

Résumé: -symbolic empêche intercalant la fonction objet intra-partagée

Établir des liens avec des objets partagés permet une fonctionnalité appelée intercalation de symbole. L'idée est que vous pouvez une nouvelle définition « interposer » d'un symbole mondial de sorte qu'il est appelé plutôt que la définition de « régulière ».

Un exemple classique est malloc (). Dans le cas, malloc () la plus courante est définie dans libc. Mais vous pouvez interposer votre propre version de malloc en chargeant une bibliothèque qui définit ce symbole avant de charger libc (la plupart des linkers d'exécution vous permettent d'utiliser LD_PRELOAD à des bibliothèques spécifiques pour charger avant l'exécutable).

Par défaut, toute fonction dans un objet partagé qui n'est pas statique est un symbole mondial. À cause de cela, toutes les fonctions de l'objet partagé peuvent être interposés sur. Considérons un scénario dans lequel un objet partagé a une fonction High_level () et low_level () et High_level () appelle low_level () dans le cadre de celui-ci est mise en œuvre et ni High_level () ni low_level () sont des fonctions statiques.

Il est possible d'intercaler low_level () de telle sorte que High_level () appelle un low_level () d'un autre objet partagé.

C'est là -symbolic entre en jeu. Lorsque vous créez votre objet partagé, l'éditeur de liens verra que low_level () est défini dans le même objet partagé comme High_level () et lier l'appel telle qu'elle ne peut être interposé sur. De cette façon, vous savez que tous les appels d'une fonction dans votre objet partagé à un autre dans le même objet partagé ne seront jamais interposés sur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top