Files
Inbox/系统基座文件/1/1.2/1.2.3 链接器与加载器配置 (Linker & Loader).md
2025-12-11 07:24:36 +08:00

64 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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:… (重复)
```