• 编译系统


    一.什么是编译?

    编译是计算机的编译器基于编程语言、目标机器的指令集和操作系统的约定去生成机器码(machine code)的过程。
    GCC C 编译器(linux下是cc编译器)生成的就是汇编码(assember code)的一种形式。而汇编码是机器码不同程序指令给出的文本表示。
    GCC 同时调用一个汇编器(assember code)和链接器(linker)从汇编码中生成可执行的机器码。-- csapp书 p188

    二.编译的流程

    比如我们使用了这样的命令:

                       gcc -o my_exe p1.c p2.c
    

    这条简单的gcc命令实际上包含4个过程:

    1.预处理:
    C 预处理器(preprocesor)会把需要的#include 标识的文件和#define声明的宏(macros) 添加到源代码(source code)中。
    2.编译:
    C 编译器会生成汇编码,依据源码生成了相应的两个p1.s 和p2.s

    3.汇编:
    汇编器把上面的汇编码转换成二进制的目标文件(object-code file) p1.o 和 p2.o. 目标代码是机器码的一种二进制文本形式--它包含了全部的指令。但是没有包含全局变量的地址。

    4.链接:
    链接器归并这两个目标文件和代码需要调用的库函数(比如printf),生成了可执行(excutable)的机器码--文件 my_exe

    参考这篇: https://blog.csdn.net/xiaohouye/article/details/52084770

    值得注意的地方:

    1. 这个过程的机器码有两种形式的,一种是第三步产生的 .o目标文件,一种是最后的可执行文件my_exe。
    2. 链接的过程有静态链接和动态链接。静态链接会把静态库文件全部加入到可执行代码中,动态链接只是在运行时,把调用的库加入到可执行性程序。动态的库一般在linux文件名为.so,在windows下为dll。

    三.编译过程的流程图
    我绘制了一个完整的C编译系统的流程:

  • 相关阅读:
    Teradata中fastload使用
    Teradata 的rank() 和 row_number() 函数
    Oracle 10g下载链接
    SSH时不需输入密码
    Linux环境下GIT初次使用
    模块与包的概念
    迭代器 生成器
    Python
    Python
    函数式编程-尾递归、尾调用
  • 原文地址:https://www.cnblogs.com/crb912/p/9712229.html
Copyright © 2020-2023  润新知