共享库、运行时路径(rpath)和运行时链接器

主要观点:

  • 二进制文件可能有静态或动态链接的依赖(共享库),各策略有优缺点,ldd可用于了解二进制文件使用的共享库及位置。
  • 编译项目代码时遇到二进制文件运行错误,ldd显示某些共享库未找到,如liblz4.so.1,但实际又能找到,设置LD_LIBRARY_PATH也未解决问题。
  • 最终发现二进制文件有rpath设置,其值为$ORIGIN/./__libs__,因将二进制文件从工具链创建的位置复制到/tmp,导致二进制文件引用库的路径变为相对路径而无法找到库。
  • 了解到 ELF 二进制文件的运行机制,包括.interp节指定运行时链接器,ldd是脚本,通过调用/lib64/ld-linux-x86-64.so.2打印共享库依赖等。
  • 还学到关于rpath的知识,复制二进制文件到不同目录可能导致其无法工作,通过LD_TRACE_LOADED_OBJECTS等环境变量可获取运行时链接器的真实信息,但不同的链接器可能支持不同机制。

关键信息:

  • 编译项目时二进制文件运行错误及ldd显示的情况。
  • rpath的设置及作用,以及因复制二进制文件导致的问题。
  • ELF 二进制文件的运行机制,如.interp节和运行时链接器。
  • ldd是脚本及通过特定方式获取共享库依赖。

重要细节:

  • ldd输出中显示的二进制文件依赖的共享库路径及相关信息。
  • 二进制文件rpath的具体值及含义。
  • ELF 二进制文件运行时链接器的查找过程及相关示例。
  • ldd脚本的运行方式及环境变量的作用。
阅读 16
0 条评论