web-dev-qa-db-fra.com

"relocalisation R_X86_64_32S contre" erreur de liaison

J'essaie de lier une bibliothèque statique à une bibliothèque partagée, je reçois l'erreur suivante

/usr/bin/ld: ../../../libraries/log4cplus/liblog4cplus.a(fileappender.o): la relocalisation R_X86_64_32S contre "un symbole local" ne peut pas être utilisée lors de la création d'un partage objet; recompiler avec -fPIC 
 ../../../ libraries/log4cplus/liblog4cplus.a: impossible de lire les symboles: valeur incorrecte 
 collect2: ld a renvoyé 1 état de sortie 

Mais cela a fonctionné sur une machine 32 bits sans une telle erreur. J'ai essayé d'ajouter The -fPIC signale manuellement dans le Makefile que cela n'a pas résolu le problème

J'ai essayé le -whole-archive drapeau comme suggéré ici mais sans succès.

 
/usr/bin/ld: ../../../libraries/log4cplus/liblog4cplus.a(appenderattachableimpl.o): relocalisation R_X86_64_32S contre `vtable pour log4cplus :: spi :: AppenderAttachable 'ne peut pas être utilisé lors de la création d'un objet partagé; recompiler avec -fPIC 
 ../../../ libraries/log4cplus/liblog4cplus.a (appenderattachableimpl.o): impossible de lire les symboles: valeur incorrecte 
 collect2: ld renvoyé 1 état de sortie 

Création de liblog4cplus.a:

  1. unzip log4cplus-1.1.0.Zip
  2. ./configure --enable-static=yes --enable-threads=yes
  3. vi Makefile et ajout de -fPIC à CXXFLAGS et CFLAGS
  4. make

Puis pour compiler ma bibliothèque partagée:

  1. g++ -frtti -w -c -fPIC -I"Include_Directory" myfile.cpp
  2. g++ -shared -fPIC -frtti -I"Include_Directory" -o mysofile.so myfile.o -Wl,--whole-archive "../../../libraries/log4cplus/liblog4cplus.a" -Wl,--no-whole-archive -ldl
52
Thiyagarajan

En supposant que vous générez une bibliothèque partagée, il est probable que la variante de liblog4cplus.a que vous utilisez n'a pas été compilé avec -fPIC. Sous Linux, vous pouvez le confirmer en extrayant les fichiers objets de la bibliothèque statique et en vérifiant leurs déplacements :

ar -x liblog4cplus.a  
readelf --relocs fileappender.o | egrep '(GOT|PLT|JU?MP_SLOT)'

Si la sortie est vide, la bibliothèque statique n'est pas indépendante de la position et ne peut pas être utilisée pour générer un objet partagé.

Comme la bibliothèque statique contient du code objet déjà compilé, fournir l'indicateur -fPIC ne vous aidera pas.

Vous devez vous procurer une version de liblog4cplus.a compilé avec -fPIC et utilisez celui-là à la place.

85
fons

J'ai une erreur similaire lors de l'installation de FCL qui nécessite CCD lib (libccd) comme ceci:

/ usr/bin/ld: /usr/local/lib/libccd.a(ccd.o): relocalisation R_X86_64_32S contre `un symbole local 'ne peut pas être utilisée lors de la création d'un objet partagé; recompiler avec -fPIC

Je trouve qu'il y a deux fichiers différents nommés "libccd.a":

  1. /usr/local/lib/libccd.a
  2. /usr/local/lib/x86_64-linux-gnu/libccd.a

J'ai résolu le problème en supprimant le premier fichier.

2
Saeed Mohtasham

La relocalisation R_X86_64_PC32 par rapport au symbole non défini se produit généralement lorsque LDFLAGS est défini avec le renforcement et CFLAGS pas.
Peut-être juste une erreur de l'utilisateur:
Si vous utilisez -specs =/usr/lib/rpm/redhat/redhat-hardened-ld au moment du lien, vous devez également utiliser -specs =/usr/lib/rpm/redhat/redhat-hardened -cc1 au moment de la compilation, et comme vous compilez et liez en même temps, vous avez besoin des deux, ou supprimez -specs =/usr/lib/rpm/redhat/redhat-hardened-ld. Corrections communes:
https://bugzilla.redhat.com/show_bug.cgi?id=1304277#c
https://github.com/rpmfusion/lxdream/blob/master/lxdream-0.9.1-implicit.patch

2
Sérgio