Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在静态/动态链接情况下,如何将库依赖性写入ELF可执行文件的.dynamic部分?_Linux_Dynamic_Linker_Ldd - Fatal编程技术网

Linux 在静态/动态链接情况下,如何将库依赖性写入ELF可执行文件的.dynamic部分?

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

我们可以使用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”的唯一线索,在这种情况下,编译器/链接器如何知道“date”依赖于“libc.so”?它是否解析所有“dlopen”行以提取库依赖关系?我认为这不是一个好方法,但真的,这是真的吗


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

    一个
    文件中的内容比
    .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即可。还有别的办法吗?