从 .so 文件到运行时内存的指令编码是否不同?

Is instruction encoded differently from .so file to runtime memory?

我有一个 Android 使用 ARM-V7A 指令集的 .so 文件。

我拖进IDA里面,有一行显示:

0x1000: b #0x102c

而十六进制window表示b #0x102c的二进制码为14 e0.


14 e0 的二进制格式为 0001 0100 1110 0000,这不是 ARM 手动编码此指令的方式。

除非

1    4    e    0
0001 0100 1110 0000
8 ----- 1 16 ---- 9

8 -- 1表示1位转8位,9 -- 16表示9位转16位


为什么 .so 中的指令以这种方式编码 文件 ?


例如,如果我想在运行时更改某个地址的某些指令。我是将其更改为 0x14e0(指令在 .so 文件中的编码方式),还是更改为 0xe014(指令在 ARM 手册中的编码方式)?

IDA 似乎将其分解为字节,因此您希望低 8 位在前,作为字节流。 14 e0 与 little-endian e014 相同,一个 16 位半字。

(IDA 可能最初是为 x86 开发的,其中机器代码 可变长度字节流,而不是 16 位或 32 位块的序列,并移植到手臂。 不过,这仍然是 有效 转储 ARM 机器代码的方法。)


回复:题目问题:

可执行文件或库的 .text 部分将像 mmap 一样映射到内存中,无需修改。除了极少数情况下的“文本重定位”以修复绝对地址,例如在 .rodatamovw/movk 中的跳转表中 .text 本身。

但是与位置无关的代码通常会避免这种情况,因为这就是与位置无关的全部意义所在。绝对不是字节交换!