链接

作者: 一块大番薯 | 来源:发表于2018-03-22 16:11 被阅读6次

    原文

    1. 编译系统

    预处理阶段:处理以 # 开头的预处理命令;
    编译阶段:翻译成汇编程序;
    汇编阶段:将汇编程序翻译可重定向目标程序,它是二进制的;
    链接阶段:将可重定向目标程序和 printf.o 等单独预编译好的目标文件进行合并,得到最终的可执行目标程序。


    编译系统

    2. 目标文件

    可执行目标文件:可以直接在内存中执行;
    可重定向目标文件:可与其他可重定向目标文件在链接阶段合并,创建一个可执行目标文件;
    共享目标文件:可以在运行时被动态加载进内存并链接;

    3. 静态链接

    输入是一组可重定向目标文件,输出是一个完全链接的可执行目标文件。链接器主要完成以下两个任务:

    1. 符号解析:将每个符号引用与一个符号定义关联起来。每个符号对应于一个函数、一个全局变量或一个静态变量。
    2. 重定位:将每个符号定义与一个内存位置关联起来。

    4. 动态链接

    静态库有以下两个问题:

    • 当静态库更新时那么整个程序都要重新进行链接;
    • 对于 printf 这种标准函数库,如果每个程序都要有代码,这会极大浪费资源。

    共享库是为了解决静态库的这两个问题而设计的,在 Linux 系统中通常用 .so 后缀来表示,Windows 系统上它们被称为 DLL。它具有以下特点:

    • 在给定的文件系统中一个库对于一个 .so 文件。
    • 引用该库的可执行目标文件都共享这个文件,它不会被复制到引用它的可执行文件中。
    • 在内存中,一个共享库的 .text 节的一个副本可以被不同的正在运行的进程共享。

    相关文章

      网友评论

        本文标题:链接

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