Quelle est la différence entre les paramètres gcc `-fpic` et` -fPIC`?

96

J'ai déjà lu la gccpage de manuel, mais je ne comprends toujours pas la différence entre-fpic et -fPIC. Quelqu'un peut-il l'expliquer, d'une manière très simple et claire?


Questions connexes:

Denilson Sá Maia
la source
1
Oui, la réponse n'est pas dans man gccmais dans info gcc, qui ont plus de documentation.
user2284570

Réponses:

110

http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

Utilisez -fPICou -fpicpour générer un code indépendant de la position. L'utilisation -fPICou la -fpicgénération d'un code indépendant de la position dépend de la cible. Le -fPICchoix fonctionne toujours, mais peut produire un code plus grand que -fpic(mnénomique pour se souvenir que PIC est dans un cas plus grand, donc il peut produire de plus grandes quantités de code). L'utilisation d' -fpicoption génère généralement un code plus petit et plus rapide, mais aura des limitations dépendant de la plate-forme, telles que le nombre de symboles globalement visibles ou la taille du code. L'éditeur de liens vous dira s'il convient lorsque vous créez la bibliothèque partagée. En cas de doute, je choisis -fPIC, car cela fonctionne toujours.

Anycorn
la source
33
De plus: j'ai fait une petite expérience ici (sur la plateforme x86_64), -fPICet -fpicsemble avoir généré le même code. Il semble qu'ils génèrent un code différent uniquement sur m68k, PowerPC et SPARC.
Denilson Sá Maia
4
Une seule expérience avec une version de gcc compilée d'une manière pour une cible. Prenez ce résultat avec un grain de sel, attendez-vous à ce que ce résultat change avec le temps, en particulier avec un outil comme GCC.
old_timer
Puis-je demander une question; que signifient les symboles globalement visibles ?
Константин Ван
17

Du page de manuel Gcc :

Lors de la génération de code pour des bibliothèques partagées, -fpic implique -msmall-data et -fPIC implique -mlarge-data.

Où:

 -msmall-data
 -mlarge-data
       When -mexplicit-relocs is in effect, static data is accessed via
       gp-relative relocations.  When -msmall-data is used, objects 8
       bytes long or smaller are placed in a small data area (the
       ".sdata" and ".sbss" sections) and are accessed via 16-bit
       relocations off of the $gp register.  This limits the size of the
       small data area to 64KB, but allows the variables to be directly
       accessed via a single instruction.

       The default is -mlarge-data.  With this option the data area is
       limited to just below 2GB.  Programs that require more than 2GB
       of data must use "malloc" or "mmap" to allocate the data in the
       heap instead of in the program's data segment.

       When generating code for shared libraries, -fpic implies
       -msmall-data and -fPIC implies -mlarge-data.
Alexandro de Oliveira
la source
1
La page de manuel liée a été mise à jour, n'oubliez pas de vérifier.
youfu le