pdf文档 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 页请下载阅读 -
文档评分
请文明评论,理性发言.