分享
 
 
 

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

程序员的自我修养—链接、装载与库  点此进入淘宝搜索页搜索
  特别声明:本站仅为商品信息简介,并不出售商品,您可点击文中链接进入淘宝网搜索页搜索该商品,有任何问题请与具体淘宝商家联系。
  參考價格: 点此进入淘宝搜索页搜索
  分類: 图书,计算机与互联网,程序语言与软件开发,综合,
  品牌: 俞甲子

基本信息·出版社:电子工业出版社

·页码:459 页

·出版日期:2009年

·ISBN:7121085119/9787121085116

·条形码:9787121085116

·包装版本:1

·装帧:平装

·正文语种:中文

产品信息有问题吗?请帮我们更新产品信息。

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

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

编辑推荐 《程序员的自我修养:链接、装载与库》深入浅出地对系统软件的底层形成机制进行条分缕析

 真正提升程序员的自我修养

目录

第1 部分 简介 .......................................................................................... 1

第1 章 温故而知新 ................................................................................................................... 3

1.1 从HELLO WORLD 说起 ................................................................................................. 4

1.2 万变不离其宗 ......................................................................................................................... 5

1.3 站得高,望得远 ..................................................................................................................... 8

1.4 操作系统做什么 ................................................................................................................... 10

1.5 内存不够怎么办 ................................................................................................................... 14

1.6 众人拾柴火焰高 ................................................................................................................... 19

1.7 本章小结 ............................................................................................................................... 33

第2 部分 静态链接 ................................................................................. 35

第2 章 编译和链接 ................................................................................................................. 37

2.1 被隐藏了的过程 ................................................................................................................... 38

2.2 编译器做了什么 ................................................................................................................... 41

2.3 链接器年龄比编译器长 ....................................................................................................... 48

2.4 模块拼装——静态链接 ....................................................................................................... 50

2.5 本章小结 ............................................................................................................................... 53

第3 章 目标文件里有什么 ...................................................................................................... 55

3.1 目标文件的格式 ................................................................................................................... 56

3.2 目标文件是什么样的 ........................................................................................................... 58

3.3 挖掘SIMPLESECTION.O ............................................................................................................ 61

3.4 ELF 文件结构描述 ............................................................................................................... 68

3.5 链接的接口——符号 ............................................................................................................ 81

3.6 调试信息 ............................................................................................................................... 94

3.7 本章小结 ............................................................................................................................... 95

第4 章 静态链接 .................................................................................................................... 97

4.1 空间与地址分配 ................................................................................................................... 98

4.2 符号解析与重定位 ............................................................................................................. 103

4.3 COMMON 块 ..................................................................................................................... 111

4.4 C++相关问题 ...................................................................................................................... 112

4.5 静态库链接 ......................................................................................................................... 117

4.6 链接过程控制 ..................................................................................................................... 123

4.7 BFD 库 ............................................................................................................................... 131

4.8 本章小结 ............................................................................................................................. 132

第5 章 WINDOWS PE/COFF ................................................................................................. 133

5.1 WINDOWS 的二进制文件格式PE/COFF ............................................................................ 134

5.2 PE 的前身——COFF .......................................................................................................... 135

5.3 链接指示信息 ..................................................................................................................... 139

5.4 调试信息 ............................................................................................................................. 140

5.5 大家都有符号表 ................................................................................................................. 141

5.6 WINDOWS 下的ELF——PE ................................................................................................ 142

5.7 本章小结 ............................................................................................................................. 146

第3 部分 装载与动态链接 .................................................................... 147

第6 章 可执行文件的装载与进程 ......................................................................................... 149

6.1 进程虚拟地址空间 ............................................................................................................. 150

6.2 装载的方式 ......................................................................................................................... 153

6.3 从操作系统角度看可执行文件的装载 ............................................................................. 157

6.4 进程虚存空间分布 ............................................................................................................. 160

6.5 LINUX 内核装载ELF 过程简介 ......................................................................................... 173

