2010-08-23 10 views
74

Ich habe bereits die gcc Manpage gelesen, aber ich kann immer noch nicht den Unterschied zwischen -fpic und -fPIC verstehen. Kann jemand das auf eine sehr einfache und klare Art erklären?Was ist der Unterschied zwischen den Parametern "-fpic" und "-fPIC" gcc?


Verwandte Fragen:

+1

Ja ist die Antwort nicht in 'man gcc'but in' info gcc', die mehr Dokumentation haben. – user2284570

Antwort

90

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

Verwenden -fPIC oder -fpic zu erzeugen Position in abhängiger Code. Ob -fPIC oder -fpic verwendet werden soll, um positionsunabhängigen Code zu generieren, ist zielabhängig. Die -fPIC Wahl funktioniert immer, aber kann größeren Code als -fpic produzieren (mnenomic, zum sich zu erinnern ist, dass PIC in einem größeren Fall ist, also kann es größere Mengen des Codes produzieren). Die Verwendung der Option -fpic generiert normalerweise einen kleineren und schnelleren Code, weist jedoch plattformabhängige Einschränkungen auf, z. B. die Anzahl der global sichtbaren Symbole oder die Größe des Codes. Der Linker wird Ihnen sagen, ob es passt, wenn Sie die gemeinsam genutzte Bibliothek erstellen. Im Zweifelsfall wähle ich -fPIC, weil es immer funktioniert.

+31

Was noch: Ich habe hier ein kleines Experiment (auf der x86_64-Plattform) gemacht, '-fPIC' und' -fpic' scheinen denselben Code erzeugt zu haben. Es scheint, dass sie nur auf m68k, PowerPC und SPARC einen anderen Code generieren. –

+1

Ein einzelnes Experiment mit einer Version von gcc, das auf eine Art für ein Ziel kompiliert wurde. Nehmen Sie dieses Ergebnis mit einem Körnchen Salz, erwarten Sie, dass sich das Ergebnis im Laufe der Zeit ändert, insbesondere mit einem Werkzeug wie GCC. –

+0

Darf ich eine Frage stellen? Was bedeutet _global sichtbare Symbole_? –

7

Vom Gcc manual page:

Wenn Code für gemeinsam genutzte Bibliotheken zu erzeugen, -fpic impliziert -msmall-Daten und -fPIC impliziert -mlarge-Daten.

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. 
Verwandte Themen