システムに 2 つのクラスとライブラリを追加し、そこparent.so
からchild.so
派生させています。
問題は、プログラムがロードchild.so
されているときに、 から親の仮想関数の定義を見つけることができないことparent.so
です。
何が起こるのですか、
nm -D child.so
次のようなものを提供します(名前を変更しただけです)
U _ZN12PARENT15virtualFunctionEv
実行中のプログラムがクラッシュします
_handle = dlopen(filename, RTLD_NOW|RTLD_GLOBAL); //filename is child.so
エラーが発生しますLD_DEBUG = libs
symbol lookup error: undefined symbol: _ZN12PARENT15virtualFunctionEv (fatal)
説明できないのは、LD_DEBUG = symbols
GDB を使用しdlopen
てみましたparent.so
。しかし、libs ログからparent.so
は既にロードされ、コードが実行されており、他のすべてのライブラリと同じパスにあります。
......
27510: symbol=_ZN12PARENT15virtualFunctionEv; lookup in file=/lib/tls/libm.so.6
27510: symbol=_ZN12PARENT15virtualFunctionEv; lookup in file=/lib/tls/libc.so.6
27510: symbol=_ZN12PARENT15virtualFunctionEv; lookup in file=/lib/ld-linux.so.2
27510: child.so: error: symbol lookup error: undefined symbol: _ZN12PARENT15virtualFunctionEv(fatal)
プログラムまたはシステムは、シンボルの定義を探すライブラリをどのように管理していますか?
私は Linux を初めて使用します。作業の指示を誰か教えてもらえますか?
ありがとう。
編集
parent.so
ファイルを生成するために使用されるコマンドは
c++ -shared -o parent.so parent.o
についても同様ですchild.so
。ここにリンクするために不足している情報はありますか? 子には親のヘッダー ファイルのみが含まれているようです。
EDIT2
別のテストの後、呼び出し
_handle = dlopen("parent.so", RTLD_NOW|RTLD_GLOBAL);
クラッシュする行が問題を解決する前に、これはもともとロードされていなかったことを意味すると思いますparent.so
。しかし、その原因についてはまだよくわかっていません。