程序编译过程
程序编译程序的编译过程如下图所示,分为预处理、编译、汇编、链接等几个阶段。预处理:预处理相当于根据预处理命令组装成新的C程序,不过常以i为扩展名。编译:汇编:将得到的i文件翻译成汇编代码。s文件。将汇编文件翻译成机器指令,并打包成可重定位
目标程序的O文件。该文件是二进制文件,字节编码是机器指令。链接:将引用的其他O文件并入到我们程序所在的o文把用高级
件中,处理得到最终的可执行文件。编译程序
程序设计语言书写的源程序,翻译成等价的计算机汇编语言或机器语言书写的目标程序的翻译程序。
汇编程序汇编代码:汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。目标程序又称“目的程序”。由编译程序将源程序编译成与之等价的由机器码构成的,计算机能直接运行的程序,该程序叫目标程序。链接器li
ker将一个个的目标文件或许还会有若干程序库链接在一
f起生成一个完整的可执行文件。在符号解析symbolresolutio
阶段,链接器按照所有目标文件和库文件出现在命令行中的顺序从左至右依次扫描它们,在此期间它要维护若干个集合1集合E是将被合并到一起组成可执行文件的所有目标文件集合;2集合U是未解析符号u
resolvedsymbols,比如已经被引用但是还未被定义的符号的集合;3集合D是所有之前已被加入到E的目标文件定义的符号集合。一开始,E、U、D都是空的。
链接器的工作过程:1对命令行中的每一个输入文件f,链接器确定它是目标文件还是库文件,如果它是目标文件,就把f加入到E,并把f中未解析的符号和已定义的符号分别加入到U、D集合中,然后处理下一个输入文件。2如果f是一个库文件,链接器会尝试把U中的所有未解析符号与f中各目标模块定义的符号进行匹配。如果某个目标模块m定义了一个U中的未解析符号,那么就把m加入到E中,并把m中未解析的符号和已定义的符号分别加入到U、D集合中。不断地对f中的所有目标模块重复这个过程直至到达一个不动点fixedpoi
t,此时U和
fD不再变化。而那些未加入到E中的f里的目标模块就被简单地丢弃,链接器继续处理下一输入文件。3如果处理过程中往D加入一个已存在的符号,或者当扫描完所有输入文件时U非空,链接器报错并停止动作。否则,它把E中的所有目标文件合并在一起生成可执行文r