Je sais que l’option ” -fPIC
” 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?
PIC signifie code indépendant de position
et pour citer l’ man gcc
:
Si elle est prise en charge par la machine cible, émettez un code indépendant de la position, adapté à la liaison dynamic et évitant toute limite de taille de la table de décalage globale. Cette option fait la différence sur le m68k, le PowerPC et le 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 construisez des objects partagés (* .so) sur les architectures mentionnées.
Le 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 apporté quelques modifications:
Cette option n’a de sens que pour les bibliothèques partagées et vous indiquez au système d’exploitation que vous utilisez une table de décalage global, GOT. Cela signifie que toutes vos références d’adresses sont relatives au GOT et que le code peut être partagé entre plusieurs processus.
Sinon, sans cette option, le chargeur devrait modifier tous les décalages proprement dits.
Inutile de dire que nous utilisons presque toujours -fpic / PIC.
man gcc
dit:
-fpic Générer un code indépendant de la position (PIC) adapté à une utilisation partagée bibliothèque, si elle est prise en charge pour la machine cible. Ce code accède à tous adresses constantes via une table de décalage globale (GOT). La dynamic le chargeur résout les entrées GOT au démarrage du programme (la dynamic loader ne fait pas partie de GCC; il fait partie du système d'exploitation). Si la taille GOT de l'exécutable lié dépasse une taille spécifique à la machine taille maximale, vous obtenez un message d'erreur de l'éditeur de liens indiquant que -fpic ne fonctionne pas; dans ce cas, recomstackr avec -fPIC à la place. (Ces maximums sont 8k sur le SPARC et 32k sur le m68k et le RS / 6000. Le 386 n'a pas de telle limite.) Le code indépendant de la position nécessite un support spécial, et par conséquent ne fonctionne que sur certaines machines. Pour le 386, GCC prend en charge le PIC pour Système V mais pas pour le Sun 386i. Code généré pour le IBM RS / 6000 est toujours indépendant de la position. -fpic Si la machine cible est prise en charge, émettez un code indépendant de la position, adapté pour la liaison dynamic et en évitant toute limite sur la taille de la table de compensation globale. Cette option fait la différence sur le m68k et le SPARC. Le code indépendant de la position nécessite un support spécial, et par conséquent ne fonctionne que sur certaines machines.