2010-08-23 2 views
74

J'ai déjà lu la page de manuel gcc, mais je n'arrive toujours pas à comprendre la différence entre -fpic et -fPIC. Quelqu'un peut-il l'expliquer, d'une manière très simple et claire?Quelle est la différence entre les paramètres gcc `-fpic` et` -fPIC`?


questions connexes:

+1

Oui, la réponse est non 'man gcc'but dans' information gcc', qui ont plus de documentation. – user2284570

Répondre

90

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

Utilisez -fPIC ou -fpic pour générer position code dépendant. L'utilisation de -fPIC ou de -fpic pour générer un code indépendant de la position dépend de la cible. Le choix -fPIC fonctionne toujours, mais peut produire un code plus grand que -fpic (mnenomic pour se rappeler que PIC est dans un cas plus grand, donc il peut produire de plus grandes quantités de code). L'utilisation de l'option -fpic génère généralement un code plus petit et plus rapide, mais présente des limitations dépendantes de la plate-forme, telles que le nombre de symboles visibles globalement ou la taille du code. L'éditeur de liens vous dira si cela correspond à la création de la bibliothèque partagée. En cas de doute, je choisis -fPIC, car cela fonctionne toujours.

+31

Quoi de plus: j'ai fait une petite expérience ici (sur la plate-forme x86_64), '-fPIC' et' -fpic' semble 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. –

+1

Une expérience unique 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. –

+0

Puis-je poser une question? qu'est-ce que signifie _globally visible symbols_? –

7

De l'Gcc manual page:

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

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. 
Questions connexes