第八章笔记

8.1 计算机只能运行本地代码
用某种编程语言编写的程序就称为源代码 ,保存源代码的文件称为源文件。用C语言编写的源文件的扩展名通常是“.c”
本地(native)这个术语有“母语的”意思。对CPU来说,母语就是机器语言,而转换成机器语言的程序就是本地代码。用任何编程语言编写的源代码,最后都要翻译成本地代码,否则CPU就不能理解。也就是说,即使是用不同编程语言编写的代码,转换成本地代码后,也都变成用同一种语言(机器语言)来表示了。
8.2 本地代码的内容
Dump是指把文件的内容,每个字节用2位十六进制数来表示的方式。
8.3 编译器负责转换源代码
能够把C语言等高级编程语言编写的源代码转换成本地代码的程序称为编译器。
根据CPU类型的不同,本地代码的类型也不同。因而,编译器不仅和编程语言的种类有关,和CPU的类型也是相关的。
交叉编译器,它生成的是和运行环境中的CPU不同的CPU所使用的本地代码。
编译器转换源代码后,就会生成本地文件。
8.4 仅靠编译是无法得到可执行文件。
编译器转换源代码后,就会生成本地文件。
把多个目标文件结合,生成1个EXE文件的处理就是链接,运行连接的程序就称为链接器(linkageeditor或连结器)。
8.5 启动及库文件
链接选项“-Tpe-c-x-aa”是指定生成Windows用的EXE文件的选项。
像import32.lib及cw32.lib这样的文件称为库文件。库文件指的是把多个目标文件集成保存到一个文件中的形式。链接器指定库文件后,就会从中把需要的目标文件抽取出来,并同其他目标文件结合生成EXE文件。
外部符号是指其他目标文件中的变量或函数。
sprintf()等函数,不是通过源代码形式而是通过库文件形式和编译器一起提供的。这样的函数称为标准函数。
8.6 DLL文件及导入库
Windows以函数的形式为应用提供了各种功能。这些形式的函数称为API(Application ProgrammingInterface,应用程序接口)。
Windows中,API的目标文件,并不是存储在通常的库文件中,而是存储在名为DLL(Dynamic LinkLibrary)文件的特殊库文件中。
我们把类似于import32.lib这样的库文件称为导入库。
与此相反,存储着目标文件的实体,并直接和EXE文件结合的库文件形式称为静态链接库。静态(static=静态的)同动态(dynamic=动态的)是相反的意思。存储着sprintf()的目标文件的cw32lib就是静态链接库。sprintf()提供了通过指定格式把数值转换成字符串的功能。
8.7 可执行文件运行时的必要条件
在程序运行时,虚拟的内存地址会转换成实际的内存地址。链接器会在EXE文件的开头,追加转换内存地址所需的必要信息。这个信息称为再配置信息。
8.8 程序加载时会生成栈和堆
栈是用来存储函数内部临时使用的变量(局部变量 ),以及函数调用时所用的参数的内存区域。堆是用来存储程序运行时的任意数据及对象的内存领域
EXE文件中并不存在栈及堆的组。栈和堆需要的内存空间是在EXE文件加载到内存后开始运行时得到分配的。因而,内存中的程序,就是由用于变量的内存空间、用于函数的内存空间、用于栈的内存空间、用于堆的内存空间这4部分构成的。

😊

posted @ 2025-02-17 22:39  Ljy15  阅读(8)  评论(0)    收藏  举报