pdf

高级C/C++编译技术.pdf(扫描版)

  • 1星
  • 日期: 2018-05-09
  • 大小: 76.31MB
  • 所需积分:1分
  • 下载次数:83
  • favicon收藏
  • rep举报
  • free评论
标签: C++

C++

编译

编译

目录

译者序 

前言 

第1章 多任务操作系统基础  1

1.1 一些有用的抽象概念  1

1.2 存储器层次结构与缓存策略  2

1.3 虚拟内存  3

1.4 虚拟地址  5

1.5 进程的内存划分方案  5

1.6 二进制文件、编译器、链接器与装载器的作用  6

1.7 小结  7

第2章 程序生命周期阶段基础  8

2.1 基本假设  8

2.2 编写代码  9

2.3 编译阶段  11

2.3.1 基本概念  11

2.3.2 相关概念  11

2.3.3 编译的各个阶段  12

2.3.4 目标文件属性  23

2.3.5 编译过程的局限性  24

2.4 链接  26

2.4.1 链接阶段  26

2.4.2 链接器视角  31

2.5 可执行文件属性  33

2.5.1 各种节的类型  34

2.5.2 各种符号类型  36

第3章 加载程序执行阶段  37

3.1 shell的重要性  37

3.2 内核的作用  39

3.3 装载器的作用  39

3.3.1 装载器视角下的二进制文件(节与段)  39

3.3.2 程序加载阶段  40

3.4 程序执行入口点  43

3.4.1 装载器查找入口点  43

3.4.2 _start()函数的作用  43

3.4.3 __libc_start_main()函数的作用  44

3.4.4 栈和调用惯例  44

第4章 重用概念的作用  46

4.1 静态库  46

4.2 动态库  48

4.2.1 动态库和共享库  49

4.2.2 动态链接详解  51

4.2.3 Windows平台中动态链接的特点  54

4.2.4 动态库的特点  56

4.2.5 应用程序二进制接口(ABI)  56

4.3 静态库和动态库对比  57

4.3.1 导入选择条件的差异  57

4.3.2 部署难题  59

4.4 一些有用的类比  61

4.5 结论:二进制复用概念所产生的影响  63

第5章 使用静态库  64

5.1 创建静态库  64

5.1.1 创建Linux静态库  64

5.1.2 创建Windows静态库  65

5.2 使用静态库  65

5.3 静态库设计技巧  66

5.3.1 丢失符号可见性和唯一性的可能性  66

5.3.2 静态库使用禁忌  67

5.3.3 静态库链接的具体规则  68

5.3.4 将静态库转换成动态库  68

5.3.5 静态库在64位Linux平台上的问题  68

第6章 设计动态链接库:基础篇  70

6.1 创建动态链接库  70

6.1.1 在Linux中创建动态库  70

6.1.2 在Windows中创建动态链接库  72

6.2 设计动态库  75

6.2.1 设计二进制接口  75

6.2.2 设计应用程序的二进制接口  79

6.2.3 控制动态库符号的可见性  82

6.2.4 完成链接需要满足的条件  94

6.3 动态链接模式  94

6.3.1 加载时动态链接  95

6.3.2 运行时动态链接  95

6.3.3 比较两种动态链接模式  98

第7章 定位库文件  99

7.1 典型用例场景  99

7.1.1 开发用例场景  99

7.1.2 用户运行时用例场景  100

7.2 构建过程中库文件的定位规则  101

7.2.1 Linux平台构建过程中的库文件定位规则  101

7.2.2 Windows构建过程中的库文件定位规则  105

7.3 运行时动态库文件的定位规则  109

7.3.1 Linux运行时动态库文件的定位规则  110

7.3.2 Windows运行时动态库文件的定位规则  114

7.4 示例:Linux构建时与运行时的库文件定位  115

第8章 动态库的设计:进阶篇  119

8.1 解析内存地址的必要性  119

8.2 引用解析中的常见问题  120

8.3 地址转换引发的问题  122

8.3.1 情景1:客户二进制程序需要知道动态库符号地址  122

