-
-
未解决 [求助]android9中elf文件的重定位为什么不使用延迟绑定呢?
-
发表于: 2024-3-29 18:28 1520
-
在网上看了很多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直播授课
赞赏
他的文章
看原图
赞赏
雪币:
留言: