Linux ARM プラットフォームで dlopen を使用して提供された (クローズド ソース) 共有ライブラリ (プラグイン) をロードしようとしています。私はこの方法でロードしようとしています:
void* handle = dlopen(<library_path>/<library_name>, RTLD_NOW);
結果は、次のメッセージで失敗します。
Failed to load <library_path>/<library_name>: undefined symbol: <symbol_name>.
nmでライブラリ内を調べてみましたが、libが剥ぎ取られたようで、シンボルが見つかりませんでした。readelf -s も試してみたところ、実際に次の結果が得られました。
12663: 00000000 0 NOTYPE GLOBAL DEFAULT UND <symbol_name>
読んでみると、 readelf -s が参照するライブラリで定義されているシンボルを含むすべてのシンボルが返されることがわかりました。
この質問への答えは私には完全に明確ではありません:これはライブラリにあるはずのシンボルであり、間違った方法でコンパイルされたために存在しないシンボルですか、それとも他の場所で見つけられるはずのシンボルですか? readelf -d の出力は、必要なすべての共有ライブラリを提供していることを示唆しているようです。このエラーは、実行可能ファイルをコンパイルする方法の間違いに関連している可能性がありますか、それともローダーとは関係ありませんか?
また、各列の意味について読みましたが、それらの値はかなり奇妙です。そのシンボルの説明をどのように解釈しますか? アドレスが0なのはなぜですか?タイプが NOTYPE である理由