Eine kleine Ergänzung zu den bereits veröffentlichten Antworten: Nicht als positionsunabhängig kompilierte Objektdateien sind verschiebbar; sie enthalten Einträge in der Relokationstabelle.
Diese Einträge ermöglichen es dem Loader (dieser Codeabschnitt, der ein Programm in den Speicher lädt), die absoluten Adressen umzuschreiben, um sie an die tatsächliche Ladeadresse im virtuellen Adressraum anzupassen.
Ein Betriebssystem wird versuchen, eine einzelne Kopie einer "Shared Object Library", die im Speicher geladen ist, mit allen Programmen gemeinsam zu nutzen, die mit derselben Shared Object Library verknüpft sind.
Da der Code-Adressraum (im Gegensatz zu Abschnitten des Datenspeichers) nicht zusammenhängend sein muss und weil die meisten Programme, die mit einer bestimmten Bibliothek verknüpft sind, einen ziemlich festen Bibliotheksabhängigkeitsbaum haben, gelingt dies meistens. In den seltenen Fällen, in denen es Abweichungen gibt, kann es erforderlich sein, zwei oder mehr Kopien einer Shared Object Library im Speicher zu haben.
Offensichtlich wird jeder Versuch, die Ladeadresse einer Bibliothek zwischen Programmen und/oder Programminstanzen zu randomisieren (um die Möglichkeit der Erstellung eines ausnutzbaren Musters zu reduzieren), solche Fälle häufiger auftreten lassen, nicht selten, also sollte man, wo ein System diese Funktion ermöglicht hat, jeden Versuch unternehmen, alle Shared Object Libraries so zu kompilieren, dass sie positionsunabhängig sind.
Da auch Aufrufe in diese Bibliotheken aus dem Hauptprogramm heraus verschiebbar gemacht werden, ist es viel unwahrscheinlicher, dass eine Shared Library kopiert werden muss.
47 Stimmen
Clang verwendet auch -fPIC.
4 Stimmen
Related: -fpie: stackoverflow.com/questions/2463150/…
0 Stimmen
Verwandt, aber kein Duplikat: stackoverflow.com/questions/23225566/…