gcc 编译过程

gcc 编译过程
hello.c hello(a.out)文件, 必须历经 hello.ihello.shello.o,最后才得到 hello(
a.out)文件,分别对应着预处理、编译、汇编和链接 4 个步骤,整个过程如图 10.5 所示。

4 步大致的工作内容如下:
1) 预处理, C 编译器对各种预处理命令进行处理,包括头文件包含、宏定义的扩
展、条件编译的选择等;
2) 编译,将预处理得到的源代码文件,进行“翻译转换”,产生出机器语言的目标
程序,得到机器语言的汇编文件;
3) 汇编,将汇编代码翻译成了机器码,但是还不可以运行;
4) 链接,处理可重定位文件,把各种符号引用和符号定义转换成为可执行文件中
的合适信息,通常是虚拟地址。

下面根据 hello.c 这个示例,跟踪一下其中的细节。
1)预处理
gcc 命令加上-E 参数,可以得到预处理文件。输入下列命令:
vmuser@Linux-host:hello$ gcc -E hello.c –o hello.i
将会产生 hello.i 文件,这就是 hello.c 经过预处理后的文件。实际操作结果见图 10.6

10.6 预编译得到 hello.i 文件
一个原本连同空行才 8 行的代码,经过预处理,得到了一个 800 多行的预处理文件,文
件开的内容如图 10.7 所示。

10.7 hello.i 文件开头
hello.i 文件末尾处的内容如图 10.8 所示。


10.8 hello.i 文件末尾
其余部分内容请用 Vi 打开后进行查看。可以看到, hello.c 经过预处理后得到的 hello.i
文件,除了原本的几行代码之外,还包含了很多额外的变量、函数等等,这些都是预处理器
处理的结果。
2)编译
gcc 编译参数加上-S,可以将 hello.i 编译成 hello.s 文件。命令如下:
vmuser@Linux-host:hello$ gcc -S hello.i

实际操作和结果如图 10.9 所示。

10.9 编译得到 hello.s 文件
hello.s 是一个汇编文件,可用 Vi 编辑器打开查看,如图 10.10 所示。


10.10 hello.s 文件内容
可以看到,该文件内容都是汇编语句。这里不对汇编进行解释。
3)汇编
得到了汇编文件后,通过 gcc 就可以得到机器码了。在终端输入下列命令,可以得到
hello.o 文件。
vmuser@Linux-host:hello$ gcc -c hello.s
实际操作和结果如图 10.11 所示。


10.11 汇编得到 hello.o 文件
4)链接
尽管已经得到了机器码,但这个文件却还是不可以运行的,必须要经过链接才能运行。
在终端输入下列命令,将会得到可执行文件 a.out
vmuser@Linux-host:hello$ gcc hello.o
操作和结果如图 10.12 所示。


10.12 链接得到 a.out 文件
a.out gcc 默认输出文件名称,可以通过-o 参数指定新的文件名。例如加上“-o hello
参数,将会生成 hello 文件,这个文件和 a.out 实际上是一样的,用 md5sum 命令计算文件校
验值,两者完全一样,如图 10.13 所示。


10.13 a.out hello 文件
链接可分为动态链接和静态链接:
动态链接使用动态链接库进行链接,生成的程序在执行的时候需要加载所需的动态
库才能运行。动态链接生成的程序小巧,但是必须依赖动态库,否则无法执行。
Linux 下的动态链接库实际是共享目标文件(shared object),一般是.so 文件,
作用类似于 Windows 下的.dll 文件。
静态链接使用静态库进行链接,生成的程序包含程序运行所需要的全部库,可以直
接运行,不过体积较大。
Linux 下静态库是汇编产生的.o 文件的集合,一般以.a 文件形式出现。
gcc 默认是动态链接,加上-static 参数则采用静态链接。再来看 hello.c 示例,在链接的
时候加上-static 参数:
vmuser@Linux-host:hello$ gcc hello.o -static -o hello_static
操作命令和结果如图 10.14 所示,可以看到,动态链接生成的文件大小是 7155 字节,
而静态链接生成的文件却有 616096 字节,体积明显大了很多。


10.14 静态链接和动态链接结果对比

转载于:https://www.cnblogs.com/wjchao/p/7460375.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/391514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虎牙直播电影一天收入_电影收入

