1. ホーム
  2. c++

"relocation R_X86_64_32S against " リンキングエラー

2023-12-09 09:53:03

質問

静的ライブラリを共有ライブラリにリンクしようとしているのですが、以下のエラーが発生します。

/usr/bin/ld: ../../../libraries/log4cplus/liblog4cplus.a(fileappender.o): relocation R_X86_64_32S against `a local symbol' can't be used when making a shared object; recompile with -fPIC
../../../libraries/log4cplus/liblog4cplus.a: could not read symbols.バッドバリューを読み込むことができませんでした。Bad value
collect2: ldは1終了ステータスを返しました

しかし、これは32bitのマシンではそのようなエラーもなく動作しました。試しに -fPIC フラグを手動で追加してみましたが、これも問題解決には至りませんでした。

を試してみましたが -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は1終了ステータスを返した

liblog4cplus.aの作成。

  1. unzip log4cplus-1.1.0.zip
  2. ./configure --enable-static=yes --enable-threads=yes
  3. vi Makefile と、CXXFLAGS と CFLAGS に -fPIC を追加しました。
  4. make

次に、共有ライブラリのコンパイルです。

  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

どのように解決するのですか?

共有ライブラリを生成していると仮定すると、おそらく起こるのは liblog4cplus.a でコンパイルされていないことです。 -fPIC . linuxでは、スタティックライブラリからオブジェクトファイルを取り出して確認することができます。 リロケーションを確認する :

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

出力が空の場合、静的ライブラリは位置非依存であり、共有オブジェクトの生成に使用することはできません。

スタティックライブラリは既にコンパイルされたオブジェクトコードを含んでいるため、-fPICフラグを与えても役に立ちません。

のバージョンを手に入れる必要があります。 liblog4cplus.a とコンパイルされた -fPIC をコンパイルして、代わりにそちらを使用します。