程序员的自我修养

链接、装载与库

8.82048 评价豆瓣读书
阅读
¥36.00¥14.40
围炉畅读,积厚待发——电子工业社满减专场截止至:2018-12-18 00:00:00了解详情
围炉畅读,积厚待发 满200减80、满100减30、满50减10活动详情

作品简介

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

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

作者:俞甲子、石凡、潘爱民

作品目录

  1. 作者访谈录
  2. 序言一
  3. 序言二
  4. 序言三
  5. 导 读
  6. 第1部分 简介
  7. 第1章 温故而知新
  8. 1.1 从Hello World说起
  9. 1.2 万变不离其宗
  10. 1.3 站得高,望得远
  11. 1.4 操作系统做什么
  12. 1.5 内存不够怎么办
  13. 1.6 众人拾柴火焰高
  14. 1.7 本章小结
  15. 第2部分 静态链接
  16. 第2章 编译和链接
  17. 2.1 被隐藏了的过程
  18. 2.2 编译器做了什么
  19. 2.3 链接器年龄比编译器长
  20. 2.4 模块拼装——静态链接
  21. 2.5 本章小结
  22. 第3章 目标文件里有什么
  23. 3.1 目标文件的格式
  24. 3.2 目标文件是什么样的
  25. 3.3 挖掘SimpleSection.o
  26. 3.4 ELF文件结构描述
  27. 3.5 链接的接口——符号
  28. 3.6 调试信息
  29. 3.7 本章小结
  30. 第4章 静态链接
  31. 4.1 空间与地址分配
  32. 4.2 符号解析与重定位
  33. 4.3 COMMON块
  34. 4.4 C++相关问题
  35. 4.5 静态库链接
  36. 4.6 链接过程控制
  37. 4.7 BFD库
  38. 4.8 本章小结
  39. 第5章 Windows PE/COFF
  40. 5.1 Windows的二进制文件格式PE/COFF
  41. 5.2 PE的前身——COFF
  42. 5.3 链接指示信息
  43. 5.4 调试信息
  44. 5.5 大家都有符号表
  45. 5.6 Windows下的ELF——PE
  46. 5.7 本章小结
  47. 第3部分 装载与动态链接
  48. 第6章 可执行文件的装载与进程
  49. 6.1 进程虚拟地址空间
  50. 6.2 装载的方式
  51. 6.3 从操作系统角度看可执行文件的装载
  52. 6.4 进程虚存空间分布
  53. 6.5 Linux内核装载ELF过程简介
  54. 6.6 Windows PE的装载
  55. 6.7 本章小结
  56. 第7章 动态链接
  57. 7.1 为什么要动态链接
  58. 7.2 简单的动态链接例子
  59. 7.3 地址无关代码
  60. 7.4 延迟绑定(PLT)
  61. 7.5 动态链接相关结构
  62. 7.6 动态链接的步骤和实现
  63. 7.7 显式运行时链接
  64. 7.8 本章小结
  65. 第8章 Linux共享库的组织
  66. 8.1 共享库版本
  67. 8.2 符号版本
  68. 8.3 共享库系统路径
  69. 8.4 共享库查找过程
  70. 8.5 环境变量
  71. 8.6 共享库的创建和安装
  72. 8.7 本章小结
  73. 第9章 Windows下的动态链接
  74. 9.1 DLL 简介
  75. 9.2 符号导出导入表
  76. 9.3 DLL优化
  77. 9.4 C++与动态链接
  78. 9.5 DLL HELL
  79. 9.6 本章小结
  80. 第4部分 库与运行库
  81. 第10章 内存
  82. 10.1 程序的内存布局
  83. 10.2 栈与调用惯例
  84. 10.3 堆与内存管理
  85. 10.4 本章小结
  86. 第11章 运行库
  87. 11.1 入口函数和程序初始化
  88. 11.2 C/C++运行库
  89. 11.3 运行库与多线程
  90. 11.4 C++全局构造与析构
  91. 11.5 fread实现
  92. 11.6 本章小结
  93. 第12章 系统调用与API
  94. 12.1 系统调用介绍
  95. 12.2 系统调用原理
  96. 12.3 Windows API
  97. 12.4 本章小结
  98. 第13章 运行库实现
  99. 13.1 C语言运行库
  100. 13.2 如何使用Mini CRT
  101. 13.3 C++运行库实现
  102. 13.4 如何使用Mini CRT++
  103. 13.5 本章小结
  104. 附录A
  105. A.1 字节序(Byte Order)
  106. A.2 ELF常见段
  107. A.3 常用开发工具命令行参考

评论

载入中

热门划线

  1. lex66 人
  2. 我们一般把频繁等待的线程称之为IO密集型线程(IO Bound Thread),而把很少等待的线程称为CPU密集型线程(CPU Bound Thread)。IO密集型线程总是比CPU密集型线程容易得到优先级的提升。38 人
  3. “计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”30 人
  4. 可重入是并发安全的强力保障,一个可重入的函数可以在多线程环境下放心使用。25 人
  5. 操作系统的一个功能是提供抽象的接口,另外一个主要功能是管理硬件资源。23 人
  6. 互斥量(Mutex)和二元信号量很类似,资源仅同时允许一个线程访问,但和信号量不同的是,信号量在整个系统可以被任意线程获取并释放,也就是说,同一个信号量可以被系统中的一个线程获取之后由另一个线程释放。而互斥量则要求哪个线程获取了互斥量,哪个线程就要负责释放这个锁,其他线程越俎代庖去释放互斥量是无效的。22 人
  7. 符号(Symbol)这个概念随着汇编语言的普及迅速被使用,它用来表示一个地址,这个地址可能是一段子程序(后来发展成函数)的起始地址,也可以是一个变量的起始地址。22 人
  8. 链接过程主要包括了地址和空间分配(Address and Storage Allocation)、符号决议(Symbol Resolution)和重定位(Relocation)等这些步骤。22 人
  9. 经过预编译后的.i文件不包含任何宏定义,因为所有的宏已经被展开,并且包含的文件也已经被插入到.i文件中。所以当我们无法判断宏定义是否正确或头文件包含是否正确时,可以查看预编译后的文件来确定问题。20 人
  10. 编译器所能分析的语义是静态语义(Static Semantic),所谓静态语义是指在编译期可以确定的语义,与之对应的动态语义(Dynamic Semantic)就是只有在运行期才能确定的语义。20 人

喜欢这本书的人也喜欢