作业要求在Cygwin下,用gcc 对 教材1.4.1 中 hello.c 分别实现预处理、编译、汇编、链接。注意分析分析hello.i,hello.s;并用 objdump -d hello.o 将显示内容与hello.s对比。在网上搜罗一番后总结了一下内容~
首先在Win10下安装Cygwin。http://www.cygwin.com/。
(Cygwin是一个在Window上运行的模拟Unix环境)
然后安装gcc。http://www.equation.com/servlet/equation.cmd?fa=fortran。
下载完成后,找到安装目录的bin目录,将路径右键复制下来,找到计算机,右键,属性。点击 高级系统设置,在系统变量里面找到 Path变量,新增刚刚复制的bin目录,点击确定。
测试是否安装成功,在cmd命令提示符里面输入 gcc --help 回车。
(GNU编译器套件(GNU Compiler Collection)包括C、C++、Fortran等,也包括了这些语言的库(如libstdc++、libgcj等等)。)
下面具体操作对hello.c 分别实现预处理、编译、汇编、链接。
gcc的编译流程分为四个步骤,分别为:
・ 预处理(Pre-Processing)
・ 编译(Compiling)
・ 汇编(Assembling)
・ 链接(Linking)
hello.c源代码
#include
int main()
{
printf("hello,world!\n");
}
用Sumbilme text编写上述代码后放入D:\Cygwin\home\chao中(即Cygwin目录下的home的下一个文件)
注:
gcc指令的一般格式为:gcc [选项] 要编译的文件 [选项] [目标文件]
其中,目标文件可缺省,gcc默认生成可执行的文件名为:编译文件.out
(1)预处理(Pre-Processing)
· 预处理阶段对源程序中以字符#开头的命令进行处理,例如,将#include命令后面的.h文件内容嵌入到源程序文件中。预处理程序的输出结果还是一个源程序文件,以i为扩展名。
输入:gcc –E hello.c –o hello.i
其中选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序,“-E”为激活预处理,表示让gcc只进行“预处理”就行了, 所谓的预处理,就是把程序中的宏展开, 把头文件的内容展开包含进来等等一些编译前的预处理操作,预处理结果会显示到屏幕上,如果需要保存,则得需要定向。
(2)编译(Compiling)
· 编译阶段是对预处理后的源程序进行编译,生成一个汇编语言源程序文件,以s为扩展名,例如,hello.s是一个汇编语言程序文件。
输入:gcc –S hello.i –o hello.s
其中“-S”用法与“-E类似”。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
(3)汇编(Assembling)
· 汇编阶段对汇编语言源程序进行汇编,生成一个可重定位目标文件,以o为扩展名,例如hello.o是一个可重定位目标文件。它是一种二进制文件,其中代码已经是机器指令,数据以及其他信息也都是用二进制表示的,所以它是不可读的,即打开显示出来的是乱码。
输入:gcc –c hello.s –o hello.o
其中“-c”用法与“-S”,“-E”类似。
(4)链接(Linking)
· 连接程序将多个可重定位目标文件和标准库函数合并成为一个可执行目标文件,可执行目标文件简称可执行文件。本例中,将hello.o和标准库函数printf所在的可重定位目标模块printf.o进行合并生成可执行文件hello。
输入:gcc hello.o –o hello
运行该可执行文件
$ ./hello
出现正确的结果如下
hello,world将以上各过程总结,分析编译的过程 ----> 获得机器码
1、预处理: gcc -E project.c -o project.i //生成预处理文件 project.i 宏展开 包含展开
2、编译: gcc -S project.i -o project.S //生成汇编文件 project.S //高级语言转成低级语言
3、汇编: gcc -c project.S -o project.o //生成机器语言 project.o 生成未地址定位的机器码
4、链接: gcc project.o -o project //生成可运行程序project 加载库文件
补充知识:
objdump。反汇编:把目标代码转为汇编代码的过程,也可以说是把机器语言转换为汇编语言代码、低级转高级的意思。