6.6 WINDOWS PE 的装载 ........................................................................................................... 175

6.7 本章小结 ............................................................................................................................. 177

第7 章 动态链接 .................................................................................................................. 179

7.1 为什么要动态链接 ............................................................................................................. 180

7.2 简单的动态链接例子 ......................................................................................................... 184

7.3 地址无关代码 ..................................................................................................................... 188

7.4 延迟绑定(PLT) .............................................................................................................. 200

7.5 动态链接相关结构 ............................................................................................................. 202

7.6 动态链接的步骤和实现 ..................................................................................................... 214

7.7 显式运行时链接 ................................................................................................................. 221

7.8 本章小结 ............................................................................................................................. 228

第8 章 LINUX 共享库的组织.................................................................................................. 229

8.1 共享库版本 ......................................................................................................................... 230

8.2 符号版本 ............................................................................................................................. 235

8.3 共享库系统路径 ................................................................................................................. 241

8.4 共享库查找过程 ................................................................................................................. 241

8.5 环境变量 ............................................................................................................................. 242

8.6 共享库的创建和安装 ......................................................................................................... 245

8.7 本章小结 ............................................................................................................................. 248

第9 章 WINDOWS 下的动态链接............................................................................................ 249

9.1 DLL 简介 ........................................................................................................................... 250

9.2 符号导出导入表 ................................................................................................................. 257

9.3 DLL 优化 ............................................................................................................................ 266

9.4 C++与动态链接 ................................................................................................................ 273

9.5 DLL HELL .......................................................................................................................... 276

9.6 本章小结 ............................................................................................................................. 279

第4 部分 库与运行库 ........................................................................... 281

第10 章 内存 ....................................................................................................................... 283

10.1 程序的内存布局 ............................................................................................................... 284

10.2 栈与调用惯例 ................................................................................................................... 286

10.3 堆与内存管理 ................................................................................................................... 305

10.4 本章小结 ........................................................................................................................... 315

第11 章 运行库 .................................................................................................................... 317

11.1 入口函数和程序初始化 ................................................................................................... 318

11.2 C/C++运行库 .................................................................................................................... 335

11.3 运行库与多线程 ............................................................................................................... 350

11.4 C++全局构造与析构 ........................................................................................................ 357

11.5 FREAD 实现 .......................................................................................................................... 368

11.6 本章小结 ........................................................................................................................... 381

第12 章 系统调用与API......................................................................................................... 383

12.1 系统调用介绍 ................................................................................................................... 384

12.2 系统调用原理 ................................................................................................................... 388

12.3 WINDOWS API .................................................................................................................... 401

12.4 本章小结 ........................................................................................................................... 410

第13 章 运行库实现 ............................................................................................................. 411

13.1 C 语言运行库 ................................................................................................................... 412

13.2 如何使用MINI CRT .......................................................................................................... 429

13.3 C++运行库实现 ................................................................................................................ 433

13.4 如何使用MINI CRT++ ..................................................................................................... 446

13.5 本章小结 ........................................................................................................................... 448

附录A .................................................................................................................................... 449

A.1 字节序(BYTE ORDER) ...................................................................................................... 450

A.2 ELF 常见段 ........................................................................................................................ 451

A.3 常用开发工具命令行参考 ................................................................................................ 453

索引 ....................................................................................................................................... 457

……[看更多目录]

序言作者序1

两年前,甲子跟我提起,他在考虑写一本讲述计算机程序基本工作原理的书,由于代码背后的许多细节现在难以找到完整而又实用的资料,因此,系统性地讲述这些技术要素一定非常有意义。这是我非常感兴趣的话题,因为最近几年来,我每次给学生讲课或作技术报告时,经常会提到程序背后的一些细节知识,而当有人请我推荐一些参考资料时,我很难想得出有什么恰当的参考书可供学习。我自己也曾想过要写一点这方面的书,只是一直下不了决心做这件事情。甲子的提议让我意识到,写这样一本书的机会来了。于是,我们认真规划了书的选题。按我的建议,这应该是三卷本的书,每卷独立,合起来成一体系。第一卷是基础篇,介绍程序的基本运行过程,即是您现在看到的这本书。其他两卷还需要时日和机缘。

