创建仓库
This commit is contained in:
63
系统基座文件/1/1.2/1.2.3 链接器与加载器配置 (Linker & Loader).md
Normal file
63
系统基座文件/1/1.2/1.2.3 链接器与加载器配置 (Linker & Loader).md
Normal file
@@ -0,0 +1,63 @@
|
||||
---
|
||||
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:… (重复)
|
||||
```
|
||||
Reference in New Issue
Block a user