博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GCC执行过程简介
阅读量:4186 次
发布时间:2019-05-26

本文共 985 字,大约阅读时间需要 3 分钟。

1、简介

       虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。

       命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。

2、执行过程示例

    示例代码 a.c:

    #include <stdio.h>
    int main()
    {
        printf("hello\n");
    }

    预编译过程:
    这个过程处理宏定义和include,并做语法检查。
    可以看到预编译后,代码从5行扩展到了910行。
    gcc -E a.c -o a.i
    cat a.c | wc -l
    5
    cat a.i | wc -l
    910

    编译过程:
    这个阶段,生成汇编代码。
    gcc -S a.i -o a.s
    cat a.s | wc -l
    59

    汇编过程:
    这个阶段,生成目标代码。
    此过程生成ELF格式的目标代码。
    gcc -c a.s -o a.o
    file a.o
    a.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped

    链接过程:
    链接过程。生成可执行代码。链接分为两种,一种是静态链接,另外一种是动态链接。使用静态链接的好处是,依赖的动态链接库较少,对动态链接库的版本不会很敏感,具有较好的兼容性;缺点是生成的程序比较大。使用动态链接的好处是,生成的程序比较小,占用较少的内存。
    gcc a.o -o a

    程序运行:
    ./a
    hello

节摘自百度百科

转载地址:http://chdoi.baihongyu.com/

你可能感兴趣的文章
干货神总结,程序员面试技巧
查看>>
深度解析BAT三家互联网公司,为什么腾讯产品第一,百度技术第一,阿里运营第一?
查看>>
程序员发贴求助:剪短头发能缓解脱发吗?网友:我觉得秃头挺好的
查看>>
史上最难程序员的面试题!谷歌、百度、微软、阿里必答题
查看>>
为什么会出现“程序员千万不要学算法”这种言论?
查看>>
程序员如何做到快速升职?这几点你都做到了吗?
查看>>
第五届世界互联网大会重点介绍工业互联网
查看>>
凭什么程序员工资那么高?网友:某些文职坐着白领钱才让我惊奇
查看>>
程序员准时下班碰见领导,次月发工资时看到绩效莫名被扣20%
查看>>
程序员的月薪决定了对老板的态度:月薪50万,我与公司共存亡
查看>>
你见过最牛逼的程序员是什么样的?拳打回车键,脚踩Emacs编辑器
查看>>
相比加班的程序员,企业更喜欢“偷懒”的程序员?程序员偷的不是懒,是高效!
查看>>
初学Java必备基础知识,编程领域你需要掌握的关键点!
查看>>
阿里五年Java程序员的总结,献给还在迷茫中的你!
查看>>
程序员身上有异味,同事为什么都不会直接告诉他?
查看>>
大数据折射算法“歧视”?王思聪微博抽奖113位,仅有一位男性
查看>>
Java、C、C+ +、PHP、Python分别用来开发什么?一篇文章告诉你!
查看>>
Linux-ACL权限介绍
查看>>
Linux -文件系统
查看>>
Linux常用命令-进程管理
查看>>