8.3.2 情景2:被装载的库不需要知道其自身符号地址  123

8.4 链接器-装载器协作  124

8.4.1 总体策略  125

8.4.2 具体技术  126

8.4.3 链接器重定位提示概述  127

8.5 链接器-装载器协作实现技术  128

8.5.1 装载时重定位(LTR)  129

8.5.2 位置无关代码(PIC)  129

第9章 动态链接时的重复符号处理  134

9.1 重复的符号定义  134

9.2 重复符号的默认处理  137

9.3 在动态库链接过程中处理重复符号  140

9.3.1 处理重复符号问题的一般策略  142

9.3.2 链接器解析动态库重复符号的模糊算法准则  143

9.4 特定重复名称案例分析  144

9.4.1 案例1:客户二进制文件符号与动态库ABI函数冲突  144

9.4.2 案例2:不同动态库的ABI符号冲突  147

9.4.3 案例3:动态库ABI符号和另一个动态库局部符号冲突  151

9.4.4 案例4:两个未导出的动态库符号冲突  153

9.5 小提示:链接并不提供任何类型的命名空间继承  161

第10章 动态库的版本控制  162

10.1 主次版本号与向后兼容性  162

10.1.1 主版本号变更  162

10.1.2 次版本号变更  163

10.1.3 修订版本号  163

10.2 Linux动态库版本控制方案  163

10.2.1 基于soname的版本控制方案  163

10.2.2 基于符号的版本控制方案  169

10.3 Windows动态库版本控制  190

10.3.1 DLL版本信息  191

10.3.2 指定DLL版本信息  192

10.3.3 查询并获取DLL版本信息  193

第11章 动态库:其他主题  202

11.1 插件  202

11.1.1 导出规则  203

11.1.2 一些流行的插件架构  204

11.2 提示和技巧  204

11.2.1 使用动态库的实际意义  204

11.2.2 其他主题  205

第12章 Linux工具集  211

12.1 快速查看工具  211

12.1.1 file实用程序  211

12.1.2 size实用程序  212

12.2 详细信息分析工具  212

12.2.1 ldd  212

12.2.2 nm  214

12.2.3 objdump  215

12.2.4 readelf  223

12.3 部署阶段工具  229

12.3.1 chrpath  229

12.3.2 patchelf  230

12.3.3 strip  231

12.3.4 ldconfig  231

12.4 运行时分析工具  232

12.4.1 strace  232

12.4.2 addr2line  233

12.4.3 gdb(GNU调试器)  233

12.5 静态库工具  234

第13章 平台实践  238

13.1 链接过程调试  238

13.2 确定二进制文件类型  239

13.3 确定二进制文件入口点  240

13.3.1 获取可执行文件入口点  240

13.3.2 获取动态库入口点  240

13.4 列出符号信息  241

13.5 查看节的信息  242

13.5.1 列出所有节的信息  242

13.5.2 查看节的信息  242

13.6 查看段的信息  243

13.7 反汇编代码  244

13.7.1 反汇编二进制文件  244

13.7.2 反汇编正在运行的进程  244

13.8 判断是否为调试构建  244

13.9 查看加载时依赖项  245

13.10 查看装载器可以找到的库文件  245

13.11 查看运行时动态链接的库文件  245

13.11.1 strace实用程序  245

13.11.2 LD_DEBUG环境变量  246

13.11.3 /proc//maps文件  246

13.11.4 lsof实用程序  247

13.11.5 通过编程方式查看  248

13.12 创建和维护静态库  251

第14章 Windows工具集  252

14.1 库管理器(lib.exe)  252

14.1.1 使用lib.exe处理静态库  253

14.1.2 使用lib.exe处理动态库(导入库生成工具)  257

14.2 dumpbin实用程序  258

14.2.1 确定二进制文件类型  258

14.2.2 查看DLL的导出符号  258

14.2.3 查看节的信息  259

14.2.4 反汇编代码  262

14.2.5 确定是否使用了调试模式构建  263

