我们可以使用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)
由于“date”依赖于“libc.so”,我假设“date”调用“libc.so”中的某个函数,并且我们知道ldd可以从可执行文件的.dynamic部分确定“date”的lib依赖性,但我的问题是编译器/链接器如何知道应该写入.dynamic部分?更具体一点:
如果“libc.so”与“date”静态链接,则此函数的代码应该已经编译为“date”,因此在这种情况下“date”不应该依赖于“libc.so” “,.dynamic部分应该没有”libc.so“。
如果“libc.so”与“date”动态链接,在这种情况下,我假设有些代码如下:
handle = dlopen(“libc.so”,..);
应该在“date”中加载“libc.so”,而“dlopen(”libc.so“)”应该是“date”依赖于“libc.so”的唯一线索,在这种情况下,如何编译器/链接器是否知道“日期”取决于“libc.so”?它解析所有“dlopen”行来提取lib依赖吗?我认为这不是一个好方法,但实际上,这是真的吗?
或者编译器/链接器是否有其他方法来确定动态链接情况下的lib依赖性?感谢。
答案 0 :(得分:2)
编译器/链接器如何知道应该写入什么.dynamic section
.dynamic
部分libc.a
还是libc.so
进行关联。对于您要链接的任何*.so
[1],它会将DT_NEEDED
条目写入.dynamic
部分。我假设有些代码如下:
handle = dlopen("libc.so", ..);
这是不正确的假设和您的误解。 dlopen
允许您使用不依赖直接的库(以及可能存在或不存在的库)。您执行的库直接依赖(例如libc.so
):
[1]链接器标志--as-needed
使该语句仅部分为真。
答案 1 :(得分:0)
.so
文件中的内容多于.dynamic
个部分。阅读有关Executable and Linkable Format的更多信息(ELF是.so
文件和二进制可执行文件的格式。)
特别是ELF文件确实有标题,这些文件包含信息。使用objdump
和/或readelf
实用程序来浏览它们。
不要忘记在构建共享库时,可以将其与其他库链接。