主要观点:
- 二进制文件可能有静态或动态链接的依赖(共享库),各策略有优缺点,
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
脚本的运行方式及环境变量的作用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。