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;
}