我有一个共享库,我想从主程序访问符号。例如:
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中引用主程序中的符号?
答案 0 :(得分:2)
在链接-rdynamic
:
test
选项
gcc -o test main.c -ldl -rdynamic
来自here:
-rdynamic 将标志-export-dynamic传递给支持它的目标上的ELF链接器。这指示链接器将所有符号(不仅是已使用的符号)添加到动态符号表中。 dlopen的某些用途需要此选项,或允许从程序中获取回溯。