C 为什么动态链接器不能';当共享库依赖于其他共享库时,是否解析引用?
下面是我的代码:C 为什么动态链接器不能';当共享库依赖于其他共享库时,是否解析引用?,c,linux,gcc,linker,dynamic-linking,C,Linux,Gcc,Linker,Dynamic Linking,下面是我的代码: //a.c I don't use header files as this is just for demo purpose. extern void function_b(int num); void function_a(int num) { function_b(num) } //dll.c #包括 int main() { 无效*手柄a; 无效*句柄b; 无效(*pfunc_a)(int); ... 句柄a=dlopen(“./a.so”,RTLD\
//a.c I don't use header files as this is just for demo purpose.
extern void function_b(int num);
void function_a(int num)
{
function_b(num)
}
//dll.c
#包括
int main()
{
无效*手柄a;
无效*句柄b;
无效(*pfunc_a)(int);
...
句柄a=dlopen(“./a.so”,RTLD\u LAZY);
...
pfunc_a=dlsym(手柄a,“功能a”);
...
handle_b=dlopen(“./b.so”,RTLD_GLOBAL);
...
pfunc_a(2020年);
...
返回0;
}
我们可以看到,dll.c
尝试在运行时加载共享库,模块a
参考了函数b
,模块b
定义了函数b
。假设我们已经创建了共享库a.so
,和b.so
,这样这些共享库在程序运行之前就存在于磁盘上
但当我运行程序时,它会抛出一个符号查找错误:
./a.so:未定义符号:函数
但是对于这行代码,handle\u a=dlopen(“./a.so”,RTLD\u-LAZY)代码>
下面是我对RTLD\u LAZY
标志的理解:
由于我在这里使用了RTLD\u LAZY
,运行时链接器不会尝试解析符号function\u b
,在调用function\u a
之前,我有机会调用dlopen(“b.so”,RTLD\u GLOBAL)
。这样,动态链接器将使用b.so中的函数的定义修改a.so中的引用
如果我的理解是正确的,那么为什么动态链接器在这种情况下仍然无法解析函数b
?使用我的Linux版本,dlopen()
不执行任何操作,如果现在既没有给出RTLD\u
也没有给出RTLD\u-LAZY
,则返回NULL
。也许你必须使用(RTLD\u NOW | RTLD\u GLOBAL)
或(RTLD\u LAZY | RTLD\u GLOBAL)
而不是在第二次dlopen()
调用中使用RTLD\u GLOBAL
。@Martinoseau好的,我会试试看。为了确认在调用dlopen(“b.so”,RTLD_GLOBAL)
时,动态链接器应该修改a.so的数据部分
,以便它可以链接/重新定位到b.so的文本
部分中的函数
的指令地址,我的理解正确吗?请发邮件至。
//b.c
void function_b(int num)
{
...
}
//dll.c
#include <dlfcn.h>
int main()
{
void *handle_a;
void *handle_b;
void (*pfunc_a)(int);
...
handle_a = dlopen("./a.so", RTLD_LAZY);
...
pfunc_a = dlsym(handle_a, "function_a");
...
handle_b = dlopen("./b.so", RTLD_GLOBAL);
...
pfunc_a(2020);
...
return 0;
}