2.9 KiB
2.9 KiB
tags, date created, date modified
| tags | date created | date modified |
|---|---|---|
| 星期三, 十一月 19日 2025, 5:03:58 下午 | 星期三, 十一月 19日 2025, 5:04:15 下午 |
1.2.3 链接器与加载器配置 (Linker & Loader)
1. 链接器身份与版本 (Linker Identity)
-
关键性:P1
-
信息解析:
- 组件版本:GNU ld (Binutils) 2.34。这是一个相对较新的版本,完全支持 AArch64 的各种重定位类型(Relocation Types)和 LTO 插件。
- 兼容性:与 GCC 7.3 和 Clang 18 均能良好配合。
-
探测命令与结果:
ld --version GNU ld (GNU Binutils) 2.34
2. 二进制依赖解析 (Binary Dependency Analysis)
-
关键性:P0
-
信息解析:
- 直接依赖 (NEEDED):
libcudart.so.2。- 深度解读:这非常有意思。编译器(Clang)在编译时似乎模仿了 CUDA 10.2 的 ABI 行为,或者链接了伪装成 10.2 版本的存根库。这是为了让旧的 CUDA 代码无缝迁移。
- 运行时路径 (RPATH):
/usr/local/corex/lib。- 评价:优秀配置。CMake 构建脚本通过
CMAKE_INSTALL_RPATH或自动计算,将 SDK 库路径硬编码到了 ELF 文件头中。这是避免“DLL 地狱”的最佳实践。
- 评价:优秀配置。CMake 构建脚本通过
- 直接依赖 (NEEDED):
-
探测命令与结果:
readelf -d …/bin/main_app | grep -E "RPATH|NEEDED" 0x0000000000000001 (NEEDED) 共享库:[libcudart.so.2] 0x000000000000000f (RPATH) Library rpath: [/usr/local/corex/lib]
3. 运行时加载器解析 (Runtime Loader Resolution)
-
关键性:P0
-
信息解析:
- 解析结果:
ldd显示libcudart.so.2被成功解析到了/usr/local/corex/lib/libcudart.so.2。 - 结论:运行时链接器(ld-linux)在执行程序时,优先读取了 RPATH,找到了正确的文件,而没有去系统默认目录瞎找。程序一定能跑起来,不会报
cannot open shared object file。
- 解析结果:
-
探测命令与结果:
ldd …/bin/main_app libcudart.so.2 => /usr/local/corex/lib/libcudart.so.2 (0x0000fffeda1a0000)
4. 系统级库路径污染 (System Library Path State)
-
关键性:P2
-
信息解析:
- 环境变量:
LD_LIBRARY_PATH被设置了多次重复的/usr/local/corex-4.3.8/lib。- 风险:虽然 RPATH 优先级高于
LD_LIBRARY_PATH,但这种冗余设置可能在调试(Debug)或运行其他未设置 RPATH 的工具时引发困惑。建议在.bashrc中清理去重。
- 风险:虽然 RPATH 优先级高于
- ld.so.conf:系统中没有专门针对 corex 的
.conf文件。这进一步凸显了 CMake 中设置 RPATH 的重要性——如果 CMake 没设 RPATH,程序必挂。
- 环境变量:
-
探测命令与结果:
echo $LD_LIBRARY_PATH /usr/local/corex-4.3.8/lib:/usr/local/corex-4.3.8/lib:… (重复)