Avatar ·

Was ist das Flag -fPIC in GCC und warum wird es beim Bau von Bibliotheken benötigt?

Hallo zusammen! Ich habe angefangen, C++ zu lernen und versuche, eine dynamische Bibliothek (.so) unter Linux mit GCC zu bauen. Ich sehe überall, dass beim Kompilieren von Objekten für die Bibliothek das Flag -fPIC hinzugefügt wird, aber ich verstehe nicht, warum es nötig ist. Hier ist mein einfaches Beispiel. Es gibt eine Datei `math_utils.cpp`: ```cpp int add(int a, int b) { return a + b; } int multiply(int a, int b) { return a * b; } ``` Ich kompiliere so: ```bash g++ -c math_utils.cpp -o math_utils.o g++ -shared math_utils.o -o libmath.so ``` Und alles funktioniert! Die Bibliothek wird erstellt, das Programm bindet sie ein und verwendet die Funktionen. Aber wenn ich -fPIC hinzufüge: ```bash g++ -c -fPIC math_utils.cpp -o math_utils.o ``` Das Ergebnis ist dasselbe. Was ist der Unterschied? Wenn ich gegoogelt habe, schreiben sie, dass ohne -fPIC auf x86_64 ein Fehler auftreten kann, aber bei mir kompiliert alles. Erklärt mir bitte, was Position Independent Code ist, und ist es zwingend erforderlich, -fPIC für shared libraries zu verwenden? Gibt es Fälle, in denen man ohne es nicht auskommt? Vielen Dank im Voraus! <<>>

Was ist