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 语言可以像汇编语言一样对位、字节和地址进行操作。
Linux下C语言程序编写及执行和分步骤编译链接C源代码相关推荐
- Ubuntu下C语言程序编写与运行
Ubuntu下C语言程序编写与运行 安装Ubuntu Ubuntu系统下C程序编写与运行 VC6.0下编译C程序 在Ubuntu下用Makefile方式编程主程序 安装Ubuntu 在Windows环 ...
- Linux下C语言程序的内存布局(内存模型)
在<虚拟地址空间以及编译模式>一节中讲到,虚拟地址空间在32位环境下的大小为 4GB,在64位环境下的大小为 256TB,那么,一个C语言程序的内存在整个地址空间中是如何分布的呢?数据在哪 ...
- Linux下C语言程序的编译过程
使用gcc编译程序时,编译工程分为4个阶段: (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) (4)链接:(linking) ...
- Linux下C语言程序的内存布局
以下内容源于C语言中文网的内容学习与整理.如有侵权,请告知删除.
- gcc编译c文件_Linux下C语言程序的编译过程
Linux下C语言程序的编译过程 使用gcc编译程序时,编译工程分为4个阶段: (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) ...
- Linux 应用程序 嵌汇编,Linux下C语言嵌汇编
Using Assembly Language in Linux. Intel和AT&T汇编语法差异: 1.前缀: Intel汇编寄存器和立即数无需前缀.后者寄存器前缀为%,立即数前缀为$. ...
- 利用多线程实现linux下C语言的聊天室程序:
转载:http://www.360doc.com/content/16/0421/11/478627_552531090.shtml 利用多线程实现linux下C语言的聊天室程序: 客户端代码: th ...
- Ubuntu下C语言程序的编写
Ubuntu下C语言程序的编写 要求:请编写一个主程序文件 main1.c 和一个子程序文件 sub1.c, 要求:子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b ...
- copy文件的Linux程序代码,Linux下C语言实现CopyFile
Linux下C语言实现文件拷贝 /* Function:copy file from file1 to file2 How to execute: ./copyfile file1 file2 ( ...
最新文章
- 人体姿态估计(Human Pose Estimation)技巧方法汇总
- Hibernate组件(Component)映射
- iphone屏幕录制_无需第三方APP,苹果iPhone手机屏幕录制的方法
- springboot出现Requested bean is currently in creation: Is there an unresolvable circular reference?
- 无向图:计算亏格(环的孔洞)
- python logger日志级别_python干货分享:使用logging记录日志信息
- Mr.J--JS学习(继承模式发展史)
- 执行流程 | 你真的了解Spring AOP的执行顺序吗?
- php 右下脚弹窗,多种样式jQuery网页右下角弹出提示信息代码
- gpt-2 文章自动生成_有助于您理解GPT-3的文章
- prototype.js学习(1)
- 手机浏览器的扫一扫功能在哪里,有什么作用
- eterm单人订座流程
- 海思3518E开发笔记1.2——海思SDK脚本学习
- 英语数字转换器(POJ NO.1123)
- html中改变图标颜色,使用CSS更改图标的颜色
- 2022年电工(技师)考试题及电工(技师)模拟试题
- xmind的简单使用教程
- 鉴客 iPad横屏(Landscape)尺寸规格说明
- edge通常不会下载xxxx确保信任xxx怎么解决