GNU/Linux >> Tutoriels Linux >  >> Linux

La compilation échoue avec la relocalisation R_X86_64_32 contre `.rodata.str1.8' ne peut pas être utilisé lors de la création d'un objet partagé

Faites ce que le compilateur vous dit de faire, c'est-à-dire recompilez avec -fPIC . Pour savoir ce que fait cet indicateur et pourquoi vous en avez besoin dans ce cas, consultez Options de génération de code du manuel de GCC.

En bref, le terme code indépendant de la position (PIC) fait référence au code machine généré qui est indépendant de l'adresse mémoire, c'est-à-dire qui ne fait aucune hypothèse sur l'endroit où il a été chargé dans la RAM. Seul le code indépendant de la position est censé être inclus dans les objets partagés (SO) car ils doivent avoir la capacité de changer dynamiquement leur emplacement dans la RAM.

Enfin, vous pouvez lire à ce sujet sur Wikipedia aussi.


Dans mon cas, cette erreur s'est produite car un make la commande s'attendait à récupérer les bibliothèques partagées (*.so files) depuis un répertoire distant indiqué par un LDFLAGS variables d'environnement. Par erreur, seules les librairies statiques y étaient disponibles (*.la ou *.a des dossiers).

Par conséquent, mon problème ne résidait pas avec le programme que je compilais mais avec les bibliothèques distantes qu'il essayait de récupérer. Donc, je n'ai pas eu besoin d'ajouter d'indicateur (par exemple, -fPIC ) à la compilation interrompue par l'erreur de relocalisation. J'ai plutôt recompilé la bibliothèque distante pour que les objets partagés soient disponibles.

En gros, il s'agit d'une erreur de fichier introuvable déguisée.

Dans mon cas, j'ai dû supprimer un --disable-shared égaré basculer dans le configure invocation pour le programme requis, puisque les bibliothèques partagées et statiques ont toutes deux été construites par défaut.

J'ai remarqué que la plupart des programmes construisent les deux types de bibliothèques en même temps, donc la mienne est probablement un cas d'urgence. En général, il se peut que vous deviez plutôt activer les bibliothèques partagées, en fonction des valeurs par défaut.

Pour inspecter votre situation particulière avec les commutateurs de compilation et les valeurs par défaut, je voudrais lire le résumé qui apparaît avec ./configure --help | less , généralement dans la section Fonctionnalités facultatives. J'ai souvent trouvé que cette lecture est plus fiable que les guides d'installation qui ne sont pas mis à jour au fur et à mesure que les programmes de dépendance évoluent.


Corrigé avec -no-pie option à l'étape de l'éditeur de liens :

g++-8 -L"/home/pedro/workspace/project/lib" -no-pie ...

Linux
  1. La commande lvremove échoue avec l'erreur "LVM - Impossible de supprimer le volume logique ouvert"

  2. Erreur Linux lors du chargement des bibliothèques partagées :impossible d'ouvrir le fichier objet partagé :aucun fichier ou répertoire de ce type

  3. dynamic_cast échoue lorsqu'il est utilisé avec dlopen/dlsym

  4. Comment savoir que la bibliothèque partagée donnée est construite avec des symboles de débogage ou non ?

  5. docker compose :erreur lors du chargement des bibliothèques partagées :libz.so.1 :échec du mappage du segment à partir de l'objet partagé :opération non autorisée

Détecter les bibliothèques partagées obsolètes en mémoire avec UChecker

Comment répertorier les bibliothèques partagées utilisées par les exécutables sous Linux

Bash Beginner Series #7 :Prise de décision avec des instructions If Else et Case Statements

Nohup pour le script Python ne fonctionne pas lors de l'exécution en arrière-plan avec &

Peut ping/ssh via LAN mais pas avec Wi-Fi

Est-ce que mprotect() peut être utilisé pour changer les permissions de .rodata ?