ilocker:关注 Android 安全(新手) QQ: 2597294287
重定位就是把符号引用与符号定义链接起来的过程,这也是 android linker 的主要工作之一。
当程序中调用一个函数时,相关的 call 指令必须在执行期将控制流转到正确的目标地址。所以,so 文件中必须包含一些重定位相关的信息,linker 据此完成重定位的工作。
这些重定位信息保存在一系列的重定位项中,重定位项的结构如下:
这些重定位项位于 .rel.plt section 中。
r_offset:对于可执行文件或 so 文件来说,该值是要进行重定位的存储单元的虚拟地址。
r_info:该值给出两个重要信息,一个是要重定位的符号在符号表中的索引,另一个是要施行的重定位类型。这两个信息分别由两个宏来提取。
对于 32 位的 so 来说,ELFW(R_TYPE) 就是 ELF32_R_SYM,ELFW(R_SYM) 就是 ELF32_R_SYM。