2009-07-22 3 views
10

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?

+0

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

+0

@Lothar Non, il ne l'exige pas en général. Mélangez-vous des objets compilés avec et sans '-fPIC'? – ephemient

Répondre

9

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.

+0

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

+0

@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

Questions connexes