美文网首页
编译链接流程

编译链接流程

作者: SeatonLv | 来源:发表于2021-12-31 16:40 被阅读0次

    对于C这种编译性语言,我们平时编译时,不管是通过IDE图形界面,还是通过命令行,总感觉编译一下就完成了,然后就得到了针对某OS和某CPU的二进制可执行文件(机器指令的文件)。但是实际上在源码到可执行文件中间隐藏了四个过程,这四个过程被OS默默的处理了。

    编译四个过程:预处理、编译、汇编、链接

    1.预编译

    如果编译过程是一次性完成的话,.i文件只是一个过渡性文件,.i被称为扩展后的c源码文件。


    image

    预处理做了哪些工作?

    ①宏替换:将宏替换为真实的宏体,比如 程序性中有使用NUM这个宏,这个宏的定义为#define NUM 100,程序中所有的NUM都会被替换为100。

    ②包含头文件 将include包含的.h头文件内容,全部复制到.c文件中,因为头文件中定义了类型、宏、函数声明等等,这些都是函数调用会用到的,你调用某个函数时,就必须包含这个函数要的头文件。

    疑问:头文件那么多内容,都包含进去的话,不会太多了吗?

    编译时,编译器只使用要用的东西,用完后包含的内容都会被丢弃,实际上并不占空间。

    ③条件编译 处理#if #endif 这类的东西

    ④处理一些特殊的预处理关键字

    2.编译

    预编译.l文件到.s 汇编文件


    image

    编译做了什么
    将c语法的c源码,翻译为汇编语法的汇编源码。

    3.汇编

    汇编文件到二进制文件


    image

    4.链接

    image

    链接(连接)做了什么

    ①将众多的.o合成一个完整的可执行文件。 .o实现相互依赖的,比如a.o中调用的函数,被定义在了b.o中,如果不链接在一起的话,是无法工作的。

    ②链接时,需要加入额外的启动代码。这个启动代码并不是我们自己写的,main函数是由启动代码调用的,我们的程序是从启动代码开始运行的。

    ③链接为一个可执行文件时,需要进行符号解析和地址重定位

    相关文章

      网友评论

          本文标题:编译链接流程

          本文链接:https://www.haomeiwen.com/subject/qvsgqrtx.html