常见泽1 发表于 2024-6-24 13:31
从源代码到执行文件需要哪些步骤
需要经过如下步骤:预编译 -> 编译 -> 汇编 -> 链接 -> 定位 这几步。
预编译过程:预编译会处理所有的预编译指令,比如#define, #include, #if, #else, #endif...,此过程会将所有的宏进行替换,读取#include包含的全部文件,然后从条件变异种删除不满足的代码;
编译过程:预编译的输出会传输给编译器,由编译器生成特定处理器的机器码(汇编代码),此过程并不会定义函数、便来那个、跳转地址等存储地址,只会以符号的形式存储;
汇编过程:汇编器将将编译之后的程序代码转换为二进制代码,即目标文件。该过程也不会定义函数、变量、跳转地址;
链接过程:链接器将汇编出来的目标文件整合到一个将要完成的程序中,只是仍然没有具体地址。链接过程也会整合一些外部引用库文件,比如.a或者.lib的函数库文件。链接过程也会解析使用到的所有符号(比如函数),会在整合的所有对象中搜索符号,如果搜索到了,则会解析对该符号的引用,如果整合文件中没找到,则会在包含的库文件中查找。如果所有地方都没有搜索到,则会提示“unresolved external <symbolname>”;如果在多个目标文件中都搜索到了,则会提示“redefinieiton of symbol <symbolname>”;
定位过程:定位器就是为每一个符号的存储地址进行分配,定位器的输出文件是可执行文件(一般为hex、s19、elf等),一般开发工具中,都将定位器和链接器合并了,统称为链接器。一般工具还可以创建一个map文件,其中包含所有符号的存储位置列表,方便程序员查看。