1.2.2 从源程序到可执行文件
程序的开发和运行涉及计算机系统的不同层次,因而计算机系统层次结构的思想体现在程序开发和运行的各个环节。下面以简单的hello程序为例,简要介绍程序的开发与执行过程,以便使读者加深对计算机系统层次结构概念的认识。
以下是hello.c的C语言源程序代码。
为了让计算机能执行上述应用程序,程序员应按照以下步骤进行处理。
1)通过程序编辑软件得到hello.c文件。hello.c在计算机中以ASCII码存放,如图1.7所示(标准main()函数中应有return语句,为简化图1.7,给出的hello.c中最后省略了语句“return 0;”),图中给出了每个字符对应的ASCII码的十进制值,例如:第一字节的值是35,代表字符“#”;第二字节的值是105,代表字符“i”,最后一字节的值为125,代表字符“}”。通常把用ASCII码字符或汉字字符表示的文件称为文本文件(text file),源程序文件都是文本文件,是可显示和可读的。
图1.7 hello.c源程序文件的表示
2)将hello.c进行预处理、编译、汇编和链接,最终生成可执行目标文件。例如,在Linux系统中,可用GCC编译驱动程序进行处理,命令如下:
上述命令中,最前面的linux>为shell命令行解释器的命令行提示符,gcc为GCC编译驱动程序名,-o表示后面为输出文件名,hello.c为要处理的源程序。从hello.c到可执行目标文件hello的转换过程如图1.8所示。
图1.8 从源程序文件hello.c到可执行目标文件hello的转换过程
• 预处理阶段:预处理程序(cpp)对源程序中以字符#开头的命令进行处理,例如,将#include命令后面的.h文件内容嵌入源程序文件中。预处理程序的输出结果还是一个源程序文件,以.i为扩展名。
• 编译阶段:编译程序(cc1)对预处理后的源程序进行编译,生成一个汇编语言源程序文件,以.s为扩展名,例如,hello.s是一个汇编语言程序文件。汇编语言与具体的机器结构有关。
• 汇编阶段:汇编程序(as)对汇编语言源程序进行汇编,生成可重定位目标文件(relocatable object file),以.o为扩展名,例如,hello.o是一个可重定位目标文件。它是一种二进制文件(binary file),因为其中的代码已经是机器指令,数据以及其他信息也都用二进制表示,所以它是不可读的,即打开后显示的是乱码。
• 链接阶段:链接程序(ld)将多个可重定位目标文件和标准函数库中的可重定位目标文件合并成为可执行目标文件(executable object file),可执行目标文件简称为可执行文件。本例中,链接器将hello.o和标准库函数printf()所在的可重定位目标模块printf.o进行合并,生成可执行文件hello。
最终生成的可执行文件保存在硬盘上,可以通过某种方式启动运行。