我们可以使用 ldd 来确定依赖关系,例如:
sjwang@delpe02-179: ldd `which date`
linux-vdso.so.1 => (0x00007fff0f5fd000)
librt.so.1 => /lib64/librt.so.1 (0x00002b2f7ea50000)
libc.so.6 => /lib64/libc.so.6 (0x00002b2f7ec59000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b2f7efb1000)
/lib64/ld-linux-x86-64.so.2 (0x00002b2f7e832000)
由于“日期”依赖于“libc.so”,我假设“日期”调用“libc.so”中的某个函数,并且我们知道 ldd 可以从可执行文件的 .dynamic 部分确定“日期”的 lib 依赖关系,但我的问题是编译器/链接器如何知道应该将什么写入 .dynamic 部分?更加具体:
如果“libc.so”与“date”静态链接,那么这个函数的代码应该已经编译成“date”,所以在这种情况下“date”不应该依赖“libc.so”,应该没有.dynamic 部分中的“libc.so”。
如果“libc.so”与“date”动态链接,在这种情况下,我假设一些代码是这样的:
句柄 = dlopen("libc.so", ..);
应该存在于 "date" 中以加载 "libc.so",并且 "dlopen("libc.so")" 应该是 "date" 依赖于 "libc.so" 的唯一线索,在这种情况下,编译器/链接器知道“日期”取决于“libc.so”吗?它是否解析所有“dlopen”行以提取 lib 依赖关系?我认为这不是一个好方法,但真的,这是真的吗?
或者编译器/链接器是否有其他方法来确定动态链接情况下的 lib 依赖性?谢谢。