程序员的自我修养:链接、装载和库

原始路径: /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方式)

关键概念

概念说明
ELFLinux可执行文件标准格式,取代了旧的a.out
符号修饰C++函数名在汇编层面的编码规则,解决重载问题
重定位链接时修改代码中的数据引用地址
PLT/GOT延迟绑定机制,首次调用时才解析符号地址
PIC地址无关代码,支持共享库在同一物理内存中被多个进程共享
SO-NAME共享库的版本标识符,用于ABI兼容性管理

与其他知识的关联

学习价值

本书是理解Linux系统编程的必读经典,特别适合:

  1. 想深入理解程序如何运行的高级程序员
  2. 准备从事系统编程、嵌入式开发的工程师
  3. 想了解编译器、链接器工作原理的开发者

书中大量使用实际例子和工具(readelf、objdump、ldd、gdb)验证理论,可读性强,被誉为”国内最好的系统编程入门书之一”。


笔记生成日期: 2026-09-02 | 运行次数: 第264次