在过去两年中,我曾经以“Inside Windows Programs”为题在多所高校作过报告,旨在介绍Windows程序背后的一些支撑技术。对于正在学习计算机或软件专业的学生,或者正在从事软件开发的工程师们,我认为理解这些支撑技术是很有必要的。试想,即使一个简单的“Hello World!”程序,也依赖于背后的输入输出库(或流库)及系统提供的模块,这种依赖性已经成为现代软件在操作系统环境下运行的一个必要条件。然而,有关这些支撑技术的系统性资料却少而又少,虽然Internet上并不缺乏任何一方面的细节信息,但是,能将程序的编译和运行过程所涉及的各种技术全面地串连起来介绍的,却尚未有先例。

甲子曾经在2006年夏天跟我实习过两个月,他帮我搭建了一个在Windows已有体系结构下将交换空间重定向到远程机器物理内存的原型系统。完成这一系统并非易事,而且甲子事前并无Windows内核编程经验,但是,他凭借扎实的计算机系统软件功底,成功地打通了从页面错误(page fault)异常例程到远程机器内存管理器之间的数据通路。在这一段实习经历中,我不仅看到了他驾驭代码和系统的能力,也感受到他做事认真负责的态度。因此,当他提出要写一本介绍程序基础的书时,我认为他是非常合适的人选。考虑到写书的艰巨性,他推荐石凡同学加入进来,这才有了我们三个人的组合。我原先担心写作的进度,毕竟写这样一本书需要大量的时间投入。幸运的是,在甲子和石凡的不懈努力下,这本书终于面市了。

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

关于写作这本书的功劳,我不敢掠美。在创作之初,包括拟定提纲及甄选内容方面,我跟甲子有过认真而细致的讨论;在写作过程中,我对甲子和石凡的初稿提出过一些建议,尤其在表述方面,同时我也协助他们与编辑进行了沟通和交流。对于正文的内容,我并无实质性的贡献,但基于我对甲子和石凡两位年轻人的了解,我相信他们自身的技术实践功底,以及足够的技术阐释能力。我期待这本书能够真正地提升程序员的自我修养,让程序员总是生活在“知其然,更知其所以然”的代码曼妙中。

最后,我要感谢这本书的四位编辑,他们是何艳、方舟、刘铁锋和陈元玉,谢谢他们为这本书付出的努力。还要感谢博文视点团队的负责人周筠女士,谢谢她给予两位年轻作者的扶持和关爱。

潘爱民

2009年2月于北京微软

七、作者序2

两年前,我在浙江大学的一著名BBS的C++板块上担任版主,而俞甲子则是板上的资深版友(以及前版主)。那时候我对链接装载、运行库等内容比较感兴趣,自己摸索着在博客上写了一篇关于链接的入门文章,而这就是一切的开始。

我猜想俞甲子可能对写这么一本书早有想法,看到我的文章正好找到了同路人。他找到了我和潘爱民老师,我们一拍即合,就开始了这长达两年的写作历程。考虑到当时俞甲子已经在链接部分有了相当的积累,因此我不得不放弃我最有兴趣的一部分转而在运行环境上做文章。我把glibc和msvcrt的源代码翻了个底朝天,了解到了许多平时不可能接触到的内幕和技术细节。事实上,这基本是一个现学现卖的过程,我一边学习着新的知识,一边把新知识组织整理写成文字。读者在看某些章节的时候,会发现这些章节的讲解过程就是一个源代码的挖掘过程,这实际上也就是我的学习过程。学习研究他人的代码是枯燥而耗时的,我很高兴能够做这样一个先行者,将我的经验写进书里,让读者能够避免重复劳动,直接获得其中的经验和关键技术。

