メモ程度
Editing error while loading shared libraries: unexpected PLT reloc type 0x00
原因
動的ライブラリのシンボル解決に関係する問題が原因であることが多い。
遭遇した原因:
- リンクされた動的ライブラリとの位置関係が、本体のビルド時と異なっていた
- 動的ライブラリとリンクした時に、シンボル間で名前の衝突が発生した
- 存在しないシンボルを指定した
1. 位置関係
例えば、libhoge.so を使う fuga.c を以下の位置関係でビルドしたのに、
---/lib/libhoge.so
|
---/fuga.c
実行環境では同じディレクトリに入れられていた、とか(だった気がする)
2. 名前
ライブラリ内で定義されている関数と同名の関数を、本体のコードでも定義していた、等、シンボル間で名前の衝突が発生した場合。
chatGPT に聞いてみた
はい、おっしゃる通りです。「./fuga: error while loading shared libraries: unexpected PLT reloc type 0x00
」というエラーは、動的ライブラリのシンボル解決に関連する問題が原因で発生する可能性が高いです。この種のエラーは、通常、実行時のリンク処理における問題を示唆しています。
シンボル解決に関するエラーの原因
-
動的ライブラリのリンクの問題: プログラムが依存する動的ライブラリの一つまたは複数が適切にリンクされていない、または見つからないことが原因で、シンボル解決に失敗している可能性があります。
-
互換性のないライブラリ: プログラムが依存しているライブラリのバージョンがプログラムの期待するものと異なる、または異なるアーキテクチャ用にビルドされている場合、シンボル解決の問題が発生することがあります。
-
シンボルの不足または名前の衝突: プログラムが期待する特定のシンボルが動的ライブラリ内に存在しない、またはシンボル名が他のライブラリ内のシンボルと衝突している場合、シンボル解決に失敗することがあります。
ソースコードの改修とエラーの関連性
ソースコードの改修がこの種のエラーの原因になり得ます。特に次のような変更が関連している可能性があります。
-
新しいライブラリの使用: ソースコードで新しい動的ライブラリを使用するように変更した場合、そのライブラリのリンクやシンボル解決に問題があると、このエラーが発生する可能性があります。
-
既存ライブラリの使用方法の変更: 既存の動的ライブラリの使用方法を変更した場合(例えば、異なる関数を呼び出すようにした場合)、そのライブラリ内の特定のシンボルが見つからない場合にエラーが発生することがあります。
-
リンカーの設定変更: リンカーの設定やコンパイルオプションを変更した場合、それがシンボル解決に影響を及ぼす可能性があります。
このエラーを解決するためには、動的ライブラリの依存関係やリンクの設定を詳細に検証し、ソースコードの変更履歴を見直して、最近の変更がエラーの原因になっていないかを確認することが重要です。また、実行環境での動的ライブラリの配置やバージョンにも注意を払う必要があります。
3. 存在しないシンボル
関数の名前を間違えたとか。
例えば以下のようなミスは、"unexpected ~" エラーの原因になる。
sizeof(hoge); // 正
// ~~~~~~~~~~~~~~~~
size(hoge); // 誤