《程序是怎样跑起来的》(下)

学习笔记

第8章 从源文件到可执行文件

本章问题:

17108100-2cd7a0abdeda7fef.png
问题


本章重点:

编译器的功能;程序从源代码到可执行文件的流程;程序运行时的堆和栈。


8.1 计算机只能运行本地代码

17108100-916ea1074b6b213d.png
一个例子1

17108100-cb6973362858af4a.png
一个例子2

图中栗子的源代码文件命名为Sample1.c。
17108100-f76d24d316f504b7.png
源代码需要转换成本地代码才能运行


8.2 本地代码的内容

直接用记事本打开本地代码:

17108100-f9086557ae5f9ae4.png
记事本打开本地代码

把本地代码Dump一下,每一个字节用2位16进制数(每个16进制数代表4位二进制数,2位16进制数恰好代表8位即1字节)来表示:
17108100-cbe6ceaa6a5d1fbb.png
本地代码的真是面目是数值的罗列


8.3 编译器负责转换源代码

  • 不同的语言有各自的编译器;
  • 不同类的CPU有不同的机器语言,需要不同的编译器;
  • 编译器也是应用程序,也需要运行环境;
  • 存在交叉编译器,在某一环境下运行,可以生成另一环境下的本地代码。
17108100-7d73c594f34feb63.png
通过命令行编译上面的栗子


8.4 仅靠编译是无法得到可执行文件的

  • 编译生成的是.obj文件(目标文件),而不是.exe文件,无法直接运行;
  • 如果源代码中引用了其它的函数(如上面例子中的sprintf()、MessageBox()),就需要把储存着这些函数的目标文件与此目标文件相结合;
  • 完成此工作的是链接器,最后生成.exe文件

17108100-cd261cdb8a2cc6c4.png
链接上面的栗子


8.5 启动及库文件

  • 在链接的命令中,c0w32.obj记述的是同所有程序起始位置相结合的处理内容,称为程序的启动,即使未调用其它目标文件的函数,也必须要进行链接,并和启动结合起来;


8.6 DLL文件及导入库


8.7 可执行文件运行时的必要条件


8.8 程序加载时会生成堆和栈


8.9 有点难度的Q&A


问题答案:

17108100-dd5b79b18f2ecd09.png
答案


第9章 操作系统和应用的关系

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值