14.2.6 查看加载时依赖项  265

14.3 Dependency  Walker工具  265 

推荐帖子 最新更新时间:2021-09-17 20:20

从基站到终端,端到端 5G 射频前端解决方案
5G 的到来会给射频前端带来巨大的影响,在 5G China 2019 大会上,Qorvo 亚太区市场高级经理 Lawrence Tao(陶镇)分享了题为《从基站到终端,Qorvo 端到端5G射频前端解决方案》的演讲。 Qorvo 亚太区市场高级经理 Lawrence Tao(陶镇) ▲ 首先,在移动设备端,如下图所示,在未来三年,移动设备中的射频
btty038 RF/无线
MicroPython的uos文档中增加关于 littlefs 的说明
uos的文档中增加关于 littlefs 的说明: https://github.com/micropython/micropyt ... ry/uos.rst     Create a filesystem object that uses the FAT filesystem format. Storage of the FAT filesystem is
dcexpert MicroPython开源版块
利用TMS320LF2407实现SPWM
      所谓SPWM即PWM中脉冲宽度按正弦规律变化.由采样理论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上,其效果基本相同可知,为了在输出端得到正弦波,就需要输出一系列幅值相等而宽度不等的矩形波.采用三角载波的规则采样法,就可以得到宽度按正弦规律变化的矩形波.如图3所示,每个脉冲的中点都以相应的三角波的中点对称,在三角载波的负峰时刻TD对正弦波采样得到D点,过D点作一水平直线和三角波分别
Aguilera DSP 与 ARM 处理器
【GD32E503评测】mig29_Step1: 开发环境搭建问题汇总
本帖最后由 mig29 于 2021-1-18 00:11 编辑 挺晚才收到这块板子,好处就是可以看到前面几位的步骤。 其实目前国内各家原厂的开发板基本上都是一个套路:    1. 给 Keil/IAR 做好 Patch(主要是调试信息文件和Flash烧写文件)    2. 提供足够多的 Demo Code 和文档,对新手很友好    3. 仿真器大都是 CMSIS-DAP不
mig29 国产芯片交流
(已解决)请教大家,SensorTile使用融合算法时遇到问题
我对融合算法不了解 看了一下STM32_OSX_MotionFX输出的结构体定义 我查了一下资料rotation_9X意思是“偏航,俯仰和滚转” 我把BlueMicrosystem2_V2.1.3的输出代码改成rotation_9X,其它不变     /* Save the quaternions values */     if(MotionFX_Engine_Out->quaternio
littleshrimp MEMS传感器
#以拆会友#暴力拆解普源DP832电源
本帖最后由 wangjiafu1985 于 2015-8-21 20:04 编辑 暴力拆解普源DP832电源     免责声明:本贴发表之前经SOSO姐向普源提出授权,已经得到授权,允许发表。     今年四月份,因工作需要购买了一台普源DP832电源。因用惯了老式旋钮式的学生用电源,最开始还是用得不太习惯,不过两天之后就感觉这个电源实在太好用了。而且用安捷伦的万用表对比了一下,精度还是很
wangjiafu1985 以拆会友

评论

a110110110
介绍编译和链接技术的书籍,以gcc为讲述对象。
2019-03-03 13:29:12回复
rxylinux
感谢楼主分享 真是太谢谢了
2018-12-15 16:19:37回复
zhangjinghuilai
谢谢楼主分享,资源非常好,正需要!!我会大力支持你
2018-08-25 17:55:17回复
wolf_totem_369
谢谢楼主分享,资源非常好,正需要!!!
2018-07-28 09:26:57回复
andysun1991
这本书写的很好,复杂的编译原理讲的通俗易懂,条理性很棒,5份好评
2018-07-03 10:10:39回复
登录/注册

意见反馈

求资源

回顶部

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版 版权声明

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
$(function(){ var appid = $(".select li a").data("channel"); $(".select li a").click(function(){ var appid = $(this).data("channel"); $('.select dt').html($(this).html()); $('#channel').val(appid); }) })
×