web-dev-qa-db-ja.com

`.rodata 'に対するR_X86_64_32Sの再配置... 64ビットプラットフォームでのコンパイル中

だから私は32ビットで何かをコーディングしてきましたが、昨日はdllを構築する必要があり、それに関していくつかの問題がありました。とにかく私はそれらを解決しました ここ

残念ながら、すべてが機能していると思ったとしても、64bitで動作するプログラムとメイクファイルを他のコンピューターに移動した場合はそうではないことがわかりました。

だから私の問題は64ビットのための再配置に関連しています

/usr/bin/ld: MyClass.o: relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
MyClass.o: could not read symbols: Bad value

ここに私のメイクファイルがあります

MyProgram: main.o chkopts
    -${CLINKER} -o $@ $< ${MYLIB} ${PETSC_MAT_LIB}
    ${RM} main.o

    export LD_LIBRARY_PATH=${LIBADD}:$LD_LIBRARY_PATH

LibMyProgram.so: MyClass.o  chkopts
    -${CLINKER}  -shared -Wl,-soname,${SONAME} -o ${VERS}   *.o  ${PETSC_MAT_LIB}

    mv ${VERS} ${LIBADD}
    ln -sf ${LIBADD}${VERS} ${LIBADD}${SOWOV}
    ln -sf ${LIBADD}${VERS} ${LIBADD}${SONAME}

CFLAGS、CPPFLAGS、さらにLDFLAGSに-fPICを追加しようとしました。また、-sharedフラグの前後に-fPICを追加しようとしました。

-${CLINKER} -shared -fPIC -Wl,-soname,${SONAME} -o ${VERS}   *.o  ${PETSC_MAT_LIB}

ただし、以前と同じエラーが表示されます。

CFLAGS = -fPICを使用すると、次のようなエラーが少し発生します。

.../petsc/petsc-3.2-p6/Arch-linux2-cxx-debug/lib/libpetsc.a(err.o): relocation R_X86_64_32 against `ompi_mpi_comm_self' can not be used when making a shared object; recompile with -fPIC.

私は自分の問題と少しでも似ているトピックをすべて読みましたが、これを理解することができませんでした。

25
Mare

解決策は、すべてを-fPICでコンパイルし、共有オブジェクトを-sharedでリンクすることでした。

Make_basedプロジェクトの場合、-fPICCFLAGSまたはCXXFLAGSに追加します。

4
Mare

静的ライブラリをリンクする必要がある共有ライブラリを作成しようとすると、同じ問題が発生しました。

-fPICをCXXFLAGSに追加して、静的ライブラリにアーカイブされた.oファイルをコンパイルすることで問題を解決しました。

9
user2391685

CentOS 6.5でxmlrpc-c-1.06.41をコンパイルしようとすると、同じリンクの問題が発生しました。これは、以下によって解決されました。/src/cppで、Makefileを変更しました。

CXXFLAGS = $(CXXFLAGS_COMMON) $(CFLAGS_PERSONAL) $(CADD) -shared -fPIC

フラグに関する詳細情報を見つけることができます link

4
Saeed

「-fPIC」を追加した後もこの問題が解決しない場合は、すべての.oファイルを消去して、再度実行してください。

3
Xin

私もこの問題に直面しています。 @Mareと@ user2391685を使ってみたところ、うまく機能します:

-fPICファイルにcomepileされるときに.oを使用する:例:

gcc -Wall -fPIC -c hello.c -I./ -I/usr/lib/jvm/Java/include/ -I/usr/lib/jvm/Java/include/linux/

その後、.soファイルを作成できます。

gcc -Wall -rdynamic -shared -o libhello.so hello.o Main.h -I/usr/lib/jvm/Java/include/ -I/usr/lib/jvm/Java/include/linux/
1
Strong