程序员的自我修养 3.2 ELF文件 重定位表 字符串表符号

.rea.text(Relocation Table)重定位表
链接器在处理目标文件时,必须对目标文件中某些部位进行重定位,即代码段与数据段中那些对绝对地址的引用的位置
这些重定位信息就记录在ELF文件的重定位表中
如果在.text中至少有一个绝对地址的引用,那就会有.rel.text.

字符串表

一种常见的方式,将变量名,段名等存放到一个表,然后使用字符串在表中的偏移来引用字符串
在这里插入图片描述
那么偏移与它们对应的字符串如下表
在这里插入图片描述
通过这样的方式,ELF文件中引用字符串只需要给出一个数字下标就可以了,不用考虑字符串长度的问题.
常见的段名为.strtab或.shstrtab,这两个分别叫字符串表和段表字符串表(section head string table)

链接的接口:符号

函数和变量统称为符号(symbol).函数名和变量名就是符号名(symbol name)
在本目标文件中引用的全局符号,却没有定义在本目标文件中,一般称为外部符号(External Symbol)

链接过程只关注全局符号的相互’粘合’,局部符号,段名,行号等都是次要的,因为它们对于其他目标文件是’不可见’的,在链接过程中也是无关紧要的.

特殊符号

在ld作为链接器来生产可执行文件时,它会为我们定义很多特殊的符号,这些符号并没有在你的程序中定义,但是你可以直接声明并且引用它,我们称之为特殊符号.其实这些符号是被定义在ld链接器的链接脚本中的.

  • __executable_start,该符号为程序起始地址,注意不是入口地址,时程序最开始的地址
  • __exext或_exext或exext,该符号为代码段结束地址,即代码段最末尾的地址
  • _edata或edata,该符号是数据段结束地址,即数据段最末尾的地址
  • _end或end,该符号是程序结束地址
    以上都是程序被装载时的虚拟地址

c++的修饰符

为了支持c++中的函数重载,人们发明了符号修饰(name decoration)或符号改编(name mangling)的机制.
利用函数签名(function signature),用于识别不同的函数,就像签名用于识别不同的人一样,函数的名字只是函数前面的一部分.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值