J'ai déjà lu la page de manuel gcc
, 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:
http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Utilisation -fPIC
ou -fpic
pour générer un code indépendant de la position. Que ce soit pour utiliser -fPIC
ou -fpic
pour générer un code indépendant de la position dépend de la cible. Le -fPIC
le choix fonctionne toujours, mais peut produire un code plus grand que -fpic
(mnémonique pour se rappeler que PIC est dans un cas plus grand, donc il peut produire de plus grandes quantités de code). En utilisant -fpic
L'option génère généralement du 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
, parce que ça marche toujours.
Depuis la 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.