zoukankan      html  css  js  c++  java
  • 程序员的自我修养-链接、装载与库-2 静态链接的过程

    第二部分 静态链接(主要讲了链接过程中的静态链接)

    被隐藏了的过程:预处理、编译、汇编、链接(Build过程 在IDE中)

    预编译:

      源代码hello.cpp和相关头文件(stdio.h)被预编译器cppp预编译成一个.i文件。

      预编译命令:

    gcc -E hello.c -o hello.i
    或者
    cpp hello.c > hello.i

      过程:预编译主要处理那些源代码中的以'#'开始的预编译指令。比如“#include” "#define"等。 

      包括: 展开宏定义;

          处理所有条件预编译指令:"#if" "#ifdef" "#elif" "#else" "#endif";  

          将被包含的文件插入到预编译指令的位置 比如头文件(递归);  

          删除所有的注释;  

            添加行号和文件名标志,方便调式;  

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

    编译:

       预编译过程就是进行一系列的词法分析、语法分析、语义分析以及优化后产生相应的汇编代码文件,是核心部分也是最复杂的部分。

    gcc -S hello.i -o hello.s

        现在的版本的GCC吧预编译和编译合并成一个步骤,cc1程序来完成。

      gcc知识这些后台程序的包装,他会根据不同的参数要求去调用 预编译编译程序cc1、汇编器as、链接器ld

    汇编:

      汇编器是将汇编代码编程机器的可以执行的指令,每一条汇编语句几乎都对应一条机器指令。

    as hello.s -o hello.o
    or
    gcc -c hello.s -o hello.o

    或者使用gcc从源代码开始经过预编译、编译 汇编直接输出 目标文件。

    gcc -c hello.c -o hello.o

    链接:

      将一堆文件链接起来才可以得到最终的可执行文件。

    ld -static x.o xx.o xxx.o

      链接是一个十分重要的过程,在编译的时候举例子:main模块会用到其他模块的fun函数,但是编译的时候并不知道其地址。这件事情就由链接器来完成。当编译完包含fun函数的模块后,

    链接器负责修正该地址。这就是静态链接的基本过程和作用。这个修正的动作叫做重定位 每一个要修正的地方叫做重定位入口

      简直就是在程序里面打补丁嘛

  • 相关阅读:
    [转帖]ExtJs与服务器的交互(一)
    Ext_两种处理服务器端返回值的方式
    命令行调用dubbo远程服务
    【转】Lombok Pojo默认初始值问题
    【转】Python之可变参数,*参数,**参数,以及传入*参数,进行解包
    Python获取并输出当前日期时间
    idea上 实现了Serializable接口,要自动生成serialVersionUID的方法
    mac下python2.x和python3.x的安装方法和升级方法/卸载
    工程代码不编译src的java目录下的xml文件问题及解决
    Spring Aop织入点语法
  • 原文地址:https://www.cnblogs.com/luntai/p/6286705.html
Copyright © 2011-2022 走看看