𝔖 Scriptorium
✦   LIBER   ✦

📁

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

✍ Scribed by 俞甲子; 石凡; 潘爱民


Publisher
电子工业出版社
Year
2009
Tongue
Chinese
Leaves
483
Category
Library

⬇  Acquire This Volume

No coin nor oath required. For personal study only.

✦ Synopsis


这本书主要介绍系统软件的运行机制和原理,涉及在Windows和Linux两个系统平台上,一个应用程序在编译、链接和运行时刻所发生的各种事项,包括:代码指令是如何保存的,库文件如何与应用程序代码静态链接,应用程序如何被装载到内存中并开始运行,动态链接如何实现,C/C++运行库的工作原理,以及操作系统提供的系统服务是如何被调用的。每个技术专题都配备了大量图、表和代码实例,力求将复杂的机制以简洁的形式表达出来。本书最后还提供了一个小巧且跨平台的C/C++运行库MiniCRT,综合展示了与运行库相关的各种技术。

对装载、链接和库进行了深入浅出的剖析,并且辅以大量的例子和图表,可以作为计算机软件专业和其他相关专业大学本科高年级学生深入学习系统软件的参考书。同时,还可作为各行业从事软件开发的工程师、研究人员以及其他对系统软件实现机制和技术感兴趣者的自学教材。

✦ Table of Contents


