程序员的自我修养:链接、装载和库
原始路径: /books/程序员的自我修养—链接、装载和库.pdf 文件大小: 30.42 MB 页数: 483页 类型: 扫描版PDF 作者: 王健 出版日期: 2009年 状态: done_toc_only(扫描版,483页,OCR时间过长)
书籍概要
本书是国内程序员社区中流传甚广的系统编程经典之作,以”自我修养”为名,深入浅出地讲解了程序从源码到可执行文件的完整生命周期。作者王健(网名”赤云”)在开篇自序中提出:“一个合格的程序员不仅要会写代码,还要理解代码是如何被机器执行的。“全书分为三大部分:编译链接基础、静态链接、动态链接与装载。
核心主题
第一部分:编译和链接基础
- 编译过程四阶段:预处理 → 编译 → 汇编 → 链接
- 编译器做了什么:词法分析、语法分析、语义分析、中间代码生成、目标代码生成与优化
- 链接器的历史:比编译器更古老,最早用于解决多模块程序的组装问题
第二部分:静态链接
- 目标文件格式:ELF(Executable and Linkable Format)详解
- 文件头、段表、节区
- 代码段(.text)、数据段(.data)、只读数据段(.rodata)、BSS段
- 符号系统:
- ELF符号表结构
- 特殊符号、符号修饰(mangling)
extern "C"的作用- 强符号与弱符号
- 静态链接过程:
- 空间与地址分配(按序叠加、相似段合并)
- 符号解析与重定位
- COMMON块处理
- C++全局构造与析构、重复代码消除
- BFD库的使用
第三部分:装载与动态链接
- 进程虚拟地址空间:
- 代码段、数据段、堆、栈的分布
- ELF文件的链接视图和执行视图
- 堆的最大申请数量与段地址对齐
- 可执行文件装载方式:
- 覆盖装入(早期DOS方式)
- 页影射(现代主流方式)
- 动态链接的原理:
- 为什么要动态链接(节省内存、支持热更新)
- 地址无关代码(PIC)的诞生
- PLT/GOT延迟绑定机制
- 共享库组织:
- 共享库版本管理(SO-NAME)
- 符号版本机制(基于符号、Solaris方式)
关键概念
| 概念 | 说明 |
|---|---|
| ELF | Linux可执行文件标准格式,取代了旧的a.out |
| 符号修饰 | C++函数名在汇编层面的编码规则,解决重载问题 |
| 重定位 | 链接时修改代码中的数据引用地址 |
| PLT/GOT | 延迟绑定机制,首次调用时才解析符号地址 |
| PIC | 地址无关代码,支持共享库在同一物理内存中被多个进程共享 |
| SO-NAME | 共享库的版本标识符,用于ABI兼容性管理 |
与其他知识的关联
- 可与《深入理解计算机系统第2版-CS-APP》中的链接章节对照阅读,CS-APP更偏重理论,本书更偏重Linux实践
- 汇编语言程序设计-x86-Irvine提供了底层指令层面的支撑
- Windows内核实验教程可对比理解Windows PE格式与Linux ELF的差异
- 深入理解计算机系统第2版-CS-APP与本书共同构成从应用层到系统层的完整知识链
学习价值
本书是理解Linux系统编程的必读经典,特别适合:
- 想深入理解程序如何运行的高级程序员
- 准备从事系统编程、嵌入式开发的工程师
- 想了解编译器、链接器工作原理的开发者
书中大量使用实际例子和工具(readelf、objdump、ldd、gdb)验证理论,可读性强,被誉为”国内最好的系统编程入门书之一”。
笔记生成日期: 2026-09-02 | 运行次数: 第264次