Je prépare un makefile pour un projet sur lequel je travaille. J'ai un exécutable et une bibliothèque partagée dans le projet. Les deux utilisent certains des mêmes fichiers source qui sont compilés séparément dans des fichiers objets. Pour pouvoir utiliser ces objets dans la bibliothèque partagée, j'ai besoin d'utiliser l'indicateur -fPIC (code indépendant de la position) dans gcc. Y a-t-il des implications de compiler des objets avec -fPIC qui sont utilisés dans un exécutable?Quelles sont, le cas échéant, les implications de la compilation d'objets avec l'indicateur gcc -fPIC s'ils sont utilisés dans les exécutables?
Répondre
La compilation de code indépendant de la position lorsque cela n'est pas nécessaire est un ralentissement des performances sur certaines plates-formes (notamment l'architecture x86 affaibli par le registre, car PIC supprime un registre qui peut être utilisé plus librement). ne devrait pas avoir d'effets préjudiciables autrement. En outre, il est même possible de créer un exécutable indépendant de la position (-fPIE
) construit uniquement avec du code indépendant de la position. Cela étant dit, libtool peut produire automatiquement des objets PIC et non-PIC pour chaque fichier source que vous compilez, et il devrait être facile de faire la même chose même dans un système de construction sans intégration de libtool.
Aucun PIC ne supprime un registre sur x86. Cette CPU n'a pas de code de position indirecte et ajoute donc toujours une indirection aux données/fonctions. Vous pouvez oublier complètement -fPIC sur x86 car si vous ne le spécifiez pas, vous obtenez du code rapide et l'éditeur de liens duplique le segment de code pour chaque exécutable. – Lothar
@Lothar Sur x86-32, selon le compilateur, PIC enlève un registre. GCC avant les réserves 5,0% ebx, ce qui le rend non disponible pour un usage général. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54232 – ephemient
- 1. Quelles sont les implications de la suppression d'un compte d'utilisateur?
- 2. Quelles sont les implications de l'utilisation de code dangereux
- 3. Quelles sont les fonctionnalités de C++ 0x qui resteront à coup sûr (le cas échéant)?
- 4. Quelles sont les implications des connexions série semi-duplex?
- 5. Quelles sont les idées d'autres domaines sont utilisés par les programmeurs
- 6. Quels délégués (le cas échéant) définis localement sont mis en cache entre les appels de méthode?
- 7. Quelles sont les modifications empilables?
- 8. quelles sont les phases dans le processus de construction
- 9. Quelles sont les implications sur les performances d'accès à une valeur de registre Windows?
- 10. Quelles sont les implications pour rediriger les images derrière l'étiquette <image>?
- 11. Quelles sont les techniques pour limiter les dépendances de compilation dans les projets C++?
- 12. Quelles sont les implications de l'utilisation d'applications GPL django dans un projet django non-GPL?
- 13. Quelles sont les implications de l'exécution d'une base de données d'accès Microsoft en 2003 et 2007?
- 14. Quelles sont les chaînes vraiment dans .NET?
- 15. Où sont utilisés les algorithmes de gestion de la mémoire?
- 16. Motifs de conception: quels sont les nouveaux, où sont utilisés les modèles existants?
- 17. Comment savoir quelles optimisations sont activées dans gcc?
- 18. Quelles sont les règles d'appel du constructeur de la superclasse?
- 19. Quels sont les contrôles de flux les plus fréquemment utilisés pour gérer la communication de protocole?
- 20. Quelles sont les commandes importantes de Ruby?
- 21. Quelles sont les fonctionnalités cachées de Maven2?
- 22. Quels sont les algorithmes d'ordonnancement utilisés par le noyau Linux?
- 23. Quelles sont les valeurs valides de l'expression (uninitialized_bool? 1: 2)?
- 24. Quels sont les algorithmes utilisés par les SGBDR?
- 25. Quelles sont les alternatives "Pastie"? (installable)
- 26. Quelles sont les règles concernant les chemins httpHandler dans ASP.NET?
- 27. Quelles sont les affirmations ou NSAssert bon dans la pratique?
- 28. Apache Velocity: Quelles sont les variables disponibles dans les templates?
- 29. Quelles sont les ressources à connaître sur le droit d'auteur?
- 30. Quelles sont les alternatives pour CSharpOptParse?
On dirait que GCC7 nécessite maintenant tout ce qui a été compilé avec -fPIC. Au moins, je reçois n erreur et trouvé cette question dans la recherche de pourquoi je reçois l'erreur? – Lothar
@Lothar Non, il ne l'exige pas en général. Mélangez-vous des objets compilés avec et sans '-fPIC'? – ephemient