• C专家编程 第5章 对链接的思考 5.1 函数库、链接和载入


    链接器(linker)的基础知识:编译器创建一个输出文件,这个文件包含了可重定位的对象。这些对象就是与源程序对应的数据和机器指令。

    链接器位于编译过程的那一阶段 
    SRV4系统中的复杂链接形式。
    C预处理器--->(阶段p)前端(语法和语义分析)---->(阶段o)后端(代码生成器)---->
    (阶段c)优化器---->(阶段2)汇编程序---->(阶段a)链接-载入器 
    绝大多数编译器并不是一个单一的庞大程序。他们通常有多达六七个稍小的程序所组成,这些程序由一个叫作“编译器驱动器”(compiler driver)的控制程序来调用。这些方便从编译器中分离出来的单独程序包括预处理区(preprocessor)、词法和词义检查器(syntactic and semantic checker)、 代码生成器(code generator)、汇编程序(assembler)、优化器(optimizer)、链接器(linker)、当然包括一个调用所有这些程序并向各个程序传递正确选项的驱动器程序(driver program) 。优化器几乎可以加上上述所有阶段的后面。当前的SPARC在编译器的前端和后端之间的中间表示层执行绝大部分的优化措施。

    独立的程序更容易设计和维护。

    控制预处理过程的规则是预处理阶段所独有的,它跟C语言的其他部分并没有多少共同之处。
    C预处理器经常(但并不总是)是一个独立的程序。如果代码生成器(又称为“后端”)被编写
    成一个独立的程序,它很可能被其他语言共享。这种设计方法的代价是运行几个更小的程序比
    运行一个大型程序所花费的时间要长(因为存在初始化进程以及在各个阶段之间传递信息的开销)。
    -#选项查看编译过程的各个独立阶段。-V选项能提供版本信息。

    通过给编译器驱动器一个特殊的-W选项(表示传递这个选项到那个阶段)向各个阶段传递选项信息。
    “W”后面跟一个字符(提示那个阶段),一个逗号,然后就是具体的选项。

    编译器驱动器向链接器传递任何选项,必须在具体的选项前面加上-W1前缀,告诉编译器驱动器这个选项是想传给链接器。

    cc -W1, -m main.c > main.linker.map
    将-m选项传递给链接-载入器,要求它产生链接器映像。

    目标文件并不能直接执行,它首先需要载入到链接器中。链接确认main函数为初始进入点(程序开始执行的地方),把符号引用(symbolic reference)绑定到内存地址,把所有的目标文件集中在一起,再加上库文件,从而产生可执行文件。

    PC的链接机制与那些更大系统的链接机制有着巨大的区别。PC的链接器一般只提供几个基本的I/O服务,就是被称为BIOS的程序。他们存在于内存中固定的地点,并不是每个可执行文件的一部分。如果PC程序或程序套件需要更高级的服务,可以通过库函数提供,但编译器必须把库函数链接到每个可执行文件中。
    在MS-DOS中,没有办法推断出函数库对其中哪些程序较为常用,从而只在PC上安装一次。

    UNIX系统以前也是如此。当链接程序时,需要使用的每个库函数的一份副本被加入到可执行文件中。
    近几年,一种更为现代和优越的被称为动态链接的方法逐渐被采用。

    动态链接允许系统提供一个庞大的函数库集合,可以提供许多有用的服务。但是,程序将在运行时寻找它们,而不是把这些函数库的二进制代码作为自身可执行文件的一部分。

    如果函数库的一份副本是可执行文件的物理组成部分,那么我们称之为静态链接:如果可执行文件只是包含了文件名,让载入器在运行时能够寻找程序所需要的函数库,那么我们称之为动态链接。

    收集模块准备执行的3个阶段的规范名称是链接-编辑(link-editing)、载入(loading)和运行时链接(runtime linking)。静态链接的模块被链接编辑并载入以便运行。动态链接的模块被链接编辑后载入,并在运行时进行链接以便运行。程序执行时,在mian()函数被调用前,运行时载入器把共享的数据对象载入到进程的地址空间。外部函数被真正调用之前,运行时载入器并不解析他们。所以链接了函数库,如果并没有实际调用,也不会带来额外的开销。 

    即使在静态链接中,整个libc.a文件也没有被全部装入到可执行文件中,所装入的只是所需要的函数。

  • 相关阅读:
    Python基础学习:字符串分割方法详解
    [附源码]Python计算机毕业设计Django网文论坛管理系统
    再来一次,新技术搞定老业务「GitHub 热点速览 v.22.44」
    统计学习方法-感知机
    教培机构怎么做在线教育直播
    C++ 窗体程序初步(全网最全)
    信息学奥赛一本通:1410:最大质因子序列
    使用JSAPl来做一个倒计时的效果
    Java线程状态
    GO语言gin框架实战-01-基本使用
  • 原文地址:https://blog.csdn.net/weixin_40186813/article/details/126074241