Linux 将共享对象中的符号解析为可执行文件

Linux 将共享对象中的符号解析为可执行文件,linux,dynamic-linking,Linux,Dynamic Linking,如何创建一个动态加载共享对象的可执行文件,并将其未定义的符号解析为可执行文件本身?在Linux上 例如,共享对象具有 extern int a; void f() { a=1; } 可执行文件 int a; 我想从可执行文件调用f(),并更改a的值 谢谢。从dlopen手册页: 库中的外部引用使用该库的依赖项列表中的库以及以前使用RTLD_全局标志打开的任何其他库进行解析。如果可执行文件与标志“-rdynamic”(或同义词“-export dynamic”)链接,则可执行文件中的全局符号也

如何创建一个动态加载共享对象的可执行文件,并将其未定义的符号解析为可执行文件本身?在Linux上

例如,共享对象具有

extern int a;
void f() { a=1; }
可执行文件

int a;
我想从可执行文件调用
f()
,并更改
a
的值


谢谢。

dlopen
手册页:

库中的外部引用使用该库的依赖项列表中的库以及以前使用RTLD_全局标志打开的任何其他库进行解析。如果可执行文件与标志“-rdynamic”(或同义词“-export dynamic”)链接,则可执行文件中的全局符号也将用于解析动态加载库中的引用


因此,使用
-rdynamic
重新编译主应用程序应该会有所帮助。

这应该是现成的。。你是如何编译你的例子的?@Phillip不是真的。。。使用
cc so.c-o a.so-shared-fPIC
和可执行文件(loader.c)
cc loader.c-o loader-ldl的共享对象(so.c)。使用
LD\u LIBRARY\u PATH=$PWD./loader运行
<代码>加载程序
抱怨“未定义符号:a”。共享对象加载了
dlopen(“a.so”,RTLD\u NOW)
。啊,我忽略了你问题中的动态。