引用从dlopen加载的共享库中的全局符号

时间:2015-07-02 18:40:05

标签: c shared-libraries dlopen dlsym

我有一个共享库,我想从主程序访问符号。例如:

children

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()因为我想要控制何时加载库。更改的文件是:

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

如何从libfoo中引用主程序中的符号?

1 个答案:

答案 0 :(得分:2)

在链接-rdynamic

时,您必须添加test选项
gcc -o test main.c -ldl -rdynamic

来自here

  

-rdynamic       将标志-export-dynamic传递给支持它的目标上的ELF链接器。这指示链接器将所有符号(不仅是已使用的符号)添加到动态符号表中。 dlopen的某些用途需要此选项,或允许从程序中获取回溯。