流程如何在Linux中找到动态共享库?

时间:2014-07-23 05:42:24

标签: linux process elf dynamic-loading

我正在阅读APUE并看到以下内容:

  

a.out中存在多个段类型,包含符号表,调试信息,动态共享库的链接表等。这些附加部分不会作为进程执行的程序映像的一部分加载。

但是,如果动态共享库的链接表没有加载到程序的映像中,进程如何找到必要的.so

1 个答案:

答案 0 :(得分:1)

  1. 动态链接器作为程序解释器通过链接期间添加到程序头的.interp(PT_INTERP)部分加载。

  2. 动态链接器读取DT_NEEDED ELF标记(在静态链接期间添加)以确定需要解析的共享库。

  3. 最后,关于解析图书馆deps,来自ld.so(8)

  4.   

    在解析库依赖关系时,动态链接器首先检查   每个依赖关系字符串,以查看它是否包含斜杠(这可能会发生   如果在链接时指定了包含斜杠的库路径名)。   如果找到斜杠,则依赖关系字符串将被解释为a   (相对或绝对)路径名,并使用它加载库   路径名。

         

    如果库依赖项不包含斜杠,则搜索它   按以下顺序:

         
        
    • (仅限ELF)使用DT_RPATH动态中指定的目录   二进制文件的section属性(如果存在)和DT_RUNPATH属性   不存在。不推荐使用DT_RPATH。

    •   
    • 使用环境变量LD_LIBRARY_PATH。除非是   executable是set-user-ID / set-group-ID二进制文件,在这种情况下是   忽略。

    •   
    • (仅限ELF)使用DT_RUNPATH动态中指定的目录   二进制文件的section属性(如果存在)。

    •   
    • 来自缓存文件/etc/ld.so.cache,其中包含已编译的列表   之前在扩充库路径中找到的候选库。   但是,如果二进制文件与-z nodeflib链接器选项链接,   跳过默认库路径中的库。图书馆   安装在硬件功能目录(见下文)中是首选   到其他图书馆。

    •   
    • 在默认路径/ lib中,然后在/ usr / lib中。如果二进制文件已链接   使用-z nodeflib链接器选项,将跳过此步骤。

    •