「-fPIC で再コンパイルしてください」というエラーが発生します

「-fPIC で再コンパイルしてください」というエラーが発生します

CentOSでアスタリスクの後に./configuremakeコマンドを入力すると、次のエラーが発生します

/usr/bin/ld: /usr/local/lib/liblua.a(lapi.o): relocation R_X86_64_32 against `luaO_nilobject_' can not be used when making a shared object; recompile with -fPIC /usr/local/lib/liblua.a: could not read symbols: Bad value

これを試してみました./configure CFLAGS=-fPICが、上記と同じエラーが発生しました。

答え1

この時点で、Astarisk では動的ライブラリを構築しようとしています。この動的ライブラリは任意のメモリ位置にロードできるため、すべてが再配置可能である必要があります。フラグは-fPIC位置独立コードを意味し、コードはロード位置に依存しないように作成され、どこにでもロードされます。

このアスタリスクの動的ライブラリビルドの一部として、Luaインタープリターを導入しようとしています。動的ライブラリを導入するため、PICでコンパイルされたすべてのものが必要です。しかし、Luaの静的ライブラリを使用しています。ない-fPIC でビルドされています。静的ライブラリ内の lua オブジェクトは再配置できないため、これは拒否されます。

ところで:これが、-fPICアスタリスク ビルドに追加しても役に立たない理由です。互換性がないのは、アスタリスク コード オブジェクト (-fPIC が影響する可能性があります) ではなく、liblua.a、具体的には liblua.a によって運ばれるオブジェクト (例: lapi.o) です。さらに、その時点では動的ライブラリをビルドしており、その時点でまとめようとしているアスタリスク オブジェクトに対して、-fPIC などの再配置可能なコード フラグが既にあることは確かです。

解決策は3つあります。

  • 1 つは、ビルドから lua を削除することです。特に必要ではなく、「後で試してみると楽しいかもしれない」と考えている場合は、必要な機能を失わずに削除できる可能性があります。

  • もう 1 つは、Asterisk ビルドで参照できる liblua の動的バージョンを取得することですliblua.so。お使いのディストリビューションがわからないため、取得方法はわかりません。

  • もう 1 つの、より面倒な方法は、-fPIC を使用して lua と liblua.a を再構築することです。ビルド フラグ (作成したものとディスク上にあるその他のもの) の不一致により互換性の問題が発生する可能性があります。そのため、現在ビルドされている lua と一致する liblua.so を見つける方がよいオプションだと思います。

liblua.so を見つけた場合は、'-rpath' リンカー フラグ、具体的には '-Wl,-rpath,/path/to/lua/libs' を調べることをお勧めします。

関連情報