每当编译和执行C程序文件时,编译器都会生成一些与C程序文件同名但具有不同扩展名的文件。那么,这些文件是什么?它们是如何创建的?
下图显示了编译过程以及在编译过程的每个步骤中创建的文件:
每个包含C程序的文件都必须以’.c’扩展名保存。对于编译器来说,这是一个C程序文件是必需的。假设一个程序文件名为first.c。文件first.c称为源文件,该文件保留了程序的代码。现在,当我们编译文件时,C编译器会查找错误。如果C编译器未报告任何错误,则它将文件存储为同名的.obj文件,称为目标文件。因此,这里将创建first.obj。该.obj文件不可执行。链接器继续执行此过程,最后给出一个可执行的.exe文件。
链接器:首先,让我们知道,库函数不是任何C程序的一部分,而是C软件的一部分。因此,编译器不知道任何函数的操作,无论是printf还是scanf。这些函数的定义存储在编译器应能够链接的它们各自的库中。这就是链接器的作用。因此,当我们编写#include时,它包含stdio.h库,该库提供对标准输入和输出的访问。链接器将目标文件链接到库函数,该程序成为一个.exe文件。在这里,将创建可执行文件格式的first.exe。
加载程序:只要我们发出执行特定程序的命令,加载程序便开始工作。加载程序会将.exe文件加载到RAM中,并向CPU告知该程序加载地址的起点。
指令寄存器:包含要由CPU执行的当前指令。
程序计数器:包含要由CPU执行的下一条指令的地址。
累加器:它存储与计算有关的信息。
加载程序将第一条指令通知程序计数器并启动执行。然后,程序计数器将处理该任务。
链接器和加载器之间的区别
Linker | Loader |
---|---|
Linker generates the executable module of a source program. | Loader loads the executable module to the main memory for execution. |
Linker takes the object code generated by an assembler, as input. | Loader takes executable module generated by a linker as input. |
Linker combines all the object modules of a source code to generate an executable module. | Loader allocates the addresses to an executable module in main memory for execution. |
The types of Linker are Linkage Editor, Dynamic linker. | The types of Loader are Absolute loading, Relocatable loading and Dynamic Run-time loading. |
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。