make library c++ linux shared-libraries static-libraries

c++ - library - "Reubicación R_X86_64_32S en contra" vinculando Error



make shared library gcc (3)

La reubicación R_X86_64_PC32 contra un símbolo indefinido, generalmente ocurre cuando las LDFLAGS se configuran con endurecimiento y las CFLAGS no.
Tal vez solo error del usuario:
Si está usando -specs = / usr / lib / rpm / redhat / redhat-hardened-ld en el momento del enlace, también necesita usar -specs = / usr / lib / rpm / redhat / redhat-hardened-cc1 en tiempo de compilación y, al compilar y enlazar al mismo tiempo, necesita ambos, o eliminar el comando -specs = / usr / lib / rpm / redhat / redhat-hardened-ld. Correcciones comunes:
https://bugzilla.redhat.com/show_bug.cgi?id=1304277#c3
https://github.com/rpmfusion/lxdream/blob/master/lxdream-0.9.1-implicit.patch

Estoy intentando vincular una biblioteca estática a una biblioteca compartida. Recibo el siguiente error.

/usr/bin/ld: ../../../libraries/log4cplus/liblog4cplus.a(fileappender.o): relocation R_X86_64_32S against `a local symbol'' can not be used when making a shared object; recompile with -fPIC ../../../libraries/log4cplus/liblog4cplus.a: could not read symbols: Bad value collect2: ld returned 1 exit status

Pero esto funcionó en una máquina de 32 bits sin ningún tipo de error. Intenté agregar los indicadores -fPIC manualmente al Makefile que tampoco resolvieron el problema

-whole-archive la -whole-archive como se sugiere here pero sin éxito.

/usr/bin/ld: ../../../libraries/log4cplus/liblog4cplus.a(appenderattachableimpl.o): relocation R_X86_64_32S against `vtable for log4cplus::spi::AppenderAttachable'' can not be used when making a shared object; recompile with -fPIC ../../../libraries/log4cplus/liblog4cplus.a(appenderattachableimpl.o): could not read symbols: Bad value collect2: ld returned 1 exit status

Creación de liblog4cplus.a:

  1. unzip log4cplus-1.1.0.zip
  2. ./configure --enable-static=yes --enable-threads=yes
  3. vi Makefile y agregado -fPIC a CXXFLAGS y CFLAGS
  4. make

Luego para compilar mi biblioteca compartida:

  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

Suponiendo que está generando una biblioteca compartida, lo más probable es que la variante de liblog4cplus.a que está utilizando no se haya compilado con -fPIC . En Linux, puede confirmar esto extrayendo los archivos de objetos de la biblioteca estática y verificando sus reubicaciones :

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

Si la salida está vacía, la biblioteca estática no es independiente de la posición y no se puede utilizar para generar un objeto compartido.

Dado que la biblioteca estática contiene código objeto que ya fue compilado, proporcionar la marca -fPIC no ayudará.

liblog4cplus.a obtener una versión de liblog4cplus.a compilada con -fPIC y usar esa en su lugar.


Tengo un error similar al instalar FCL que necesita CCD lib (libccd) como este:

/ usr / bin / ld: /usr/local/lib/libccd.a(ccd.o): la reubicación R_X86_64_32S contra `un símbolo local ''no se puede usar al crear un objeto compartido; recompilar con -fPIC

Encuentro que hay dos archivos diferentes llamados "libccd.a":

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

Resolví el problema eliminando el primer archivo.