首页
社区
课程
招聘
未解决 [求助]android9中elf文件的重定位为什么不使用延迟绑定呢?
发表于: 2024-3-29 18:28 1541

未解决 [求助]android9中elf文件的重定位为什么不使用延迟绑定呢?

2024-3-29 18:28
1541

在网上看了很多elf文件的介绍,动态库的函数调用都是使用延迟绑定的。
我理解的是

1
2
3
4
5
6
7
8
9
10
11
12
13
.text
    bl open:实际是跳转到plt@open,
.plt@open(这里的额外指令是编译器实现的)
    x16=.got.plt[open](保存一下保存open函数地址的地址)
    br .got.plt[open](跳转到保存open函数地址的上保存的地址)
 
.got.plt[open]:这里应该是保存open函数的地址,但是编译器初始化后是.plt第一个指令的地址就称位.plt0吧
 
.plt0
    把x16压入栈
    br .got.plt[2](这个地址是保存查找函数地址(_dl_runtime_resolve )的函数地址)
 
然后_dl_runtime_resolve 会在依赖的动态找到open函数地址然后写入.got.plt[open里面]

然后就想看看_dl_runtime_resolve是如何实现,但是网上都没有找到源码,就想在so加载的时候看看.got.plt[2]的地址,在看看实在什么动态库里面的再找对应的源码。结果就发现了大问题,so在加载后.got.plt[2]里没有地址,而且我没有调用函数open的.got.plt[open]位置有libc.so的open真实地址。没有调用open函数的时候.got.plt[open]位置不应该是指向.plt0吗?然后我就看了下so加载的源码,发现so在加载的时候直接调用relocate函数把所有需要重定位的符号都重定位,根本就没有使用延迟绑定,这是为什么呢?

项目就是默认设置,新建一个安卓项目,然后添加了一个android library模块,就做了测试。
测试的环境是:
系统:android9
cpu:arm64
开发工具:android studio 2023.1.1 patch2


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//