本书所讲的内容不是活跃在当今IT舞台上的高新技术,也不是雄踞计算机某个领域的王牌霸主,而是默默服务于所有计算机应用的扫地僧。也许阅读本书不能够直接在平时学习工作中的生产力上得到体现,但了解计算机的台前幕后会对读者产生潜移默化的影响。当你的程序无法启动的时候,你可能会在脑海里多设想一种可能性;当你的代码链接失败的时候,你可能会更快地意识到问题的所在;当你的程序发生非法操作的时候,你可能不至于面对微软的错误报告毫无头绪。有人总爱用“时效性”评价当今的IT技术。仿佛一项技术的生存期就只有几年。我不能说这样的想法是错误的,如今的技术的确在飞速地更替和发展。但是本书所讲的技术,大多是成型在十年前,乃至二十年前,它们是整个计算机行业技术的根本,也几乎是现在所有计算机应用的基础。在当今的计算机技术发生根本性变革之前,这些技术还将继续存在并保持活力。

我很荣幸能够有机会和读者分享这些技术,但写作水平有限(我在语文课上历来不是个好学生),最终在文字和结构上颇有缺憾,只能在这里说一声抱歉。在这里要感谢我小学、初中和高中的语文老师,谢谢你们当初对我的教导,尽管最终可能辜负了你们的希望。感谢潘老师、博文视点的编辑及所有支持我们的朋友们,谢谢你们对我们的帮助。最后要感谢我的父母,没有你们,我永远不可能走到今天这一步。

石凡

2009年2月于杭州

八、作者序3

CPU体系结构、汇编、C语言(包括C++)和操作系统,永远都是编程大师们的护身法宝,就如同少林寺的《易筋经》,是最为上乘的武功;学会了《易筋经》,你将无所不能,任你创造武功;学会了编程“易筋经”,大师们可以任意开发操作系统、编译器,甚至是开发一种新的程序设计语言!

——佚名

念书的时候,作为标准的爱好技术的宅男,每天扫一遍各大高校BBS的技术版面,基本好比一日三餐一样平常。我对计算机技术方面的口味很杂,从汇编版到C++到Linux内核开发、Linux应用开发、游戏开发、网络、编程语言、体系结构、移动开发、开源闭源我都会参上一脚。

我始终认为技术优劣取决于需求,与很多持有“编程语言血统论”的程序开发者不同,我不认为C++或Java本身有什么直接可比性,或者OOP与函数式编程谁优谁劣,我始终坚持认为作为开发者,MOP(Market/Money Oriented Programming)才是唯一不变的编程范式。于是我往往不参与那些技术、平台、语言教派之间的宗教战争,这种论战基本上每周都会有,我很佩服论战各方见多识广、旁征博引、高屋建瓴的论断,但我往往只是灌灌水调节一下思绪。相反,我很关注一些与语言、平台等相对独立的基本的系统概念方面的问题,这些问题比较具体,也比较实用,比如:

为什么程序是从main开始执行?

“malloc分配的空间是连续的吗?”

“PE/ELF文件里面存的是什么?”

“我想写一个不需要操作系统可以直接在硬件上跑的程序该怎么做?”

“目标文件是什么?链接又是什么?”

“为什么这段程序链接时报错?”

“句柄到底是什么东西?”

这些问题看似很简单但实际上有很多值得深入挖掘的地方,比如第一个问题围绕着main函数执行前后可以延伸出一大堆问题:程序入口、运行库初始化、全局/静态对象构造析构、静态和动态链接时程序的初始化和装载等。我们把这些问题归结起来,发现主要是三个很大的而且连贯的主题,那就是“链接、装载和库”。

事实上,现在市面上和网络上能找到的计算机技术方面的书籍和资料中,什么都很齐全,唯独关于这三个主题的讨论十分稀缺,即使能找到一些也是犹如残缺的典籍,不仅不完整而且很多已经过时了。关于现在通用的Windows和Linux平台的链接、装载及PE/ELF文件的详细分析,实在很少见。这个领域中,最为完整、也最为权威的莫过于John R. Levine的《Linkers & Loaders》,这本书我也前前后后通读了好几遍,虽然它对链接和装载方面的描述较为完整,但是过于理论化,对于实际的系统机制描述则过于简略。

