ソースコードをダウンロードしてコンパイルしたプログラムを実行しようとしています。プログラムを実行しようとすると、次のメッセージが表示され続けます。
unable to load undefined symbol _z15InvalidateImageSs
このエラーが発生する理由を確認しようとしています。プログラムは実際には他のプログラムによってロードされたライブラリです。私のプログラムは.soファイルにコンパイルされます。
私は走る:
$ nm myprog.so > nm.txt
シンボルはファイルに表示されますが、関連付けられたアドレスはありません。
- 以下を使用してソースツリーからシンボルを検索します。
$ find . -type f | xargs fgrep -I '_zinvalidateimagess' | grep -v 'Binary
結果はありません。 2.すべての標準ロードライブラリでこのシンボルを検索しました。
$ scanelf -l -s _zInvalidateImageSs | grep -I '_zinvalidateImageSs'
今回も結果はありません。
だから私の質問は:シンボルがソースツリーのどこでも参照されない場合、.soファイルに問題があるのはなぜですか?このシンボルがどこから来たのか、どうすればわかりますか?
答え1
このライブラリのソースは次のとおりです。発表する一つのシンボルではない定義あ、こんなことをして
extern InvalidateImage(const char *);
それからそれを使う
const char *foo = InvalidateImage(bar);
ライブラリなので、そのシンボルを使用するプログラムを実行しないと、それはわかりません。行く場所バラよりシンボルはライブラリソースをダウンロードした場所です。ライブラリ開発者が関連ソースを直接提供したか、ソースをどこで取得したかについての手がかりを提供した可能性があります。
それだけの価値があるのでスクリプト(exports
そしてexterns
)私が管理しているプログラムにシンボルがないことを確認してください。
追加資料: