Подтвердить что ты не робот

"Перемещение R_X86_64_32S против" связывания ошибки "

Я пытаюсь связать статическую библиотеку с общей библиотекой, я получаю следующую ошибку

/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

Но это работало на 32-битной машине без такой ошибки. Я попытался добавить флаги -fPIC вручную в Makefile, который тоже не решил проблему

Я попробовал флаг -whole-archive, предложенный здесь, но без успеха.

 
/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

Создание liblog4cplus.a:

  • unzip log4cplus-1.1.0.zip
  • ./configure --enable-static=yes --enable-threads=yes
  • vi Makefile и добавил -fPIC в CXXFLAGS и CFLAGS
  • make

Затем для компиляции моей общей библиотеки:

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

Ответ 1

Предполагая, что вы создаете общую библиотеку, скорее всего, происходит то, что вариант liblog4cplus.a, который вы используете, не был скомпилирован с помощью -fPIC. В linux вы можете подтвердить это, извлекая объектные файлы из статической библиотеки и проверяя их перемещение:

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

Если выход пуст, то статическая библиотека не является независимой от положения и не может использоваться для создания общего объекта.

Поскольку статическая библиотека содержит объектный код, который уже был скомпилирован, предоставление флага -fPIC не поможет.

Вам нужно получить версию liblog4cplus.a, скомпилированную с помощью -fPIC, и использовать ее вместо этого.

Ответ 2

У меня такая же ошибка при установке FCL, для которой требуется CCD lib (libccd):

/usr/bin/ld:/usr/local/lib/libccd.a(ccd.o): перемещение R_X86_64_32S против "локального символа" не может использоваться при создании общего объекта; перекомпилировать с помощью -fPIC

Я обнаружил, что есть два разных файла с именем "libccd.a":

  • /usr/local/lib/libccd.a
  • /usr/local/lib/x86_64-linux-gnu/libccd.a

Я решил проблему, удалив первый файл.

Ответ 3

Перемещение R_X86_64_PC32 против символа undefined, как правило, происходит, когда LDFLAGS установлены с упрочнением и CFLAGS нет.
Возможно, просто ошибка пользователя:
Если вы используете -specs =/usr/lib/rpm/redhat/redhat-hardened-ld во время соединения, вам также нужно использовать -specs =/usr/lib/rpm/redhat/redhat-hardened-cc1 во время компиляции, а поскольку вы одновременно компилируете и связываете, вам нужно либо обоим, либо отказаться от -specs =/usr/lib/rpm/redhat/redhat-hardened-ld. Общие исправления:
https://bugzilla.redhat.com/show_bug.cgi?id=1304277#c3
https://github.com/rpmfusion/lxdream/blob/master/lxdream-0.9.1-implicit.patch