如何在静态/动态链接案例中将lib依赖写入ELF可执行文件的.dynamic部分?

时间:2013-01-04 07:19:11

标签: 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)
        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部分?更具体一点:

  1. 如果“libc.so”与“date”静态链接,则此函数的代码应该已经编译为“date”,因此在这种情况下“date”不应该依赖于“libc.so” “,.dynamic部分应该没有”libc.so“。

  2. 如果“libc.so”与“date”动态链接,在这种情况下,我假设有些代码如下:

  3. handle = dlopen(“libc.so”,..);

    应该在“date”中加载“libc.so”,而“dlopen(”libc.so“)”应该是“date”依赖于“libc.so”的唯一线索,在这种情况下,如何编译器/链接器是否知道“日期”取决于“libc.so”?它解析所有“dlopen”行来提取lib依赖吗?我认为这不是一个好方法,但实际上,这是真的吗?

    或者编译器/链接器是否有其他方法来确定动态链接情况下的lib依赖性?感谢。

2 个答案:

答案 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实用程序来浏览它们。

不要忘记在构建共享库时,可以将其与其他库链接。