web-dev-qa-db-fra.com

Relocalisation R_X86_64_32S contre `.rodata '... lors de la compilation sur une plate-forme 64 bits

Donc, je codais quelque chose sur 32 bits et hier, je devais construire une dll et cela me posait quelques problèmes. En tout cas je les ai résolus ici .

Malheureusement, même si je pensais que tout fonctionnait bien après tout, ce n’était pas le cas lorsque j’ai déplacé mon programme et mon fichier Make sur un autre ordinateur fonctionnant en 64 bits, comme vous pouvez le deviner ...

Donc, mon problème est lié à la délocalisation à cause de 64 bits

/usr/bin/ld: MyClass.o: relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
MyClass.o: could not read symbols: Bad value

et voici mon makefile

MyProgram: main.o chkopts
    -${CLINKER} -o $@ $< ${MYLIB} ${PETSC_MAT_LIB}
    ${RM} main.o

    export LD_LIBRARY_PATH=${LIBADD}:$LD_LIBRARY_PATH

LibMyProgram.so: MyClass.o  chkopts
    -${CLINKER}  -shared -Wl,-soname,${SONAME} -o ${VERS}   *.o  ${PETSC_MAT_LIB}

    mv ${VERS} ${LIBADD}
    ln -sf ${LIBADD}${VERS} ${LIBADD}${SOWOV}
    ln -sf ${LIBADD}${VERS} ${LIBADD}${SONAME}

J'ai essayé d'ajouter -fPIC dans CFLAGS, CPPFLAGS et même LDFLAGS. J'ai également essayé d'ajouter -fPIC avant et après le drapeau partagé.

-${CLINKER} -shared -fPIC -Wl,-soname,${SONAME} -o ${VERS}   *.o  ${PETSC_MAT_LIB}

Mais je vais juste avoir une même erreur que précédemment.

Si j'utilise CFLAGS = -fPIC, j'obtiendrai le même type d'erreur, à savoir:

.../petsc/petsc-3.2-p6/Arch-linux2-cxx-debug/lib/libpetsc.a(err.o): relocation R_X86_64_32 against `ompi_mpi_comm_self' can not be used when making a shared object; recompile with -fPIC.

J'ai lu sur tous les sujets qui sont même similaires à mon problème mais je n'ai pas pu comprendre.

25
Mare

La solution consistait à tout compiler avec -fPIC et à lier les objets partagés à -shared.

Ajoutez -fPIC à CFLAGS ou CXXFLAGS pour les projets basés sur la marque.

4
Mare

J'ai rencontré le même problème lorsque j'essaie de créer une bibliothèque partagée qui doit lier une bibliothèque statique. 

J'ai résolu le problème en ajoutant -fPIC à CXXFLAGS pour compiler les fichiers .o archivés dans la bibliothèque statique.

9
user2391685

En essayant de compiler xmlrpc-c-1.06.41 dans CentOS 6.5, j’ai rencontré le même problème de liaison, qui a été résolu par le texte suivant:

CXXFLAGS = $(CXXFLAGS_COMMON) $(CFLAGS_PERSONAL) $(CADD) -shared -fPIC

Vous trouverez plus d’informations sur les drapeaux link

4
Saeed

Je rencontre aussi ce problème… .. Comme j'essaie d'utiliser @Mare et @ user2391685, cela peut bien fonctionner:

Utilisation de -fPIC lorsque vous créez un fichier .o: Par exemple:

gcc -Wall -fPIC -c hello.c -I./ -I/usr/lib/jvm/Java/include/ -I/usr/lib/jvm/Java/include/linux/

Ensuite, vous pouvez construire un fichier .so:

gcc -Wall -rdynamic -shared -o libhello.so hello.o Main.h -I/usr/lib/jvm/Java/include/ -I/usr/lib/jvm/Java/include/linux/
1
Strong

Si ce problème persiste après l'ajout de "-fPIC", essayez de nettoyer tous les fichiers .o et réexécutez

1
Xin