Linux下C语言程序编写及执行和分步骤编译链接C源代码
时间:2023-12-27 07:07:02
实验一:Linux编写和执行下C语言程序
//hello.c #include 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是输出的文件名。
实验2:逐步编译链接C源代码
使用实验一源代码。
步1: gcc –E hello.c –o hello.i //预处理,生成hello.i
预处理是在C语言代码中代码添加到C语言代码中,并用实际值替换define为了能够定义字符串hello更好地将其翻译成汇编语言。程序的预处理过程是将头部文件的内容添加到程序中,因此将从十几行改为3000多行。
步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语言可以像汇编语言一样对位、字节和地址。