600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Linux下C语言程序编写及执行和分步骤编译链接C源代码

Linux下C语言程序编写及执行和分步骤编译链接C源代码

时间:2020-07-06 09:00:47

相关推荐

Linux下C语言程序编写及执行和分步骤编译链接C源代码

实验一:Linux下C语言程序编写及执行

//hello.c#include <stdio.h>int main(){int x = 1;int y = 2;int sum = x + y;printf("x+y=%d\n", sum);return 0;}

实验步骤:

步1:gcc -o hello hello.c //直接编译、链接源代码

步2:./hello //运行可执行目标文件,观察实验结果是否与预期相符

过程:1.使用vim编译器编写一个hello.c程序。

按ESC键,从编辑状态—>命令状态,进行:wq保存操作。使用gcc命令进行编译,./hello运行该程序。

分析:实验结果与预期相符,hello.c是文件名,-o表示输出,hello是输出的文件名。

实验二:分步骤编译链接C源代码

使用实验一源代码。

步1: gcc –E hello.c –o hello.i //预处理,生成hello.i

预处理是将引用的头文件的代码加入到C语言代码中,并用实际值替换define定义的字符串,为的是能将hello更好地翻译成汇编语言。程序的预处理过程是将头文件的内容添加到程序里,所以会由原来的十几行变为三千多行。

步2: gcc –S hello.i –o hello.s //编译,生成hello.s

编译是由编译器将hello.i预处理文件翻译成hello.s编写文件的过程。其中,hello.s记录了c程序对应的汇编代码,从而便于机器识别,为下一步转换为机器代码做好条件。

步4: gcc –c hello.s –o hello.o //汇编,生成可重定位目标代码

汇编器(as)将.s汇编语言翻译成为机器语言,在这个过程中,也可以将C程序中应用的库函数一起汇编,最终形成机器可识别的并运行hello.o可执行文件

步5: gcc hello.o –o hello //链接,生成可执行目标代码

概念:链接是将各种代码和数据片段收集并组合称为一个单一文件的过程,这个文件可被加载(复制)到内存并执行。

作用:主要的任务是符号解析和重定位。链接得到的可执行文件可以被加载到内存中运行。

步6: ./hello //执行hello目标文件

步7:objdump -d hello.o > hello.o.asm //反汇编可重定位目标文件hello.o

步8:objdump -d hello > hello.asm //反汇编可执行文件hello

用编辑器分别打开文件hello.c、hello.i、hello.s、hello.o.asm和hello.asm,观察文件的内容。

分析:Hello的一生所经历的过程:第一步,预处理,将hello.c所有的头文件的相关代码合并成一个hello.i文件。第二步,编译,将hello.i或hello.c文件编译成汇编文件hello.s,c语言变成汇编语言.。第三步,汇编,将hello.s翻译成可重定位目标文件hello.o,汇编语言加上机器代码。第四步,链接,将hello.o与库函数连接成可执行目标程序hello。第五步,Shell运行,在Shell中输入运行指令./hello运行出x+y=3。

实验思考

1、阅读hello.o.asm 和hello.asm,思考二者联系与区别。

hello.o.asm可反汇编可重定位目标文件hello.o;hello.asm 可反汇编可执行文件hello

代码有很多相似之处,感觉两者应该可以互相转化。

2、思考C源代码语句与汇编代码的关系。

分析:我认为汇编语言是采用助记符号来编写程序的,用辅助符号代替机器语言的二进制码,就把机器语言变成了汇编语言。可以直接同计算机的底层软件甚至硬件进行交互。编写的代码非常难懂,不好维护,所以出现一些面向过程的语言,C就是其中之一。它把高级语言的基本结构和语句与低级语言的实用性结合起来。C语言可以像汇编语言一样对位、字节和地址进行操作。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。