admin管理员组

文章数量:1794759

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

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 语言可以像汇编语言一样对位、字节和地址进行操作。

    本文标签: 源代码步骤语言链接程序