美文网首页
静态链接(四)

静态链接(四)

作者: 7bfedbe4863a | 来源:发表于2018-01-25 22:07 被阅读0次

重定位

重定位表
  • 链接器为了知道有哪些指令需要被重定位,所以需要这样的一个表
  • 一个重定位表往往就是ELF文件中的一个段,所以也称为重定位段
  • 每个需要重定位的地方都会有一个重定位入口,它的定义(在ELF中):
typedef struct {
Elf32_Addr offset;//重定位入口的偏移(对于可重定位文件来说,它要修改的是第一个字节相对于段起始位置的偏移;对于可执行文件来说,它修改的是第一个字节的虚拟地址)
Elf32_Word R_info;//重定位入口的类型和符号
}Elf32_Rel;

符号解析

  • 链接符号未定义,最常见的是:链接时缺少了某个库,或者输入目标文件路径不正确,或者符号的声明和定义不一样。为什么?因为找不到符号,重定位会失败。
指令修正方式
寻址方式的区别:
  • 近址寻址或远址寻址
  • 绝对寻址或相对寻址
  • 寻址长度为8位、16位、32位、64位。

对于32位x86平台下的ELF文件的重定位入口所修正的指令寻址方式:

  • 绝对近址32位寻址S+A(修正方式:R_386_32)
  • 相对近址32位寻址S+A-P(修正方式:R_386_PC32)
    S符号的实际位置,A保存在被修正位置的值,P被修正的位置

COMMON块

多个符号定义类型不一致的情况:
  • 两个或两个以上的强符号类型不一样(不需要处理,因为它非法)
  • 有一个强符号,其他的都是弱符号(输出结果和强符号相同,如果弱符号大小>强符号,会警告)
  • 两个或两个以上的弱符号类型不一样(取最大的那个)

编译器将未初始化的全局变量定义作为弱符号使用。

相关文章

  • 静态链接(四)

    重定位 重定位表 链接器为了知道有哪些指令需要被重定位,所以需要这样的一个表 一个重定位表往往就是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/tbmbaxtx.html