web-dev-qa-db-fra.com

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é "

J'essaie de compiler ce code source à partir du fichier makefile dans un VPS, mais cela ne fonctionne pas. Le VPS est un OS de 64 cent

Voici l'erreur complète

# make
gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c
g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp
g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp
g++ -O2 -fshort-wchar -shared -o "TCP_V1.so" *.o
/usr/bin/ld: TCP-LINUX_V1.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be     used when making a shared object; recompile with -fPIC
TCP-LINUX_V1.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [all] Error 1

Voici mon makefile:

GPP=g++
GCC=gcc
OUTFILE="TCP_V1.so"

COMPILE_FLAGS=-c -O3 -w -DLINUX -I../SDK/amx/

all:
    $(GCC) $(COMPILE_FLAGS) ../SDK/amx/*.c
    $(GPP) $(COMPILE_FLAGS) ../SDK/*.cpp
    $(GPP) $(COMPILE_FLAGS) *.cpp
    $(GPP) -O2 -fshort-wchar -shared -o $(OUTFILE) *.o

Quelqu'un sait ce qui ne va pas?

63
user1667191

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

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

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

101
Alexander Shukaev

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

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

Fondamentalement, il s'agit d'une erreur de dissimulation de fichier introuvable.

Dans mon cas, j'ai dû supprimer un commutateur --disable-shared égaré dans l'invocation configure du programme requis, car les bibliothèques partagées et statiques étaient toutes deux créées par défaut. 


J'ai remarqué que la plupart des programmes construisent les deux types de bibliothèques en même temps, alors le mien est probablement un cas d'école. 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 examiner votre situation particulière avec les commutateurs de compilation et les valeurs par défaut, je lis le résumé qui s’affiche avec ./configure --help | less, généralement dans la section Fonctionnalités facultatives. J'ai souvent constaté que cette lecture est plus fiable que les guides d'installation qui ne sont pas mis à jour alors que les programmes de dépendance évoluent.

34
XavierStuvw

Ce n’est pas toujours à propos des drapeaux de compilation, j’ai la même erreur sur gentoo lors de l’utilisation de distcc.

La raison en est que sur le serveur distcc utilise un profil non renforcé et sur le client, le profil est renforcé. Vérifiez cette discussion: https://forums.gentoo.org/viewtopic-p-7463994.html

9
EIIPII

Un "clean" l'a résolu pour moi.

Mon projet est une application C++ (bibliothèque non partagée) et j'ai eu cette erreur au hasard une fois lorsque j'ai essayé de la compiler.

3
Gábor Kiss-Vámosi

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

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

J'ai eu le même problème. Essayez de recompiler en utilisant -fPIC.

0
Saurav Chowdhury