当前位置: 首页 > news >正文

链接器和装载器--符号管理

符号管理链接关键功能主要用于实现不同模块之间符号关联关系管理如果不能解决模块之间符号引用问题那么链接器其他功能也就没有什么太大用处

5.1 符号名绑定解析

链接器处理各种类型符号处理模块之间符号相互引用每个输入模块都有一张符号表其中符号包括

1 当前模块定义全局符号

2 在本模块引用但未被定义全局符号

3 名称通常用于调试crash dump 分析链接过程几乎不会被用到这些符号但是时候它们全局符号混在一起在这种情况下连接器可以识别跳过他们或者他们文件中创建一个单独或者他们创建一个单独调试信息文件

4 信息用于调试过程中建立目标代码代码之间对应关系

链接读入输入文件所有符号表提取有用信息也就是链接过程中重要信息然后他们汇集一起建立一个面向链接过程符号表最后链接会将部分全部符号信息放置输出文件中具体存储哪些信息输出文件格式决定

某些格式会在一个文件中存在多张符号表例如ELF共享库会有一个动态链接所需要信息符号表以及一个更加详细符号表支持调试链接这种设计思路其实非常有效动态链接过程所用到符号通常仅仅整个文件全部符号很少一部分因此他们创建一个独立可以加快动态链接的速度也就是运行速度毕竟相比运行而言调试链接一个机会还是很少

5.2 符号表格式

链接使用符号表编译器使用的相近由于链接用到符号一般没有编译器那么复杂所以符号通常更简单一些链接用到多张符号表第一张符号表用于记录输入文件模块文件信息第二张符号表用于记录全局符号也就是链接需要所有输入文件中进行查表定位解析符号第三个表用于记录模块内部调试符号尽管少数情况链接也会调试符号建立完整符号但是通常只是输入调试符号直接传递输出文件

链接内部符号表通常数组形式保存每个符号信息一个通过一个哈希函数来定位也可以指针组成数组指针指向真正符号信息同样使用哈希函数进行定位哈希冲突所有冲突链表形式依次后面如图5-1.需要表中定位一个符号链接根据符号计算哈希值树木取模定位对应也就是说b哈希值选取然后遍历其中符号找到所要符号

哈希检索符号表 表中每一项是一个指针

符号 符号 符号

符号 符号

符号

struct sym* symbash()

struct sym {

struct sym *next;

int fullhash;

char *symname;

};

5.1 符号表符号可以直接组织成为一张表也可以形成一张节点形式串接表中符号表通常使用哈希方法进行检索。

传统链接仅能支持较短符号名称例如IBM主机系统符号8符号早期多数DEC系统上使用UNIX系统符号6符号甚至出现过一些小型计算机符号仅有2字符现代链接支持符号名称要长一方面由于开发人员倾向使用更长名称语言中虽然一直支持符号名但是要求使用符号8符号就能够区分所有符号同样会给开发人员造成困扰另一方面因为编译器符号名称进一步加长把一些类型信息通过编码加入符号名称中

早期链接由于名称长度有限查找哈希链表会对每一个符号名称进行自符比较直到找到匹配项便利完毕现在程序经常使用很多符号最后几个字符区别前面符号都是相同使得字符串比较开销变大一个简单解决办法是将符号名哈希值也保存在符号表中并且哈希值相同时候进行字符串比较符号解析过程中如果出现了一个哈希表无法找到符号链接可能会为创建一个新的符号加入相应可能报错具体处理方式符号解析上下文决定


http://www.mrgr.cn/news/27282.html

相关文章:

  • 第二十五章 添加数字签名
  • [Python学习日记-21] Python 中的字符编码(上)
  • JAVA:Nginx(轻量级的Web服务器、反向代理服务器)--(1)
  • 通过API接口获取数据:高效、灵活的数据交互之道
  • Oracle ADG主备停机小版本升级
  • 数据结构——(java版)Map与Set
  • LabVIEW机械产品几何精度质检系统
  • Spring 框架——@Async 注解
  • 订单编号生成规则
  • 指针(c++)[部分]
  • 数据清洗-缺失值填充-XGboost算法填充
  • SOMEIP_ETS_109: SD_Do_not_specify_a_port
  • Python3 SMTP发送邮件
  • 不同的二叉搜索树
  • C/S架构与B/S架构的适用场景分析
  • 一口气学完docker【入门到精通】
  • Day19笔记-包和模块
  • 读构建可扩展分布式系统:方法与实践04应用服务
  • win7 win10 win11找不到该项目的文件怎么删除,请确认该项目的位置,找不到文件的解决办法
  • LEAN 赋型唯一性(Unique Typing)之 n-provability 注解