美文网首页
四、静态链接

四、静态链接

作者: 凉夜lrs | 来源:发表于2021-04-01 08:01 被阅读0次

可执行文件中的代码段和数据段由目标文件合并而来,如何合并的呢?

1. 两步链接(Two-pass Linking)

采用相似段合并的方法,整个过程分两步。

1.1 空间与地址分配

扫描所有的输入目标文件,获取它们的各个段的长度、属性和位置,将相似的段合并,计算出合并后的长度与位置,并建立映射关系。将文件中的符号表的所有符号收集起来,统一放到一个全局符号表。

1.2 符号解析和重定位

使用上面步骤中得到的信息,读取段的数据、重定位信息,进行符号解析(将引用符号与定义符号建立关联)与重定位。

2. 强符号和弱符号

对C++来说,编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号,是针对定义来说的。

2.1 多次定义的全局符号规则

  • 强符号不允许被多次定义(即不同文件中不能有同名的强符号)。
  • 符号在某个文件中是强符号,在其他文件中是弱符号,则该符号是强符号。
  • 符号在所有文件中都是弱符号,则选占用空间最大的一个。

2.2 C++为什么允许不同类型的弱符号存在

链接器不支持符号类型,即链接器无法判断符号的类型是否一致。

相关文章

  • 静态链接(四)

    重定位 重定位表 链接器为了知道有哪些指令需要被重定位,所以需要这样的一个表 一个重定位表往往就是ELF文件中的一...

  • 四、静态链接

    1.源代码(a.c b.c) 结合$ readelf -S和$ readelf -s的输出,可以获取到两个目标文件...

  • 四、静态链接

    可执行文件中的代码段和数据段由目标文件合并而来,如何合并的呢? 1. 两步链接(Two-pass Linking)...

  • 程序编译链接(四)-- 静态链接

    对于链接器来说,整个链接的过程,就是将几个输入目标文件加工后合并成一个输出文件。那么对于多个输入的文件,链接器是如...

  • 程序的链接(四):静态链接

    Step 1:静态链接的符号解析 依旧用一个简单的C程序来说明。 首先,自定义一个静态库文件: 可以看到,程序中有...

  • 操作系统

    • Linux静态链接和动态链接; (转)静态链接和动态链接1、静态链接静态链接方法:#pragma comme...

  • 静态链接

    静态链接 静态链接涉及的内容包含如下 空间地址的分配 符号解析和重定位 静态库链接 本文的测试代码以及其他文件存在...

  • 静态链接

    编译和链接 预处理 编译扫描(词法分析)、语法分析、语义分析(静态语义是编译器所能分析的,动态语义要在运行期才能确...

  • 静态链接

    大多数编译系统提供编译器驱动程序( compiler driver ),它代表用户在需要时调用语言预处理器、编译器...

  • 静态链接

    静态链接 当有两个目标文件时,如何将它们连接起来形成一个可执行文件?其中发生了什么? 使用两个源代码文件作为研究例...

网友评论

      本文标题:四、静态链接

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