Linux 在静态/动态链接情况下,如何将库依赖性写入ELF可执行文件的.dynamic部分?
我们可以使用ldd来确定相关性,如:Linux 在静态/动态链接情况下,如何将库依赖性写入ELF可执行文件的.dynamic部分?,linux,dynamic,linker,ldd,Linux,Dynamic,Linker,Ldd,我们可以使用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) libpthr
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部分的内容?更具体地说:
或者编译器/链接器是否有其他方法来确定动态链接情况下的库依赖性?谢谢。一个
文件中的内容比.dynamic
部分更多。了解更多信息(ELF是.so
文件和二进制可执行文件的格式)
特别是ELF文件确实有标题,这些标题包含信息。使用objdump
和/或readelf
实用程序浏览它们
不要忘记,在构建共享库时,可以将其与其他库链接
编译器/链接器如何知道应该写入什么。动态部分
- 编译器对
.dynamic
节一无所知
- 链接器知道您是使用
libc.a
还是使用libc.so
进行链接。对于链接[1]的任何*.so
,它将DT_NEEDED
条目写入.dynamic
部分
我假设一些代码是这样的:handle=dlopen(“libc.so”,…)代码>
这是你的错误假设和误解。dlopen
允许您使用不直接依赖的库(可能存在也可能不存在)。您直接依赖的库(例如libc.so
):
- 不需要DLOPEN(加载程序在程序启动之前已经为您映射了它们),并且
- 不是可选的(如果缺少,加载程序将严重失败)
[1] 链接器标志--根据需要
仅部分正确。感谢您的回答。但我同意,对于不直接依赖编译器的共享库,只需通过dlopen
将其写入.dynamic即可。还有别的办法吗?