13

実行可能ファイルと動的ライブラリ (.so) があります。ライブラリはいくつかのシンボルをエクスポートし、実行可能ファイルはそれを正常に呼び出します。しかし、実行可能関数のライブラリ呼び出しを可能にしたいと考えています。実行可能ファイルで次のことを試みました:

//test
extern "C" void print(const char * str) {
    std::cout << str << std::endl;
}

そしてこれはライブラリにあります:

extern "C" void print(const char *);

dlopenしかし、 (ライブラリをロードするために)実行可能ファイルを呼び出すと、エラーが返されますundefined symbol: print。どうすれば修正できますか?

4

2 に答える 2

14

Linux/ELF では、-export-dynamicオプションをリンカー (-rdynamicコンパイラ ドライバー上gcc) に渡すことができるため、実行可能ファイルのシンボルが共有オブジェクトにエクスポートされます。

print実行可能ファイルは通常、シンボル解決のために共有オブジェクトの前に検索されるため、実行可能ファイルの実装によってシャドウされるライブラリにダミーの実装があります。

これには、あまりきめの細かいものではないという欠点があります。意図しないシンボルをオーバーライドしてしまう可能性があります。より細かいオプションは、次のようにエクスポートするシンボルのリストを作成することです。

{
    print;
    <other symbols>
};

そのリストをリンカーに渡します。たとえば、gcc から:-Wl,--dynamic-list=<file with list of symbols>

于 2011-06-09T19:52:28.137 に答える
4

これを実現する簡単な方法は、後でライブラリが使用できるように実行可能ファイルに関数を登録させることです。ライブラリは関数へのポインタを格納し、後でそれを呼び出すことができます。

于 2011-06-09T12:11:29.170 に答える