Ich weiß, dass -fPIC
die Option ' ' etwas mit dem Auflösen von Adressen und der Unabhängigkeit zwischen einzelnen Modulen zu tun hat, bin mir aber nicht sicher, was dies wirklich bedeutet. Können Sie erklären?
Ich weiß, dass -fPIC
die Option ' ' etwas mit dem Auflösen von Adressen und der Unabhängigkeit zwischen einzelnen Modulen zu tun hat, bin mir aber nicht sicher, was dies wirklich bedeutet. Können Sie erklären?
Antworten:
PIC steht für Position Independent Code
und um zu zitieren man gcc
:
Wenn dies für den Zielcomputer unterstützt wird, geben Sie positionsunabhängigen Code aus, der für die dynamische Verknüpfung geeignet ist und eine Begrenzung der Größe der globalen Versatztabelle vermeidet. Diese Option macht einen Unterschied bei m68k, PowerPC und SPARC. Positionsunabhängiger Code erfordert spezielle Unterstützung und funktioniert daher nur auf bestimmten Computern.
Verwenden Sie diese Option, wenn Sie gemeinsam genutzte Objekte (* .so) auf den genannten Architekturen erstellen.
/usr/bin/ld: /tmp/cc7hXILq.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
also fPIC hinzugefügt und sie erstellt.
Das f
ist der gcc Präfix für Optionen , die „die Schnittstellenkonventionen in der Codegenerierung verwendet Control“
Das PIC
steht für "Position Independent Code", es ist eine Spezialisierung des fpic
für m68K und SPARC.
Bearbeiten: Nachdem ich Seite 11 des Dokuments gelesen hatte , auf das 0x6adb015 verweist , und den Kommentar von Coryan, nahm ich einige Änderungen vor:
Diese Option ist nur für gemeinsam genutzte Bibliotheken sinnvoll und Sie teilen dem Betriebssystem mit, dass Sie eine globale Offset-Tabelle (GOT) verwenden. Dies bedeutet, dass alle Ihre Adressreferenzen relativ zum GOT sind und der Code für mehrere Prozesse freigegeben werden kann.
Andernfalls müsste der Loader ohne diese Option alle Offsets selbst ändern.
Natürlich verwenden wir fast immer -fpic / PIC.
man gcc
sagt:
-fpic Generieren Sie einen positionsunabhängigen Code (PIC), der für die Verwendung in einem gemeinsam genutzten Code geeignet ist Bibliothek, falls für den Zielcomputer unterstützt. Ein solcher Code greift auf alle zu konstante Adressen über eine globale Offset-Tabelle (GOT). Die Dynamik Der Loader löst die GOT-Einträge beim Start des Programms auf (die Dynamik Der Lader ist nicht Teil von GCC. es ist Teil des Betriebssystems). Wenn Die GOT-Größe für die verknüpfte ausführbare Datei überschreitet eine maschinenspezifische Bei maximaler Größe erhalten Sie vom Linker eine Fehlermeldung das -fpic funktioniert nicht; In diesem Fall kompilieren Sie stattdessen mit -fPIC neu. (Diese Höchstwerte betragen 8k beim SPARC und 32k beim m68k und RS / 6000. Der 386 hat keine solche Grenze.) Positionsunabhängiger Code erfordert daher besondere Unterstützung funktioniert nur auf bestimmten Maschinen. Für den 386 unterstützt GCC PIC für System V, aber nicht für die Sun 386i. Code generiert für die IBM RS / 6000 ist immer positionsunabhängig. -fPIC Wenn dies für den Zielcomputer unterstützt wird, geben Sie positionsunabhängigen Code aus. Geeignet für die dynamische Verknüpfung und zur Vermeidung von Größenbeschränkungen von die globale Offset-Tabelle. Diese Option macht beim m68k einen Unterschied und der SPARC. Positionsunabhängiger Code erfordert daher besondere Unterstützung funktioniert nur auf bestimmten Maschinen.