Ich stelle ein Makefile für ein Projekt zusammen, an dem ich gerade arbeite. Ich habe eine ausführbare Datei und eine gemeinsame Bibliothek im Projekt. Beide verwenden einige der gleichen Quelldateien, die separat in Objektdateien kompiliert werden. Um diese Objekte in der Shared Library verwenden zu können, muss ich den Flag -fPIC (position independent code) in gcc verwenden. Gibt es irgendwelche Implikationen beim Kompilieren von Objekten mit -fPIC, die in einer ausführbaren Datei verwendet werden?Was, wenn überhaupt, sind die Auswirkungen der Kompilierung von Objekten mit gcc-fPIC Flag, wenn sie in ausführbaren Dateien verwendet werden?
Antwort
Kompilieren positionsunabhängigen Code, wenn nicht notwendig ist eine Leistungsbremse auf einigen Plattformen (vor allem die Register-hungved x86-Architektur, weil PIC ein Register entfernt, die frei verwendet werden kann, wenn Nicht-PIC), aber dort sollte sonst keine nachteiligen Auswirkungen haben.
Darüber hinaus ist es sogar möglich, eine positionsunabhängige ausführbare Datei (-fPIE
) zu erstellen, die nur aus positionsunabhängigem Code besteht.
libtool kann automatisch sowohl PIC-und Nicht-PIC-Objekte für jede Quelldatei, die Sie kompilieren, und es sollte einfach sein, das gleiche auch in einem Build-System ohne Libtool-Integration zu produzieren.
Kein PIC nimmt kein Register auf x86. Diese CPU hat keinen indirekten Positionscode und fügt daher immer eine Indirektion zu den Daten/Funktionen hinzu. Sie können -fPIC vollständig auf x86 vergessen, denn wenn Sie es nicht angeben, erhalten Sie schnellen Code und der Linker dupliziert das Code-Segment für jede ausführbare Datei. – Lothar
@Lothar Auf x86-32, je nach Compiler, entfernt PIC ein Register. GCC vor 5.0 reserviert '% ebx' und ist damit nicht für den allgemeinen Gebrauch verfügbar. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54232 – ephemient
Sieht so aus, als ob GCC7 nun alles erfordert, was mit -fPIC kompiliert wurde. Zumindest bekomme ich einen Fehler und habe diese Frage bei der Suche gefunden, warum ich den Fehler bekomme? – Lothar
@Lothar Nein, es erfordert es im Allgemeinen nicht. Mischen Sie Objekte, die mit und ohne '-fPIC' kompiliert wurden? – ephemient