Was ist der Unterschied zwischen den gcc-Parametern `-fpic` und` -fPIC`?

96

Ich habe die gccManpage bereits gelesen , kann aber den Unterschied zwischen -fpicund immer noch nicht verstehen -fPIC. Kann es jemand auf sehr einfache und klare Weise erklären?


Verwandte Fragen:

Denilson Sá Maia
quelle
1
Ja, die Antwort ist nicht in, man gccsondern in info gcc, die mehr Dokumentation haben.
user2284570

Antworten:

109

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

Verwenden Sie -fPICoder -fpic, um positionsunabhängigen Code zu generieren. Ob positionsunabhängiger Code verwendet -fPICoder -fpicgeneriert wird, hängt vom Ziel ab. Die -fPICAuswahl funktioniert immer, kann jedoch größeren Code erzeugen als -fpic(mnenomic, um sich daran zu erinnern, dass PIC in einem größeren Fall vorliegt, sodass möglicherweise größere Codemengen erzeugt werden). Die Verwendung der -fpicOption generiert normalerweise kleineren und schnelleren Code, unterliegt jedoch plattformabhängigen Einschränkungen, z. B. der Anzahl der global sichtbaren Symbole oder der Größe des Codes. Der Linker teilt Ihnen mit, ob er beim Erstellen der gemeinsam genutzten Bibliothek passt. Im Zweifelsfall wähle ich -fPIC, weil es immer funktioniert.

Anycorn
quelle
33
Was mehr ist: Ich habe hier ein kleines Experiment durchgeführt (auf der x86_64-Plattform) -fPICund habe -fpicanscheinend den gleichen Code generiert. Es scheint, dass sie nur auf m68k, PowerPC und SPARC einen anderen Code generieren.
Denilson Sá Maia
3
Ein einzelnes Experiment mit einer Version von gcc, die auf eine Weise für ein bestimmtes Ziel kompiliert wurde. Nehmen Sie dieses Ergebnis mit einem Körnchen Salz und erwarten Sie, dass sich dieses Ergebnis im Laufe der Zeit ändert, insbesondere mit einem Werkzeug wie GCC.
old_timer
Dürfte ich eine Frage stellen; Was bedeuten global sichtbare Symbole ?
16онстантин Ван
17

Aus der Gcc-Handbuchseite :

Beim Generieren von Code für gemeinsam genutzte Bibliotheken impliziert -fpic -msmall-data und -fPIC -mlarge-data.

Wo:

 -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
quelle
Die verlinkte Handbuchseite wurde aktualisiert. Denken Sie daran, sie zu überprüfen.
Youfu