详解ELF重定向原理

重定向是计算机技术中非常底层的概念和操作。它指的是将程序中涉及到的变量名与变量在计算机内存中的位置关联起来。当在代码中执行类似x=1;的语句时,编译器需要通过重定向信息找到变量x对应的内存位置,然后将数值1写入该内存,因此重定向既跟程序的加载链接有关,又于编译原理有关,因此对计算机体系结构不了解,或只关注上层应用开发,对底层技术理解不多的同学对它进行掌握就会有些困难。

为了准确将变量对应到具体的内存位置,就必须要有相关信息来描述变量名与内存之间的关系,这些信息就叫重定向记录(relocation records),程序中描述的“变量”不仅仅指int,float类型的数据变量,还会涉及到函数的入口地址,而函数或者变量的入口地址常常在链接或动态装载时才会确定。例如下面代码:

void _start() {
    foo()
}

如果boo实现放在一个obj1.c文件,函数foo实现放在boj2.c文件,那么编译后_start函数对应的二进制指令存储在obj1.o中,foo对应的二进制指令存储在obj2.o中,于是整个程序要顺利执行,就必须将obj1.o和obj2.o整合在一起,负责整合工作的就是连接器,它位于Linux系统的目录/bin/ld中。问题是如何将他们整合在一起,在执行boo函数时,内部调用foo函数时,IP寄存器能准确的指向foo函数第一条指令所在位置呢,这就需要编译器在编译代码时所生成的重定向数据结构,内容如下:

typedef  struct {
    ELF64_Addr  r_offset;
    Uint64_t  r_info;
} Elf64_Rel;

typedef  struct {
    ELF64_Addr  r_offset;
    Ui
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值