我有一个来自 Android JNI/NDK 应用程序的 .so。以下是它的两个部分:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[10] .rel.plt REL 001c9034 1c9034 00c928 08 AI 3 11 4
[11] .plt PROGBITS 001d595c 1d595c 012dd0 00 AX 0 0 4
根据 的 Info 参数.rel.plt,我希望它包含的重定位会影响该.plt部分的内容。但是,重定位中的地址都是更高的地址:
Relocation section '.rel.plt' at offset 0x1c9034 contains 6437 entries:
Offset Info Type Sym. Value Symbol's Name
00e1bb6c 00000216 R_ARM_JUMP_SLOT 00000000 __cxa_atexit@LIBC
00e1bb70 00000116 R_ARM_JUMP_SLOT 00000000 __cxa_finalize@LIBC
00e1bb74 00000316 R_ARM_JUMP_SLOT 00a0f8c5 _Znwj
00e1bb78 00000416 R_ARM_JUMP_SLOT 00a0f941 _ZdlPv
00e1bb7c 00000516 R_ARM_JUMP_SLOT 00a1886d __gxx_personality_v0
00e1bb80 00000716 R_ARM_JUMP_SLOT 00000000 __stack_chk_fail@LIBC
00e1bb84 00000b16 R_ARM_JUMP_SLOT 009ed201 _ZNSt6__ndk16chrono12system_clock3nowEv
这些地址属于.got和.data部分的范围。这是一个共享对象,所以偏移量应该是基于虚拟地址而不是基于节的,ARM 架构的ELF说:
ELF 标准要求 PLT 的 GOT 生成重定位被发送到动态重定位部分的连续子范围中。该子范围由标准标签 DT_JMPREL 和 DT_PLTRELSZ 表示。重定位的类型(REL 或 RELA)存储在 DT_PLTREL 标记中。
我是否误解了这些重定位的偏移适用于什么?或者也许“GOT产生的搬迁”是什么意思?