web-dev-qa-db-ja.com

「再配置R_X86_64_32Sに対する」リンクエラー

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

/usr/bin/ld:../../../libraries/log4cplus/liblog4cplus.a(fileappender.o):「ローカルシンボル」に対する再配置R_X86_64_32Sは、共有の作成時に使用できませんオブジェクト; -fPIC 
 ../../../ libraries/log4cplus/liblog4cplus.aで再コンパイル:シンボルを読み取れませんでした:不正な値
 collect2:ldが1つの終了ステータスを返しました

しかし、これはそのようなエラーなしで32ビットマシンで機能しました。 -fPICフラグをMakefileに手動で追加しようとしましたが、これも問題を解決しませんでした

提案どおり-whole-archiveフラグを試してみました here が成功しませんでした。

 
/usr/bin/ld:../../../libraries/log4cplus/liblog4cplus.a(appenderattachableimpl.o):「vtable for log4cplus :: spi :: AppenderAttachable」に対する再配置R_X86_64_32Sはできません共有オブジェクトを作成するときに使用します。 -fPIC 
 ../../../ libraries/log4cplus/liblog4cplus.a(appenderattachableimpl.o)で再コンパイル:シンボルを読み取れませんでした:不正な値
 collect2:ldが1つの終了ステータスを返しました

Liblog4cplus.aの作成:

  1. unzip log4cplus-1.1.0.Zip
  2. ./configure --enable-static=yes --enable-threads=yes
  3. vi Makefileおよび-fPICをCXXFLAGSおよびCFLAGSに追加
  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
52
Thiyagarajan

共有ライブラリを生成していると仮定すると、最も起こりそうなことは、使用しているliblog4cplus.aのバリアントが-fPICでコンパイルされていないことです。 Linuxでは、静的ライブラリからオブジェクトファイルを抽出し、 それらの再配置を確認する でこれを確認できます。

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

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

静的ライブラリには既にコンパイルされたオブジェクトコードが含まれているため、-fPICフラグを指定しても役に立ちません。

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

85
fons

次のようなCCD lib(libccd)を必要とするFCLをインストールすると、同様のエラーが発生します。

/ usr/bin/ld:/usr/local/lib/libccd.a(ccd.o):「ローカルシンボル」に対する再配置R_X86_64_32Sは、共有オブジェクトの作成時に使用できません。 -fPICで再コンパイルする

「libccd.a」という名前の2つの異なるファイルがあることがわかりました。

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

最初のファイルを削除することで問題を解決しました。

2
Saeed Mohtasham

未定義のシンボルに対するR_X86_64_PC32の再配置は、通常、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#c
https://github.com/rpmfusion/lxdream/blob/master/lxdream-0.9.1-implicit.patch

2
Sérgio