web-dev-qa-db-fra.com

Que signifie -fPIC lors de la création d'une bibliothèque partagée?

Je connais le '-fPIC 'L'option a quelque chose à voir avec la résolution des adresses et l'indépendance entre les modules individuels, mais je ne suis pas sûr de ce que cela signifie vraiment. Peux-tu expliquer?

103
Sasha

PIC signifie Position Independent Code

et pour citer man gcc:

Si pris en charge pour la machine cible, émettez un code indépendant de la position, adapté à la liaison dynamique et évitant toute limite sur la taille de la table de décalage globale. Cette option fait une différence sur le m68k, PowerPC et SPARC. Le code indépendant de la position nécessite un support spécial et ne fonctionne donc que sur certaines machines.

utilisez-le lorsque vous créez des objets partagés (* .so) sur les architectures mentionnées.

56
sean riley

f est le préfixe gcc pour les options qui "contrôlent les conventions d'interface utilisées dans la génération de code"

Le PIC signifie "Position Independent Code", c'est une spécialisation du fpic pour m68K et SPARC.

Edit: Après avoir lu la page 11 du document référencé par 0x6adb015 , et le commentaire de coryan, j'ai fait quelques changements:

Cette option n'a de sens que pour les bibliothèques partagées et vous dites au système d'exploitation que vous utilisez une table de décalage globale, GOT. Cela signifie que toutes vos références d'adresse sont relatives au GOT, et le code peut être partagé entre plusieurs processus.

Sinon, sans cette option, le chargeur devrait modifier lui-même tous les décalages.

Inutile de dire que nous utilisons presque toujours -fpic/PIC.

27
Mark Beckwith

man gcc dit:

 - fpic 
 Générez un code indépendant de la position (PIC) adapté à une utilisation dans une bibliothèque 
 partagée, si pris en charge pour la machine cible. Ce code accède à toutes les adresses constantes 
 Via une table de décalage globale (GOT). Le chargeur dynamique 
 Résout les entrées GOT au démarrage du programme (le chargeur dynamique 
 Ne fait pas partie de GCC; il fait partie du système d'exploitation). Si 
 La taille GOT pour l'exécutable lié dépasse une taille maximale spécifique à la machine 
, Vous obtenez un message d'erreur de l'éditeur de liens indiquant 
 Que -fpic ne fonctionne pas; dans ce cas, recompilez avec -fPIC à la place. 
 (Ces maximums sont 8k sur le SPARC et 32k sur le m68k et RS/6000. 
 Le 386 a aucune limite.) 
 
 Le code indépendant de la position nécessite un support spécial, et donc 
 ne fonctionne que sur certaines machines. Pour le 386, GCC prend en charge PIC pour le système 
 V mais pas pour le Sun 386i. Le code généré pour le 
 IBM RS/6000 est toujours indépendant de la position. 
 
 - fPIC 
 S'il est pris en charge pour la machine cible , émet un code indépendant de la position, 
 adapté à la liaison dynamique et évite toute limite sur la taille de 
 la table de décalage globale. Cette option fait une différence sur le m68k 
 et le SPARC . 
 
 Le code indépendant de la position nécessite un support spécial, et donc 
 Ne fonctionne que sur certaines machines. 
16
Nikolai Fetissov