Auf gcc Zielmaschinen, wenn man eine gemeinsam genutzte Bibliothek kompilieren wollte, müsste man -fpic oder -fPIC angeben, damit die Dinge korrekt funktionieren. Dies liegt daran, dass standardmäßig eine absolute Adressierung verwendet wurde, die für ausführbare Dateien geeignet ist, die die volle Kontrolle über ihren eigenen Adressraum haben, aber keine gemeinsam genutzten Bibliotheken, die irgendwo in den Adressraum einer ausführbaren Datei geladen werden können.Muss man -fPIC beim Kompilieren mit GCC noch verwenden?
Moderne Kernel implementieren jetzt Adressraum-Randomisierung und viele moderne Architekturen unterstützen PC-relative Adressierung. Dies alles scheint die absolute Adressierung entweder unbrauchbar zu machen (Adressraum-Randomisierung) oder unnötig (relative PC-Adressierung).
Ich habe auch bemerkt, dass clang keine -fPIC-Option hat, die mich dazu bringt, dass es nicht mehr notwendig ist.
Ist also -fpic jetzt redundant oder muss man separate .o-Dateien erzeugen, eine für die statische Bibliothek und eine für die gemeinsame Benutzung der Bibliothek?
PIC-Code ist in den meisten Fällen langsamer, da der zusätzliche Sprung durch den PLT bei vielen Funktionsaufrufen eine zusätzliche Indirektion erfordert. Es ist eine gute Idee, statische Bibliotheken ohne PIC zu erstellen. – Art
@Art: Es kann langsamer sein, aber nicht viel. Und ich stimme nicht zu, dass es nützlich ist, statische Bibliotheken ohne zu erstellen. Statische Bibliotheken werden nicht nur in ausführbare Dateien, sondern auch in gemeinsam genutzte Bibliotheken eingebunden. Und, wie die Frage erwähnt, müssen ausführbare ASLR-Dateien auch positionsunabhängig sein. Am sichersten ist es also, '-fPIC' anzugeben. –
@Art Das Problem auf einem Intel ist nicht die Funktion Anrufe oder Sprünge (die alle PC relativ sind), aber den Zugriff auf globale Daten. (Bei anderen Prozessoren sind die Probleme anders.) –