Warum liefert gcc nicht implizit das -fPIC-Flag, wenn statische Bibliotheken auf x86_64 kompiliert werden

Ich hatte zahlreiche Probleme beim Kompilieren von gemeinsam genutzten Objekten, die statisch mit statischen Bibliotheken verknüpft sind. Dieses Problem tritt nur auf x84_64-Plattformen auf. Wenn ich die gleiche Kompilierungsarbeit auf x86_32 mache, habe ich keine Probleme.

Vielleicht handelt es sich hierbei um eine betriebssystemspezifische GCC-Konfiguration, aber meine Untersuchungen zeigen, dass GCC auf x86_64-Plattformen funktioniert. Auf jeden Fall verwende ich gcc 4.4.3 unter Ubuntu 10.04 x86_64.

Wie wird das Problem behoben? ... Sicherstellen, dass alle statischen Bibliotheksabhängigkeiten mit -fPIC kompiliert wurden.

Frage 1 Was ist der Unterschied zwischen -fpic und -fPIC (anscheinend generiert -fPIC mehr Anweisungen auf x86)? Warum ist der spätere Typ im x86_64-Kontext relevanter?

Frage 2 Ich gehe davon aus, dass Sie beim Verknüpfen mit statischem Code die Funktionen zum Zeitpunkt des Verknüpfens fest in Ihre Binärdatei verkabeln. Warum muss der Grad der Indirektion erreicht werden, den die "positionsunabhängiger Code" -Maschinerie bietet?

Frage 3 Wenn x86 -fpic / -fPIC nicht benötigt, um freigegebene Objekte mit statischen Archiven zu verknüpfen, warum wird es in x86_64 benötigt?

Frage 4: auch wenn es gebraucht wird, warum wird es nicht implizit geliefert? Ich dachte, Veränderungen zu brechen, sollte ein großes Nein-Nein sein

Antworten auf die Frage(2)

Ihre Antwort auf die Frage