实验一: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程序。

  1. 按ESC键,从编辑状态—>命令状态,进行:wq保存操作。
  2. 使用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源代码相关推荐

  1. Ubuntu下C语言程序编写与运行

    Ubuntu下C语言程序编写与运行 安装Ubuntu Ubuntu系统下C程序编写与运行 VC6.0下编译C程序 在Ubuntu下用Makefile方式编程主程序 安装Ubuntu 在Windows环 ...

  2. Linux下C语言程序的内存布局(内存模型)

    在<虚拟地址空间以及编译模式>一节中讲到,虚拟地址空间在32位环境下的大小为 4GB,在64位环境下的大小为 256TB,那么,一个C语言程序的内存在整个地址空间中是如何分布的呢?数据在哪 ...

  3. Linux下C语言程序的编译过程

    使用gcc编译程序时,编译工程分为4个阶段: (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) (4)链接:(linking) ...

  4. Linux下C语言程序的内存布局

    以下内容源于C语言中文网的内容学习与整理.如有侵权,请告知删除.

  5. gcc编译c文件_Linux下C语言程序的编译过程

    Linux下C语言程序的编译过程 使用gcc编译程序时,编译工程分为4个阶段: (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) ...

  6. Linux 应用程序 嵌汇编,Linux下C语言嵌汇编

    Using Assembly Language in Linux. Intel和AT&T汇编语法差异: 1.前缀: Intel汇编寄存器和立即数无需前缀.后者寄存器前缀为%,立即数前缀为$. ...

  7. 利用多线程实现linux下C语言的聊天室程序:

    转载:http://www.360doc.com/content/16/0421/11/478627_552531090.shtml 利用多线程实现linux下C语言的聊天室程序: 客户端代码: th ...

  8. Ubuntu下C语言程序的编写

    Ubuntu下C语言程序的编写 要求:请编写一个主程序文件 main1.c 和一个子程序文件 sub1.c, 要求:子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b ...

  9. copy文件的Linux程序代码,Linux下C语言实现CopyFile

    Linux下C语言实现文件拷贝 /* Function:copy file from file1 to file2 How to execute: ./copyfile file1 file2   ( ...

最新文章

  1. 人体姿态估计(Human Pose Estimation)技巧方法汇总
  2. Hibernate组件(Component)映射
  3. iphone屏幕录制_无需第三方APP,苹果iPhone手机屏幕录制的方法
  4. springboot出现Requested bean is currently in creation: Is there an unresolvable circular reference?
  5. 无向图:计算亏格(环的孔洞)
  6. python logger日志级别_python干货分享:使用logging记录日志信息
  7. Mr.J--JS学习(继承模式发展史)
  8. 执行流程 | 你真的了解Spring AOP的执行顺序吗?
  9. php 右下脚弹窗,多种样式jQuery网页右下角弹出提示信息代码
  10. gpt-2 文章自动生成_有助于您理解GPT-3的文章
  11. prototype.js学习(1)
  12. 手机浏览器的扫一扫功能在哪里,有什么作用
  13. eterm单人订座流程
  14. 海思3518E开发笔记1.2——海思SDK脚本学习
  15. 英语数字转换器(POJ NO.1123)
  16. html中改变图标颜色,使用CSS更改图标的颜色
  17. 2022年电工(技师)考试题及电工(技师)模拟试题
  18. xmind的简单使用教程
  19. 鉴客 iPad横屏(Landscape)尺寸规格说明
  20. edge通常不会下载xxxx确保信任xxx怎么解决

热门文章

  1. java 基础进制概述和二,八,十六进制图解
  2. 企业视频会议系统需要服务器吗,企业选择视频会议租用还是自己搭建
  3. spaa的交互式绘图_SPSS-11统计绘图
  4. SPSS新手教学——如何进行ROC分析
  5. 图说超线程技术(Hyper-Threading Technology)
  6. 如何真正认识 Linux 系统结构?这篇文章告诉你
  7. SolidWorks 2008机械设计一册通
  8. 差别阈限法,其依据是韦伯定律还是费希纳定律?|小白心理-312/347考研答疑
  9. 2019-05-23 聚生网管配置;聚生网管应用;
  10. 软件工程课设--在线投票系统