我始终认为对于一个问题比较好的描述方式,是由一个很小很简单的问题或示例入手,层层剥开深入挖掘,不仅探究每个机制“怎么做”,而且要理解它们“为什么这样做”,力求深入浅出、图文并茂,尽力把每一步细节都呈现给读者。这是我一贯的想法,也是我们在本书中努力试图达到的效果。

第一次有想写这样一本书的念头是在2006年底,当时我正在念研一,想起未来还有一年多漫长而又相对空闲的研究生生涯,觉得写一本这样的书大概是比较好的“消遣活动”。于是我第一时间想到了在微软研究院实习时的导师潘爱民老师,潘老师在写作技术书籍方面有很深的功底和丰富的经验。我把想法告诉潘老师以后,他十分支持,于是我又找到了当时刚好保送研究生、时间上也相对充裕的石凡,我们三个都对这个选题十分感兴趣,可谓一拍即合。

当时也没多想,以为写书大概也就跟BBS发帖连载差不多吧。一旦写起来才发现自己完全轻视了写书的工作量。书中的每一个章节、每一个小段、每一个例子甚至每一个用词有时候都要斟酌很久,生怕用得不恰当误导了读者。“误人子弟”这四个字罪名可不轻,大有推出午门斩首五遍以儆效尤之过。写书的时间的确很仓促,虽然我们都是在读研时写的,按理说相对于已经工作的作者来讲,已经是有很多闲余的时间了,但还是经常手忙脚乱。想到以前看书看到作者写的序里,经常使用“时间仓促,水平有限”的话,推想作者不过是出于谦虚不免要客套一下。现在轮到自己写序了,终于感觉到了这八个字的分量。即使到现在已近完稿,我们还是心里十分忐忑,因为还有不少地方的确写得不够完善。也听到了很多第一批读者的反馈意见,很多建议都正中这本书的软肋,我们也根据大家的意见又一次进行了修改,这已经是反反复复的第N次修订了。

这本书前前后后花了两年多的时间一直没有完稿,由于截稿时间快到了,我们才终于定稿,因为实在没有办法做到完美,只能向无限接近完美努力。最后,我们在“著”和“编著”之间犹豫了很久,想到本书凝聚了我们很多的心血,还是诚惶诚恐地写上了“著”字,权当给自己壮胆了。我们也相信,本书虽然没做到完美,但是它一定会给你带来一些你以前想看、想了解而又找不到的东西。或者以前在编程过程中困惑了你很久,但始终没有找到解释的问题,当在本书中终于找到答案且大呼“原来如此!”时,我们也就很欣慰了!

关于本书的书名笔者们也讨论了很久,征询过很多意见,最终还是决定用“程序员的自我修养”作为书名,将“链接、装载与库”作为副标题。书名源自于俄罗斯的演员斯坦尼斯拉夫斯基创作的《演员的自我修养》,作者为了写这本书前前后后修改了三十年之久,临终前才同意不再修改,拿去出版。使用这个书名一方面是本书的内容的确不是介绍一门新的编程语言或展示一些实用的编程技术,而是介绍程序运行背后的机制和由来,可以看作是程序员的一种“修养”;另一方面是向斯坦尼斯拉夫斯基致敬,向他对作品精益求精的精神致敬。

在本书的创作过程中,很多人对我们的支持和帮助难以言表。这里我要感谢博文视点的几位编辑何艳、方舟、刘铁锋和陈元玉等,他们为本书付出了很多心血;特别要感谢博文视点的周筠老师,这本书能够面世离不开她的支持和努力。另外也要感谢浙江大学的张晓龙博士,他为本书提出了很多建议,并且贡献了“DLL HELL”一节。

俞甲子

2009年2月于杭州

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有