导读
目录
第 1 部分 简介
第一章 温故而知新
1.1 从Hello World说起
1.2 万变不离其宗
1.3 站得高,望得远
1.4 操作系统做什么
1.4.1不要让CPU打盹
1.4.2设备驱动
1.5 内存不够怎么办
1.5.1 关于隔离
1.5.2 分段
1.5.3 分页
1.6 众人拾柴火焰高
1.6.1 线程基础
1.6.2 线程安全
1.6.3 多线程内部情况
1.7 本章小结
第 2 部分 静态链接
第 2 章 编译和链接
2.1 被隐藏了的过程
2.1.1 预编译
2.1.2 编译
2.1.3 汇编
2.1.4 链接
2.2 编译器做了什么
2.2.1 词法分析
2.2.2 语法分析
2.2.3 语义分析
2.2.4 中间语言生产
2.2.5 目标代码生成与优化
2.3 链接器年龄比编译器长
2.4 模块拼装----静态链接
2.5 本章小结
第 3 章 目标文件里有什么
3.1 目标文件的格式
3.2 目标文件是什么样的
3.3 挖掘 SimpleSection.o
3.3.1 代码段
3.3.2 数据段和只读数据段
3.3.3 BSS 段
3.3.4 其他段
3.4 ELF 文件结构描述
3.4.1 文件头
3.4.2 段表
3.4.3 重定位表
3.4.4 字符串表
3.5 链接的接口----符号
3.5.1 ELF 符号表结构
3.5.2 特殊符号
3.5.3 符号修饰与函数签名
3.5.4 extern "C"
3.5.5 弱符号与强符号
3.6 调试信息
3.7 本章小结
第 4 章 静态链接
4.1 空间与地址分配
4.1.1 按序叠加
4.1.2 相似段合并
4.1.3 符号地址的确定
4.2 符号解析与重定位
4.2.1 重定位
4.2.2 重定位表
4.2.3 符号解析
4.2.4 指令修正方式
4.3 COMMON 块
4.4 C++相关问题
4.4.1 重复代码消除
4.4.2 全局构造与析构
4.4.3 C++与 ABI
4.5 静态库链接
4.6 链接过程控制
4.6.1 链接控制脚本
4.6.2 最 "小" 的程序
4.6.3 使用 ld 链接脚本
4.6.4 ld 链接脚本语法简介
4.7 BFD 库
4.8 本章小结
第 5 章 Windows PE/COFF
5.1 Windows 的二进制文件格式 PE/COFF
5.2 PE 的前身----COFF
5.3 链接指示信息
5.4 调试信息
5.5 大家都有符号表
5.6 Windows 下的 ELF----PE
5.6.1 PE 数据目录
5.7 本章小结
第 3 部分 装载与动态链接
第 6 章 可执行文件的装载与进程
6.1 进程虚拟地址空间
PAE
6.2 装载的方式
6.2.1 覆盖装入
6.2.2 页映射
6.3 从操作系统角度看可执行文件的装载
6.3.1 进程的建立
6.3.2 页错误
6.4 进程虚存空间分布
6.4.1 ELF 文件链接视图和执行视图
6.4.2 堆和栈
6.4.3 堆的最大申请数量
6.4.4 段地址对齐
6.4.5 进程栈初始化
6.5 Linux 内核装载 ELF 过程简介
6.6 Windows PE 的装载
6.7 本章小结
第 7 章 动态链接
7.1 为什么要动态链接
7.2 简单的动态链接例子
7.3 地址无关代码
7.3.1 固定装载地址的困扰
7.3.2 装载时重定位
7.3.3 地址无关代码
7.3.4 共享模块的全局变量问题
7.3.5 数据段地址无关性
7.4 延迟绑定(PLT)
7.5 动态链接相关结构
7.5.1 ".interp" 段
7.5.2 ".dynamic" 段
7.5.3 动态符号表
7.5.4 动态链接重定位表
7.5.5 动态链接时进程堆栈初始化信息
7.6 动态链接的步骤和实现
7.6.1 动态链接器自举
7.6.2 装载共享对象
全局符号介入
7.6.3 重定位和初始化
7.6.4 Linux 动态链接器实现
7.7 显式运行时链接
7.7.1 dlopen()
7.7.2 dlsym()
7.7.3 dlerror()
7.7.4 dlclose()
7.7.5 运行时装载的演示程序
7.8 本章小结
第 8 章 Linux 共享库的组织
8.1 共享库版本
8.1.1 共享库兼容性
8.1.2 共享库版本命名
8.1.3 SO-NAME
8.2 符号版本
8.2.1 基于符号的版本控制
8.2.2 Solaris 中的符号版本控制
8.2.3 Linux 中的符号版本
8.3 共享库系统路径
8.4 共享库查找过程
8.5 环境变量
8.6 共享库的创建和安装
8.6.1 共享库的创建
8.6.2 清除符号信息
8.6.3 共享库的安装
8.6.4 共享库构造和析构函数
8.6.5 共享库脚本
8.7 本章小结
第 9 章 Windows 下的动态链接
9.1 DLL 简介
9.1.1 进程地址空间和内存管理
9.1.2 基地址和 RVA
9.1.3 DLL 共享数据段
9.1.4 DLL 的简单例子
9.1.5 创建 DLL
9.1.6 使用 DLL
9.1.7 使用模块定义文件
9.1.8 DLL 显式运行时链接
9.2 符号导出导入表
9.2.1 导出表
9.2.2 EXP 文件
9.2.3 导出重定向
9.2.4 导入表
9.2.5 导入函数的调用
9.3 DLL 优化
9.3.1 重定基地址
9.3.2 序号
9.3.3 导入函数绑定
9.4 C++ 与动态链接
9.5 DLL HELL
9.6 本章小结
第 4 部分 库与运行库
第 10 章 内存
10.1 程序的内存布局
10.2 栈与调用惯例
10.2.1 什么是栈
10.2.2 调用惯例
10.2.3 函数返回值传递
10.3 堆与内存管理
10.3.1 什么是堆
10.3.2 Linux 进程堆管理
10.3.3 Windows 进程堆管理
10.3.4 堆分配算法
10.4 本章小结
第 11 章 运行库
11.1 入口函数和程序初始化
11.1.1 程序从 main 开始吗
11.1.2 入口函数如何实现
11.1.3 运行库与 I/O
11.1.4 MSVC CRT 的入口函数初始化
11.2 C/C++ 运行库
11.2.1 C 语言运行库
11.2.2 C 语言标准库
11.2.3 glibc 与 MSVC CRT
11.3 运行库与多线程
11.3.1 CRT 的多线程困扰
11.3.2 CRT 改进
11.3.3 线程局部存储实现
11.4 C++ 全局构造与析构
11.4.1 glibc全局构造与析构
11.4.2 MSVC CRT 的全局构造和析构
11.5 fread 实现
11.5.1 缓冲
11.5.2 fread_s
11.5.3 fread_nolock_s
11.5.4 _read
11.5.5 文本换行
11.5.6 fread 回顾
11.6 本章小结
第 12 章系统调用与 API
12.1 系统调用介绍
12.1.1 什么是系统调用
12.1.2 Linux 系统调用
12.1.3 系统调用的弊端
12.2 系统调用原理
12.2.1 特权级与中断
12.2.2 基于 int 的 Linux 的经典系统调用实现
12.2.3 Linux 的新型系统调用机制
12.3 Windows API
12.3.1 Windows API 概览
12.3.2 为什么要使用 Windows API
12.3.3 API 与子系统
12.4 本章小结
第 13 章 运行库实现
13.1 C 语言运行库
13.1.1 开始
13.1.2 堆的实现
13.1.3 IO 与文件操作
13.1.4 字符串相关操作
13.1.5 格式化字符串
13.2 如何使用 Mini CRT
13.3 C++ 运行库实现
13.3.1 new 与 delete
13.3.2 C++ 全局构造与析构
13.3.3 atexit 实现
13.3.4 入口函数修改
13.3.5 stream 与 string
13.4 如何使用 Mini CRT++
13.5 本章小结
附录 A
A.1 字节序(Byte Order)
A.2 ELF 常见段
A.3 常用开发工具命令行参考
A.3.1 gcc,GCC 编译器
A.3.2 ld,GNU 链接器
A.3.3 objdump,GNU 目标文件可执行文件查看器
A.3.4 cl,MSVC 编译器
A.3.5 link,MSVC 链接器
A.3.6 dumpbin,MSVC 的 COFF/PE 文件查看器
索引


