2017-02-17 5 views
0

を使用して見ることができるプログラムを実行しているとき、私は以下のエラーが表示されます。プログラムの読み込み中にシンボルルックアップエラーが発生しました。シンボルは静的ライブラリで定義され、NM

/usr/bin/getinfo: symbol lookup error: /usr/pkl/libinfo.so: undefined symbol: GetList 

この機能は、「GetList」静的ライブラリliblist.aで定義されている実行ファイルにリンクされていること/usr/bin/getinfoとgccでコンパイルします。私は 'nm'コマンドを実行すると、実行可能なgetinfoにシンボルが定義されていることがわかります。ここでnmコマンドの出力です:

[email protected] $ nm /usr/bin/getinfo | grep GetList 
080a3d89 T GetList 

私もreadelfがコマンドを使用してチェックしており、ここでは出力です:共有ライブラリlibinfo.so

[email protected] $ readelf -a /usr/bin/getinfo | grep GetList 
1080: 080a3d89 1777 FUNC GLOBAL DEFAULT 15 GetList 

liblist.a静的ライブラリで定義されている機能のGetListのを呼び出します。 libinfo.soliblist.aの両方が、実行可能ファイル/usr/bin/getinfoに依存するものとしてリストされています。 liblist.aではなく、が依存関係として追加されましたlibinfo.so 私もobjdump -S /usr/bin/getinfo | grep GetListを実行しており、この関数のアセンブリコードを見ることができました。ただし、プログラムを実行すると、シンボル検索エラーでクラッシュします。これは共有ライブラリの問題ではなく、解決できません。助けてください。

答えて

0

おそらくdlopen(3)または同様の機能を使用して、共有オブジェクト/usr/pkl/libinfo.soを動的にロードしています。 getinfo(厳密なリンクコマンド)をどのようにコンパイルしたのか、および共有ライブラリをロードする方法(プログラム起動時にdlopen(3)を呼び出している場合、または自動的にプログラムを起動している場合)を知ることは興味深いでしょう。静的ライブラリのリンクは.oのファイルを抽出して実行可能ファイルにリンクするだけです)、GetListは静的ライブラリまたは*.oオブジェクトから来ていると言えます。

getinfo実行可能ファイルをリンクするための正確なコマンドシーケンスを表示し、dlopen(3)への呼び出しによってlibinfo.soをロードすると、呼び出しの前後のコンテキストも重要です。また、GetListがCまたはC++関数であるかどうか知ることは、C++シンボルがパラメータリストタイプのマッチングに対処するためにコンパイラによってマングルされているので、知っておきたいことです。おそらく、出力でCスタイルの関数nmが表示されていますが、C++ GetList関数を呼び出そうとしています。

ところで、リンクが完了した後、いくつかの静的ライブラリに関する依存情報についてどういう意味ですか?私はGetList関数がnm(1)出力に表示されるので、実行可能ファイルに含まれているとします。だから、ダイナミックリンク時にはlibinfo.so共有オブジェクトに利用できるはずです(これはリンクプロセスのリンカのいくつかのオプションによって決まります - これがあなたが使用したリンクコマンドを要求する理由です)。可能であれば、libinfo.soモジュールの正確なリンクコマンド。

質問を編集して欠落している情報を追加してください。お手伝いします。

関連する問題