ich vor kurzem eine bestimmte freigegebene Bibliothek (ELF) Targeting x86-64-Architektur, wie dieses Gebäude wurde:Differenz in positionsunabhängigen Code: x86 vs x86-64
g++ -o binary.so -shared --no-undefined ... -lfoo -lbar
Dies scheiterte mit dem folgenden Fehler:
relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
Natürlich bedeutet es, dass ich es als positionsunabhängigen Code neu erstellen muss, damit es in eine gemeinsame Bibliothek verknüpft werden kann.
Aber das funktioniert perfekt auf x86 mit genau den gleichen Build-Argumente. Die Frage ist also, wie unterscheidet sich die Verschiebung auf x86 von x86-64 und warum muss ich nicht mit -fPIC
auf der ehemaligen kompilieren?
Ich habe das nie verstanden. Wenn der Compiler Ihnen genau sagen kann, welche Option automatisch verwendet werden soll, warum müssen Sie dann magische Wörter sagen, damit es korrekt funktioniert? Grrr .. –
@Billy ONeal, jetzt glaube ich, dass der Fall der undichten Abstraktion ist. Sie unterscheiden sich darin, wie sie globale Daten laden, was sich darauf auswirkt, ob PIC benötigt wird oder nicht. –
Ich verstehe die Notwendigkeit für den Unterschied. Was ich nicht verstehe, ist, warum Sie dem Compiler einen Schalter geben müssen, damit er das tut. –