2

メインプログラムからシンボルにアクセスしたい共有ライブラリがあります。例えば:

main.c

#include <stdio.h>

void bar(void) { puts("bar"); }

extern void foo(void);

int main(void) {
    foo();
    return 0;
}

foo.c

#include <stdio.h>

extern void bar(void);

void foo(void) {
    puts("foo");
    bar();
}

私は次のようにコンパイルして実行します:

gcc -c -fpic foo.c
gcc -shared -o libfoo.so foo.o
gcc -L$(pwd) -o test main.c -lfoo
./test

そして、期待どおりの出力が得られます。

foo
bar

ただし、ライブラリがロードされるタイミングを制御したいのでdlopen()、 andを使用する必要があります。dlsym()変更されたファイルは次のとおりです。

main.c

#include <stdio.h>
#include <dlfcn.h>

void bar(void) { puts("bar"); }

int main(void) {
    void *handle = dlopen("./libfoo.so", RTLD_LAZY);
    void (*foo)(void) = (void(*)(void))dlsym(handle,"foo");
    foo();
    return 0;
}

foo.c

#include <stdio.h>
#include <dlfcn.h>

extern void bar(void);

void foo(void) {
    puts("foo");
    bar();
}

代わりに、次のようにコンパイルして実行します。

gcc -c -fpic foo.c
gcc -shared -o libfoo.so foo.o
gcc -o test main.c -ldl
./test

ただし、今回は出力を取得します

foo
./test: symbol lookup error: ./libfoo.so: undefined symbol: bar

libfoo からメインプログラムのシンボルを参照するにはどうすればよいですか?

4

1 に答える 1

3

-rdynamicリンク時にオプションを追加する必要がありますtest

gcc -o test main.c -ldl -rdynamic

ここ から:

-rdynamic フラグ -export-dynamic を、それをサポートするターゲット上の ELF リンカに渡します。これにより、リンカーは、使用されているシンボルだけでなく、すべてのシンボルを動的シンボル テーブルに追加するように指示されます。このオプションは、dlopen を使用する場合や、プログラム内からバックトレースを取得できるようにするために必要です。

于 2015-07-02T19:43:58.373 に答える