man ld.so 的翻译
发布日期:2021-05-10 10:33:00 浏览次数:22 分类:精选文章

本文共 1891 字,大约阅读时间需要 6 分钟。

动态库加载器是一个关键的技术组件,负责在运行时加载程序所需的共享库文件。以下是关于动态库加载器的详细说明:

动态库加载器的作用

动态库加载器(Dynamic Linker)在程序运行时负责查找并加载所需的动态库(Shared Object files, 简称SO files)。默认情况下,Linux系统使用两个主要的动态库加载器:/lib/ld.so/lib/ld-linux.so.*。这两个加载器几乎在功能上是等同的,支持文件、ldconfig命令和dd程序,以及/etc/ld.so.conf配置文件。

动态库查找的顺序

程序需要查找的动态库文件遵循以下顺序进行搜索:

  • ELF格式文件:当程序使用ELF格式(红帽Collective Library File, 通常是glibc或libc5及以后的版本)时,如果程序运行时不会设置setuid或setgid权限,则动态库加载器将首先查找DT_RUNPATH属性,接着查找DT_RPATH属性。虽然DT_RPATH已经被弃用,但它可能存在于二进制程序的动态链接部分中。

  • LD_LIBRARY_PATH环境变量:程序检查LD_LIBRARY_PATH环境变量所指定的路径。如果程序具备setuid或setgid权限,此步将被跳过。

  • LD.so.cache缓存文件:从/etc/ld.so.cache文件中查找符合条件的动态库。如果程序在编译时使用了-z nodeflib选项,则忽略/etc/ld.so.cache中的结果。

  • 默认系统目录:在/lib/usr/lib中查找动态库文件。如果程序在编译时使用了-z nodeflib选项,此步将被跳过。

  • LD_BIND_NOT和LD_BIND_NOW:动态库加载器还会考虑这些环境变量的影响。

  • 使用$ORIGIN

    动态库加载器支持使用$ORIGIN符号,表示包含可执行程序的目录。通过在编译时使用-Wl,-rpath,'$ORIGIN/../lib'选项,可以让程序在指定的相对路径中查找动态库,而无需关心程序的绝对路径位置。这使得程序能够在任何目录中运行,而无需预先安装到特定的目录结构中。

    环境变量

    以下是几个关键的环境变量,用于控制动态库加载器的行为:

    • LD_BIND_NOW:如果设定为非空值,则动态库加载器会在程序启动时预先解决所有符号依赖,而不是延迟处理。适用于调试器等需要符号解析时的使用。

    • LD_LIBRARY_PATH:类似于PATH环境变量,用于指定应该检查的动态库路径。如果程序具备setuid或setgid权限,此变量将被忽略。

    • LD_PRELOAD:允许用户指定需要在其他动态库加载之前加载的额外动态库文件。可以用于覆盖默认的动态库行为,并对特定程序进行定制。

    • LD_TRACE_LOADED_OBJECTS:当设定为非空值时,程序会输出所依赖的动态库文件名,而不是实际运行它们。适用于调试和依赖追踪。

    硬件兼容性

    一些库文件可能会依赖特定的硬件指令,例如sse2扩展。建议将这些库安装在具有相应硬件支持的目录中,例如/usr/lib/sse2。当前支持的硬件特性包括Alpha、PowerPC、SPARC、x86(32位)、z系列等。

    安全提示

    对于setuid或setgid的程序,使用某些环境变量可能带来安全风险。例如,设置了setuid权限的程序运行时,通常会跳过LD_LIBRARY_PATH和其他动态库查找路径,以减少因动态库加载错误导致的安全问题。因此,某些环境变量需要特别谨慎地处理,避免可能导致提权的操作。

    关键文件

    以下是动态库加载器相关的重要文件和目录:

    • /lib/ld.so:处理a.out格式的动态库加载。

    • /lib/ld-linux.so.*:处理ELF格式的动态库加载。

    • /etc/ld.so.cache:包含动态库的路径列表和依赖展示。

    • /etc/ld.so.preload:指定需要在程序启动前加载的动态库。

    • lib*.so*:动态库文件的标准命名格式。

    技术命令

    动态库加载器支持多种选项和命令,如--verify用以验证程序和动态库兼容性,如--list用以列出依赖链等。通过正确使用这些命令可以更好地管理动态库依赖关系。

    如果需要进一步了解动态库加载器的操作,可以使用LD_DEBUG环境变量来调试和日志记录。通过设置LD_DEBUG=libs或其他子选项,可以分别显示库文件的搜索路径、重新定位处理情况等信息。

    动态库加载器作为Linux系统的核心组件之一,其理解和正确配置对于程序的性能和安全性至关重要。

    上一篇:lsof 原理及其运行时关闭多个描述符的行为
    下一篇:你还停留在只能解决自我能力范围之内的问题吗?

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年05月03日 03时40分21秒