虎牙直播电影一天收入“美国电影协会(MPAA)的首席执行官J. Valenti提到:“没有人能告诉您电影在市场上的表现。 直到电影在黑暗的剧院里放映并且银幕和观众之间都散发出火花。 (“The CEO of Motion Picture Association of America (MPAA) J. Valenti mentioned th…

Python操作Mysql实例代码教程在线版(查询手册)_python

实例1、取得MYSQL的版本在windows环境下安装mysql模块用于python开发MySQL-python Windows下EXE安装文件下载 复制代码 代码如下:# -*- coding: UTF-8 -*- #安装MYSQL DB for pythonimport MySQLdb as mdb con None try: #连接mysql的方法:connect(ip,user,pass…

批判性思维_为什么批判性思维技能对数据科学家至关重要

批判性思维As Alexander Pope said, to err is human. By that metric, who is more human than us data scientists? We devise wrong hypotheses constantly and then spend time working on them just to find out how wrong we were.正如亚历山大波普(Alexander Pope)所说…

Manjaro 17 搭建 redis 4.0.1 集群服务

安装Redis在Linux环境中 这里我们用的是manjaro一个小众一些的发行版 我选用的是manjaro 17 KDE 如果你已经安装好了manjaro 那么你需要准备一个redis.tar.gz包 这里我选用的是截至目前最新的redis 4.0.1版本 我们可以在官网进行下载 https://redis.io/download选择Stable &…

快速排序简便记_建立和测试股票交易策略的快速简便方法

快速排序简便记Note from Towards Data Science’s editors: While we allow independent authors to publish articles in accordance with our rules and guidelines, we do not endorse each author’s contribution. You should not rely on an author’s works without se…

robot:List变量的使用注意点

创建list类型变量,两种方式,建议使用Create List关键字 使用该列表变量时需要变为${}方式,切记切记! 转载于:https://www.cnblogs.com/gcgc/p/11429482.html

python基础教程(十一)

迭代器 本节进行迭代器的讨论。只讨论一个特殊方法---- __iter__ ,这个方法是迭代器规则的基础。 迭代器规则 迭代的意思是重复做一些事很多次---就像在循环中做的那样。__iter__ 方法返回一个迭代器,所谓迭代器就是具有next方法的对象,在调…

美剧迷失_迷失(机器)翻译

美剧迷失Machine translation doesn’t generate as much excitement as other emerging areas in NLP these days, in part because consumer-facing services like Google Translate have been around since April 2006.如今,机器翻译并没有像其他NLP新兴领域那样…

机器学习中决策树的随机森林_决策树和随机森林在机器学习中的使用

机器学习中决策树的随机森林机器学习 (Machine Learning) Machine learning is an application of artificial intelligence that provides systems the ability to automatically learn and improve from experience without being explicitly programmed. The 3 main categor…

【Python算法】遍历(Traversal)、深度优先(DFS)、广度优先(BFS)

图结构: 非常强大的结构化思维(或数学)模型。如果您能用图的处理方式来规范化某个问题,即使这个问题本身看上去并不像个图问题,也能使您离解决问题更进一步。 在众多图算法中,我们常会用到一种非常实用的思…

我如何预测10场英超联赛的确切结果

Is there a way to predict the outcome of any soccer game with 100% accuracy? The honest and simplest answer is…. no. Regardless of what your fantasy football friends say, there is absolutely no way to be 100% certain, but there is a proven, mathematical …

深度学习数据自动编码器_如何学习数据科学编码

深度学习数据自动编码器意见 (Opinion) When I first wanted to learn programming, I coded along to a 4 hour long YouTube tutorial.刚开始学习编程时,我编写了长达4个小时的YouTube教程。 “Great,” I thought after finishing the course. “I know how to …

Angular 5.0 学习2:Angular 5.0 开发环境的搭建和新建第一个ng5项目

1.安装Node.js 在开始工作之前,我们必须设置好开发环境。如果你的机器上还没有Node.js和npm,请先安装它们。去Node.js的官网,https://nodejs.org/en/,点击下载按钮,下载最新版本,直接下一步下一步安装即可&…

robot:根据条件主动判定用例失败或者通过

场景: 当用例中的断言部分需要满足特定条件时才会执行,如果不满足条件时,可以主动判定该用例为passed状态,忽略下面的断言语句。 如上图场景,当每月1号时,表中才会生成上月数据,生成后数据不会再…

图深度学习-第1部分

有关深层学习的FAU讲义 (FAU LECTURE NOTES ON DEEP LEARNING) These are the lecture notes for FAU’s YouTube Lecture “Deep Learning”. This is a full transcript of the lecture video & matching slides. We hope, you enjoy this as much as the videos. Of cou…

Git上传项目到github

2019独角兽企业重金招聘Python工程师标准>>> Git入门 个人理解git就是一个上传工具,同时兼具和svn一样的版本控制功能(此解释纯属本人个人观点) Github是什么 github就是一个分布式版本管理系统(反正我就是这么认为的…

robot:当用例失败时执行关键字(发送短信)

使用场景: 当用例失败时需要通知对应人员,则需要在Teardown中,使用关键字Run Keyword If Test Failed Send Message关键字为自定义关键字,${content}为短信内容,${msg_receiver}为短信接收者列表。 当然执行成功时需要…

项目经济规模的估算方法_估算英国退欧的经济影响

项目经济规模的估算方法On June 23 2016, the United Kingdom narrowly voted in a country-wide referendum to leave the European Union (EU). Economists at the time warned of economic losses; the Bank of England produced estimates that that GDP could be as much …

奇迹网站可视化排行榜]_外观可视化奇迹

奇迹网站可视化排行榜]When reading a visualization is what we see really what we get?阅读可视化内容时,我们真正看到的是什么? This post summarizes and accompanies our paper “Surfacing Visualization Mirages” that was presented at CHI …

机器学习 量子_量子机器学习:神经网络学习

机器学习 量子My last articles tackled Bayes nets on quantum computers (read it here!), and k-means clustering, our first steps into the weird and wonderful world of quantum machine learning.我的最后一篇文章讨论了量子计算机上的贝叶斯网络( 在这里阅读&#xf…