Lier une bibliothèque partagée à l'encontre d'une bibliothèque statique: doit la bibliothèque statique être compilées différemment que si une demande est de le lier?
Au moins sur Linux et Solaris, les bibliothèques statiques sont vraiment juste un tas de compilation .o jeté dans un seul gros fichier. Lors de la compilation d'une bibliothèque statique, généralement de l'-fpic drapeau est omis, de sorte que le code généré est dépendant de la position.
Maintenant dire que ma bibliothèque statique est B. j'ai construit et résultat .un fichier qui est vraiment juste une boule de l'ensemble de l'dépendant de la position .o fichiers. Maintenant, j'ai une bibliothèque partagée, j'aimerais construire, Une, et je veux un lien statique B. Lorsque je créer Un, naturellement, je vais utiliser l'option-fpic drapeau pour rendre le code indépendant de la position. Mais si je l'encontre de B, ne suis-je pas le mélange dépendant de la position et de la position de l'objet indépendant de fichiers?
J'ai beaucoup de texte à la réinstallation des erreurs, à moins que j'ai aussi spécifier -mimpure-texte, et je pense que cela peut-être la cause. Il semble que quand je compile une bibliothèque, j'ai vraiment besoin de le compiler 3 fois, une version partagée, une version statique et statique-qui-peut-être-utilisé-par-partagé-libs version. Suis-je le droit? Je pouvais continuer à utiliser -mimpure-texte, mais le g++ page de man dit que si vous n'avez que l'objet n'est pas réellement finir par être partagé (on ne sait pas si c'est tous les non partagé ou tout simplement de la statiquement parties, bien que, personne ne sait?).
- La question est correctement exposée, il "omet'
-fpic
dans le premier paragraphe, conduisant à l'dépendant de la position de code, puis l'utilise dans le deuxième paragraphe, conduisant à indépendant de la position du code.
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas à utiliser de PIC code dans les objets partagés (comme vous l'avez découvert, vous pouvez utiliser l'-mimpure-option de texte pour permettre à d').
Cela dit, les non-PIC code dans les objets partagés sont plus lourds. Avec le PIC de code, le texte des pages en mémoire sont juste direct à la mémoire des mappages des pages de texte sur le disque. Cela signifie que si plusieurs processus sont à l'aide de l'objet partagé, ils peuvent partager la page de mémoire.
Mais si vous n'avez pas de PIC de code, lorsque l'exécution de l'éditeur de liens charges de l'objet partagé, il devra appliquer les corrections pour les pages de texte. Cela signifie que tous les processus qui utilise l'objet partagé aura sa propre version d'une page de texte qui a une correction sur elle (même si l'objet partagé est chargé à la même adresse que la copie sur écriture seule remarque que la page a été modifiée et non pas qu'il a été modifié de la même façon).
Pour moi, la question importante est de savoir si vous allez avoir simultanément plusieurs processus en cours d'exécution que chaque chargement de l'objet partagé. Si vous le faites, il est certainement la peine de s'assurer que tous les code dans le PIC est.
Mais si que n'est pas le cas et un seul processus a pour objet partagé chargé, il n'est pas aussi critique.
Je fais la suite dans le lien de scène pour le partage de la bibliothèque d'objets de la version de bibliothèque statique: g++ -shared-o libshared.soi-Wl,--toute-archive-fPIC-lstatic -Wl,--no-ensemble d'archives. Depuis-tout-les liens vers les archives de chaque objet dans une liste (de) bibliothèques statiques (de la forme libstatic.a) je crois précédente que (liste) avec -fPIC est de toutes les OP ont besoin de faire.
Comme une approche alternative, navire, deux bibliothèques: l'un et l'statique que vous créez un lien contre la aux côtés. Ils devraient être en lien dans l'exécutable final correctement.