web-dev-qa-db-fra.com

Erreur de compilation g ++: `.rodata 'ne peut pas être utilisé lors de la création d'un objet partagé; recompiler avec -fPIC

J'utilise la commande:
g++ --std=c++11 -fPIC -Iincludes parser.cpp lib/main-parser.o lib/lib.a

Pour compiler un programme C++ sur Debian 9. Mais je reçois le message d'erreur ci-dessous: /usr/bin/ld: lib/lib.a(csdocument.o): relocation R_X86_64_32 against '.rodata' can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: final link failed: Nonrepresentable section on output collect2: error: ld returned 1 exit status

J'ai déjà vu le fil: La compilation échoue avec "la relocalisation R_X86_64_32 contre` .rodata.str1.8 'ne peut pas être utilisée lors de la création d'un objet partagé "

Cependant, j'ai essayé d'ajouter l'argument -fPIC Mais il donne étrangement le même message d'erreur, ainsi que "recompiler avec -fPIC"

Toute idée serait appréciée. J'ai essayé de compiler cela sur les systèmes RedHat de mon université et cela fonctionne très bien là-bas. Je pense que cela pourrait être une dépendance manquante, mais je n'ai pas pu trouver de réponses.

Merci d'avance

13
Polymer

Comme il semble que gcc essaie de produire un exécutable indépendant de la position, dites-lui de ne pas:

g++ --std=c++11 -no-pie -Iincludes parser.cpp lib/main-parser.o lib/lib.a

Il paraît que g++ produit par défaut des exécutables indépendants de la position sur votre système. D'autres systèmes nécessiteraient -pie faire cela. En utilisant -no-pie devrait créer un exécutable "régulier" (dépendant de la position).

20
davmac
/usr/bin/ld: lib/lib.a(csdocument.o): relocation R_X86_64_32 against '.rodata' \
can not be used when making a shared object; recompile with -fPIC

Cette erreur de l'éditeur de liens vous indique que le fichier objet csdocument.o dans la bibliothèque statique lib/lib.a n'est pas un code indépendant de position et ne peut donc pas être lié à votre programme PIE. Vous devez donc recompiler les fichiers source de lib/lib.a avec -fPIC, puis reconstruisez la bibliothèque statique, puis associez-la à votre programme PIE. Si vous n'avez pas le contrôle des sources libérales, demandez une construction PIC à son fournisseur.

(D'autres se sont demandé pourquoi vous devriez avoir besoin de construire une cible PIE car ce n'est pas une bibliothèque partagée. Dans Debian 9, GCC produit exécutables PIE par défaut , que ce soit des programmes ou des bibliothèques partagées. La même chose vaut pour Ubuntu à partir du 17.04.)

7
Mike Kinghan

L'ajout de cela a fonctionné pour moi.

g++ --std=c++11 -no-pie

J'ai également ajouté le -fPIC pour compiler le drapeau.

0
nithin krishna