通过高级语言书写的程序,计算机是无法运行的。需经过编译-汇编-链接步骤,翻译成机器语言,这样才能运行在计算机上。
编译
根据程序的预处理命令,完成简单的预编译处理。检查程序是否符合语言约束,是否有编写、逻辑错误。
然后将其翻译成中间代码,其中会有部分汇编代码,对于变量以及函数调用,使用变量名占位。
汇编
根据上一步的中间代码文件,将其翻译为机器代码。
对文件中的变量地址、函数地址、大小,进行了记录,包括符号表(此模块包含哪些符号,符号在文件中的位置,符号在程序中的真正地址(根据text段可以计算出来,初始时为0,连接时替换))、重定位符号表(使用的外部文件的符号,及其在文件中的偏移位置),但是程序中使用的变量以及函数调用,保持占位。
生成目标文件。此时同正真的可执行文件很相似了,但由于程序中调用的变量以及函数的地址为空白,并且文件的ELF类型标志位不可执行的。
连接
多个目标文件合并,生成所有符号在程序中的正真地址,按照重定位表,替换相应位置的操作数,生成最终的可执行文件。
对于动态链接的方式,会在程序运行时,在将偏移位置的操作数替换掉。