Shared Libraries
1.40 MB
69 页
0 评论
语言 | 格式 | 评分 |
---|---|---|
英语 | .pdf | 3 |
摘要 | ||
文档讨论了共享库的相关概念、构建推荐和C++影响。重点包括可见性控制、链接器脚本、Linux和Windows的设计差异,以及C++标准的适用性。文档还提到链接器的复杂性和动态库的符号处理机制。 | ||
AI总结 | ||
### 文档总结
本文档主要围绕共享库(Shared Libraries)的相关内容展开,涵盖了定义、优化、资源推荐、构建建议、C++与共享库的关系以及动态装载等方面。以下是核心内容的总结:
---
#### **1. 共享库的基本概念**
- **共享库**:也称为Shared Object、Dynamic Object、DLL等,指在运行时由多个程序共享的库文件。
- **二进制(Binary)**:包括可执行文件(Executable)和共享库。
- **符号(Symbol)**:函数或全局变量的名称。
- **Linux**:文档主要讨论Unix-like系统,包括大多数MacOS系统。
---
#### **2. 链接器优化**
- **折叠(Folding)**:通过选项如`/OPT:ICF`、`-icf=all`、`-icf=safe`等,减少二进制体积。
- **死代码排除(Dead Code Elimination)**:通过选项如`/OPT:REF`、`-fvtable-gc`、`--gc-section`等,移除未使用的代码。
- **链接器脚本**:用于定制链接过程。
---
#### **3. 推荐资源**
文档列举了多个关于共享库的重要资源,包括技术文档、书籍和在线课程,例如:
- Ulrich Drepper的《How to write shared libraries》。
- Eli Benderski的博客,讨论共享库的位置无关代码(PIC)和运行时重定位。
- Fangrui Song(LLVM/LLD贡献者)和SystemV ABI规范等。
---
#### **4. Linux共享库的构建建议**
- **避免交错(Interposition)**:使用`--fvisibility=hidden`和`--Bsymbolic`标志。
- **导出控制**:仅将需要导出的函数标记为`__attribute__((visibility("protected")))`。
- **其他选项**:如`-fvisibility-inlines-hidden`、`-fvisibility-ms-compat`、`-fno-semantic-interposition`等,类似Windows的方式链接。
---
#### **5. 共享库与C++的关系**
- 共享库的实现细节(如x86-64指令集)不在C++标准范围内,但平台需要提供符合标准的实现。
- 文档指出,虽然C++标准不直接涉及共享库,但共享库的设计和使用对C++程序员仍然非常重要。
---
#### **6. 动态装载与符号 Precedence**
- **符号优先顺序**:执行文件(exe)中的符号优先于共享库。
- **LD_PRELOAD**:用户可以预加载共享库,覆盖默认库中的符号。
- **例子**:Linux和Mac允许从可执行文件覆盖共享库符号,而Windows不允许。
---
#### **7. 关键收获**
1. **设计差异**:Linux和Windows在共享库设计上存在根本差异,Linux的设计受限于过时的设计目标。
2. **构建建议**:通过`-fvisibility=hidden`和`--Bsymbolic`等选项优化共享库。
3. **标准与实现**:共享库的实现细节不在C++标准范围内,但标准需要对其进行适当处理。
4. **链接器的复杂性**:链接器功能强大且复杂,且正在积极开发中。
---
以上是文档的核心内容,涵盖了共享库的基础知识、优化、构建建议以及与C++的关系等方面。 |
P1
P2
P3
P4
P5
P6
P7
P8
P9
P10
P11
P12
下载文档到本地,方便使用
- 可预览页数已用完,剩余
57 页请下载阅读 -
文档评分