第八章 从源文件到可执行文件
机器运行的是本地代码(Native Code)用某种编程语言编写出来的程序是源代码,保存源代码的文件是源文件。源文件只是文本文件,并不能直接运行,因为CPU只能运行本地代码(机器语言代码)。因此,源代码必须被转换为本地代码。
本地代码里有什么?Window中.EXE文件的程序内容,就是本地代码。只有机器能够理解,人不能理解。将它DUMP一下,即每字节以2位16进制(2进制和16进制的转换规则中,二进制中每4位可以转换为十六进制中1位)的形式表现,就可以发现,本地代码其实是数值的集合。每一个数值都代表了一个命令或一个数据。
从源文件到可执行文件的过程:第一步:转换源代码:编译器编译器:将编程语言编写的源代码转换为本地代码的程序。编译完成的程序为.obj目标文件,内容是本地代码。但是还不能够运行。转换每种高级编程语言都需要其专有的编译器,例如C语言的C编译器。同种编程语言在不同CPU下的编译器也不同。编译器也是程序,因此也需要适合它的运行环境。因此,确定一个编译器的种类,需要确定哪种编程语言+哪种CPU+哪种运行环境。而实际上购买和下载时,通常指需要确定编译器产品名称+版本号即可。第二步:生成.EXE文件与启动:链接器经过编译器的编译,源文件已经被转换成了.obj目标文件。链接:将多个目标文件结合起来,生成一个.EXE可执行文件。链接器:运行链接的程序。库文件,即.lib文件,是指将多个目标文件集成保存在一个文件里的形式。标准函数:在库文件中收录的函数。在程序中,不通过源代码另行编写,而通过库文件提供的函数。如果主程序中使用了标准函数,在运行链接程序时,链接器就需要指定收录它的库文件,将库文件中需要的.obj目标文件(包含此标准函数)抽取出来,与其他目标文件共同生成一个.EXE可执行文件。在链接时,必须链接一个特殊的目标文件,它记述了同所有程序起始位置相结合的处理内容,成为程序的启动。
存储着目标文件的实体,并直接和EXE文件结合的库文件形式称为静态链接库。静态(static=静态的)同动态(dynamic=动态的)是相反的意思。存储着sprintf()的目标文件的cw32lib就是静态链接库。sprintf(提供了通过指定格式把数值转换成字符串的功能。通过结合导入库文件,执行时从DLL文件中调出的MessageBox()函数这一信息就会和EXE文件进行结合。这样,链接器链接时就不会再出现错误消息,从而就可以顺利编写EXE文件。
栈是用来存储函数内部临时使用的变量(局部变量),以及函数调用时所用的参数的内存区域。堆是用来存储程序运行时的任意数据及对象的内存领域。
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击