27

*.soオブジェクトを必要とする私の制御できない別のアプリケーションによって使用される共有ライブラリがあります。私のライブラリは、静的にリンクする必要があるsqlite3を利用しています(自己完結型のバイナリが絶対に必要です)。

ライブラリをコンパイルしてリンクしようとすると、次のようになります。

-fpic -flto -pthread -m64
-flto -static -shared

次のエラーが発生します。

/usr/bin/ld: /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/crtbeginT.o: relocation R_X86_64_32 against `__DTOR_END__' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/crtbeginT.o: could not read symbols: Bad value
collect2: ld returned 1 exit status

-fPICを使用した再コンパイルとは何に関連していますか?私のコードまたはCRT?

私はすでに-fPICを使用してオブジェクトをコンパイルしようとしましたが、同じ結果になりました。

ありがとう。

編集:

この問題はSQLite3に関連していないようです。

私は次のようにコンパイルしてリンクする単純な1行何もしないライブラリを作成しました。

g++ -c -fPIC -o bar.o bar.cpp
g++ -shared -o bar.so bar.o

しかし、これは好きではありません:

g++ -c -fPIC -o bar.o bar.cpp
g++ -static -shared -o bar.so bar.o

この問題はCRT(crtbeginT.o)に関連しているようです。GCC --with-picなどを再コンパイルする必要がありますか?

4

3 に答える 3

43

-static共有ライブラリを作成するときにフラグを使用しないでください。静的にリンクされた実行可能ファイルを作成するためのものです。

ライブラリの静的バージョンしかない場合は、を使用してリンクすることができます-lsqlite3。ただし、動的バージョン(.so)と静的バージョンの両方がある場合、リンカーは動的バージョンを優先します。

リンカに静的なものを選択するように指示するには、リンカに-Bstaticフラグを付け、。を使用して他のもの(libcや動的ランタイムサポートなど)の動的リンクに切り替えるようにし-Bdynamicます。つまり、フラグを使用します。

 -Wl,-Bstatic -lsqlite3 -Wl,-Bdynamic 

/usr/lib/libsqlite3.aまたは、コンパイラ/リンカフラグの代わりに、.aファイルのフルパスを指定することもできます。

GNU ldを使用する-l:libsqlite3.aと、の代わりにを使用することもできます-lsqlite3。これにより、リンカがデフォルトで優先するのlibsqlite3.a代わりにライブラリファイルを強制的に使用します。libsqlite3.so

.aファイルが-fpicフラグ付きでコンパイルされていることを確認してください。コンパイルされていない場合、通常は共有ライブラリに埋め込むことができません。

于 2011-07-09T22:18:05.860 に答える
8

どういうわけかダイナミックライブラリに入るコードは、再配置可能である必要があります。これは、静的または動的に関係なく、.soにリンクされているすべてのものを.soでコンパイルする必要があることを意味します-fPIC。具体的には、静的sqliteライブラリもでコンパイルする必要があります-fPIC

PICの意味の詳細はここにあります:http://en.wikipedia.org/wiki/Position-independent_code

于 2011-07-09T11:18:42.193 に答える
0

私も同じ問題を抱えていました。どうやら-staticは-Bstaticと同じではありません。-Bstaticに切り替えて、すべてが機能しました。

于 2015-07-28T15:50:30.447 に答える