为什么 ELF SHT_REL 部分会包含其 sh_info 所指部分之外的重定位?

逆向工程 二元分析 手臂 小精灵
2021-06-17 15:55:06

我有一个来自 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产生的搬迁”是什么意思?

1个回答

我的错误是根据部分的偏移量( sh_offset) 而不是它们的地址( sh_addr) 来处理重定位地址中的地址,以确定它们指向的位置。纠正这个误解,按预期重定位 GOT 中所有寻址 PLT 的地址条目。