从使用 dlopen 加载的共享库中引用全局符号 [英] Referencing global symbols from shared library loaded with dlopen

查看:42
本文介绍了从使用 dlopen 加载的共享库中引用全局符号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a shared library which I want to access symbols from the main program. For example:

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

我得到了我期望的输出:

And I get the output I expect:

foo
bar

但是,我必须使用 dlopen()dlsym() 因为我想控制库的加载时间.更改的文件是:

However, I must use dlopen() and dlsym() because I want to have control over when the library is loaded. The changed files are:

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

然而,这次我得到了输出

However, this time I get the output

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

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

How can I reference symbols in the main program from libfoo?

推荐答案

链接test时必须添加-rdynamic选项:

gcc -o test main.c -ldl -rdynamic

这里:

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

-rdynamic Pass the flag -export-dynamic to the ELF linker, on targets that support it. This instructs the linker to add all symbols, not only used ones, to the dynamic symbol table. This option is needed for some uses of dlopen or to allow obtaining backtraces from within a program.

这篇关于从使用 dlopen 加载的共享库中引用全局符号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