Hotspot Serviceability Agent如何处理ELF文件中的GOT?
Serviceability Agent 针对 PIC 共享库 GOT 重定向的处理逻辑
明确结论:Serviceability Agent(下称 SA)确实需要执行 GOT 查找操作来访问 -fPIC 参数编译的共享库中的全局变量,具体处理流程如下:
- 首先获取目标共享库的运行时加载基地址
SA 附着到目标 JVM 进程后,会先读取 Linux 环境下的/proc/<pid>/maps内存映射信息,拿到每个加载的.so文件在目标进程虚拟地址空间中的实际加载偏移,不会直接使用 ELF 文件中预设的静态段地址。 - 解析 ELF 结构获取
GOT项偏移
对于-fPIC编译的共享库,全局变量的寻址会通过GOT(全局偏移表)间接完成。SA 会解析目标.so的 ELF 结构,从.dynsym动态符号表中匹配到目标全局变量对应的重定位条目,计算出该变量的GOT表项相对于共享库基地址的固定偏移。 - 执行
GOT地址查找
SA 将共享库运行时加载基地址加上GOT项偏移,得到该GOT表项在目标进程地址空间中的虚拟地址,读取该地址存储的内容,就是目标全局变量的实际运行时地址。 - 访问全局变量内容
拿到实际运行时地址后,SA 即可直接读取目标进程对应地址的内存数据,获取全局变量的实际内容。
补充说明:只有静态编译的非 PIC 二进制文件中的全局变量,SA 才可以直接使用 ELF 中读出的静态虚拟地址访问。所有动态加载的共享库中的全局变量,都需要走
GOT查找流程,这个逻辑和用户态进程访问共享库全局变量的逻辑完全一致,SA 只是在调试侧重新实现了这一寻址流程。
内容的提问来源于stack exchange,提问作者choxsword
相关产品推荐
相关产品推荐

