64 lines
2.9 KiB
Markdown
64 lines
2.9 KiB
Markdown
---
|
||
tags:
|
||
date created: 星期三, 十一月 19日 2025, 5:03:58 下午
|
||
date modified: 星期三, 十一月 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 均能良好配合。
|
||
- **探测命令与结果**:
|
||
|
||
```bash
|
||
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 地狱”的最佳实践。
|
||
- **探测命令与结果**:
|
||
|
||
```bash
|
||
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`。
|
||
- **探测命令与结果**:
|
||
|
||
```bash
|
||
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` 中清理去重。
|
||
- **ld.so.conf**:系统中没有专门针对 corex 的 `.conf` 文件。这进一步凸显了 CMake 中设置 RPATH 的重要性——如果 CMake 没设 RPATH,程序必挂。
|
||
- **探测命令与结果**:
|
||
|
||
```bash
|
||
echo $LD_LIBRARY_PATH
|
||
/usr/local/corex-4.3.8/lib:/usr/local/corex-4.3.8/lib:… (重复)
|
||
```
|