je bâtiment récemment une certaine bibliothèque partagée (ELF) ciblant l'architecture x86-64, comme ceci:différence dans le code indépendant de la position: x86 vs x86-64
g++ -o binary.so -shared --no-undefined ... -lfoo -lbar
Ce a échoué avec l'erreur suivante:
relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
Bien sûr, cela signifie que j'ai besoin de le reconstruire en tant que code indépendant de la position, donc il convient à la liaison dans une bibliothèque partagée.
Mais cela fonctionne parfaitement sur x86 avec exactement les mêmes arguments de construction. Donc, la question est, comment le déplacement sur x86 est-il différent de x86-64 et pourquoi n'ai-je pas besoin de compiler avec -fPIC
sur le premier?
Je n'ai jamais compris cela. Si le compilateur peut vous dire exactement quelle option utiliser automatiquement, pourquoi faut-il que vous disiez des mots magiques pour le faire fonctionner correctement? Grrr .. –
@Billy ONeal, Maintenant, je crois que c'est le cas de l'abstraction qui fuit. Ils diffèrent dans la façon dont ils chargent les données globales, ce qui affecte si PIC est nécessaire ou non. –
Je comprends le besoin de la différence. Ce que je ne comprends pas, c'est pourquoi vous devez donner un interrupteur au compilateur pour qu'il le fasse. –