📜 SIMILAR VOLUMES


程序员的自我修养: 链接、装载与库
✍ 俞甲子, 石凡, 潘爱民 📂 Library 📅 2009 🏛 电子工业出版社 🌐 Chinese

这本书主要介绍系统软件的运行机制和原理,涉及在Windows和Linux两个系统平台上,一个应用程序在编译、链接和运行时刻所发生的各种事项,包括:代码指令是如何保存的,库文件如何与应用程序代码静态链接,应用程序如何被装载到内存中并开始运行,动态链接如何实现,C/C++运行库的工作原理,以及操作系统提供的系统服务是如何被调用的。每个技术专题都配备了大量图、表和代码实例,力求将复杂的机制以简洁的形式表达出来。本书最后还提供了一个小巧且跨平台的C/C++运行库MiniCRT,综合展示了与运行库相关的各种技术。 对装载、链接和库进行了深入浅出的剖析,并且辅以大量的例子和图表,可以作为计算机软件专

程序员的数学
✍ 结城浩 📂 Library 📅 2012 🏛 人民邮电出版社 🌐 Chinese

如果数学不好,是否可以成为一名程序员呢?答案是肯定的。 本书最适合:数学糟糕但又想学习编程的你。 没有晦涩的公式,只有好玩的数学题。 帮你掌握编程所需的“数学思维”。 日文版已重印14次! 编程的基础是计算机科学,而计算机科学的基础是数学。因此,学习数学有助于巩固编程的基础,写出更健壮的程序。 本书面向程序员介绍了编程中常用的数学知识,借以培养初级程序员的数学思维。读者无需精通编程,也无需精通数学,只需具备四则运算和乘方等基础知识,就可以阅读本书。 书中讲 解了二进制计数法、逻辑、余数、排列组合、递归、指数爆炸、不可解问题等许多与编程密切相关的数学方法,分析了哥尼斯堡七桥问题、少年