GCC程序编译

1.1实验目的

n熟练掌握Linux GCC的使用操作方法

1.2实验内容

n综合运用Linux GCC的技巧操作。

1.3步骤及现象

n利用GCC编译器编译程序

1、实验要求:

编写一个应用程序,使用gcc进行编译,并分别使用-o,-g,-static,-O2等选项,了解这些选项的作用。

2、实验器材:

软件:

安装了ubuntu的VMware虚拟机。

硬件:

PC机一台。

3、背景知识:

ügcc的概念:

GCC(GNU CompilerCollecti on,GNU编译器套装),是一套由GNU开发的编程语言编译器。它是一套以GPL及LGPL许可证所发行的自由软件,也是GNU计划的关键部分,亦是自由的类Unix及苹果电脑MacOSX操作系统的标准编译器。GCC原名为GNU C语言编译器,因为它原本只能处理C语言。GCC很快地扩展,变得可处理C++。之后也变得可处理For tr an、Pascal、Obj ecti v e-C、Jav a,以及Ada与其他语言。我们使用的gcc命令主要是用于处理c语言程序。

ügcc的执行过程:

虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译( Compilation)、汇编( Assembly)和链接( Linki ng)。命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含( i

ncl ude)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的库中连到合适的地方。以上这些过程是gcc内部实现的机制,实际使用中,上述过程可以又通过gcc的选项实现,具体方法请通过实验体会。

4、实验步骤

ü先用vim编辑hello.c文件,内容如图所示:

图1vim编写hello.c

ügcc命令的一般格式为:gcc[选项]要编译的文件[选项][目标文件]。

下面使用命令gcchello.c–ohello,编译hello.c,并生成可执行文件hello,

图2直接生成可执行文件hello

注意:上面的命令将.c文件生成了可执行文件,实际上是将预处理、编译、汇编、连接一步完成,下面我们将介绍四个流程分别做了什么工作。

ü使用–E选项,执行预处理工作。使用命令gcc–E hello.c–o hello.i对hello.c进行预处理,生成文件hello.i,如图所示:

图3使用-E选项

使用命令cat

hello.i查看hello.i文件的内容,如图5-4所示,可以看到头文件

stdio.h中包含的内容替换掉了原先代码中的#include。

图4查看文件hello.i内容

ü使用–S选项,执行编译处理工作。使用命令gcc–S hello.i–o hello.s对hello.i进行编译,生成汇编文件hello.s,如图所示:

图5使用-S选项

使用命令cat

hello.s查看hello.s文件的内容,如图5-6所示,可以看到原来的

c语言代码已被转化为汇编代码。

图6查看文件hello.s内容

ü使用–c选项,执行编译工作。使用命令gcc–chello.s–o

hello.o对hello.s进行汇编,生成目标文件hello.o,如图所示:

图7执行使用-c选项

ü使用命令gcc hello.o–o hello将hello.o链接库,生成可执行文件hello,如图

所示,以上四个步骤就对应了gcc执行过程的四个基本步骤,下面我们来看看gcc其他一些重要的选项。

图8连接生成可执行文件

ü使用–static选项,静态链接库。使用命令gcchello.c–ohello和gcchello.c–static–ohello1分别生成两个可执行文件hello和hello1。头一个文件hello是不加-static选项,默认是链接动态库生成的,如图所示,试比较链接动态库生成的文件hello和链接静态库生成的文件hello1的大小。

图9使用-static选项

可以看到静态链接库的可执行文件hello1要比动态链接库的文件hello大很多,他们的执行效果是一样的。

注意:要使动态链接库的可执行文件能够在机器上运行,必须保证系统中安装有相关的动态链接库,这些库一般在/lib目录下。

ü使用–g选项,在可执行程序中包含标准调试信息。使用命令gcc–ghello.c–o

hello2生成包含调试信息的文件hello2,如图所示,带有调试信息的可执行文件可以使用gdb调试器进行调试,gdb的具体用法将在下节讨论。

10使用-g选项

ü使用–D选项,在编译时进行宏定义。使用命令gcc–DLINUXhello.c–o

hello3生成定义了宏LINUX的的可执行文件hello3,如图所示,将hello3和原可执行文件hello进行比较。

图11修改源码,注释第三行代码

图12使用-D选项

ü使用–O2选项,完成程序的优化工作。为了能够看出优化效果,首先在源代码中添加如图所示内容

图13优化测试代码

使用命令rm

hello? hello–f,删除之前生成的文件,使用命令gcc–O2 hello.c–o hello1生成优化后的可执行文件hello1,使用命令gcc hello.c–o

hello生成未经优化的可执行文件hello。如图5-13所示,将hello1和未优化过的可执行文件hello进行比较。

图14使用-O2选项

提示:事实上gcc有四个优化等级,分别对应选项-O0、-O1、-O2和-O3,其中-O0代表不优化,这个是缺省值,-O1到-O3优化等级逐步提高。另外还有个特殊的优化选项-Os,它通常被称为是优化等级为2.5的优化选项,是在-O2的基础上对代码尺寸进行了进一步优化。另外,为了更好的验证优化的效果,可以使用time命令,如time./hello,可以测试当前目录下可执行文件hello的执行时间。由于实验代码过于简单,所以用time测试基本看不出差别,大家可以自己编写复杂耗时的程序用于这个实验。注意:虽然优化选项可以加速代码的运行速度,但对于调试而言将是一个很大的挑战。

因为代码在经过优化之后,原先在源程序中声明和使用的变量很可能不再使用,控制流也可能会突然跳转到意外的地方,循环语句也有可能因为循环展开而变得到处都有,所有这些对调试来讲都将是一场噩梦。所以笔者建议在调试的时候最好不使用任何优化选项,只有当程序在最终发行的时候才考虑对其进行优化。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容