zoukankan      html  css  js  c++  java
  • 源代码到可执行文件的过程

    c从源代码到二进制可执行文件,到底经历了哪些步骤呢?

    可分为两部,编译和链接,在linux中,编译的命令是cc -c,链接的命令是cc -o

    而编译又可分为三部,分别是预处理,编译,汇编

    程序的基本流程如图:

    1. 预处理

    预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。

    读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理

    ①将所有的“#define”删除,并且展开所有的宏定义

    ②处理所有的条件编译指令,如:“#if”、“#ifdef”、“#elif”、“#else”、“endif”等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉。

    ③处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。

    (注意:这个过程可能是递归进行的,也就是说被包含的文件可能还包含其他文件)

    删除所有的注释

    添加行号和文件名标识。

    以便于编译时编译器产生调试用的行号信息及用于编译时产生的编译错误或警告时能够显示行号

    保留所有的#pragma编译器指令

    2. 编译

    将预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后,产生相应的汇编代码文件。

    3. 汇编

    将编译完的汇编代码文件翻译成机器指令,并生成可重定位目标程序的.o文件,该文件为二进制文件,字节编码是机器指令。

    汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。所以汇编器的汇编过程相对于编译器来讲比较简单,它没有复杂的语法,也没有语义,也不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译即可。

    4. 链接

    通过链接器将一个个目标文件(或许还会有库文件)链接在一起生成一个完整的可执行程序。

    由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。

    例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。

    链接程序的主要工作就是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。

    至此,大致经过这几个步骤,一个完整的可执行程序产生了。

  • 相关阅读:
    检测右键点击
    o(∩_∩)o. 原来如此,FLV或者流播放结束的事件不是STOP,而是Complete.
    epoll和selecter
    爬虫与Python:(四)爬虫进阶一之数据抓取——1.Ajax简介
    爬虫与Python:(四)爬虫进阶二之数据存储(文件存储)——1.Text存储
    Python之复制文件目录和快捷方式
    爬虫与Python:(三)基本库的使用——扩展:requests爬取阳光电影网源码
    Python内置函数str()——将对象转换为字符串
    爬虫与Python:(四)爬虫进阶一之数据抓取——2.Python模拟Ajax
    爬虫与Python:(三)基本库的使用——扩展:异常处理中except的用法和作用是什么
  • 原文地址:https://www.cnblogs.com/saolv/p/9629148.html
Copyright © 2011-2022 走看看