上面是对64位ARM固件映像的分解。有人知道这些@PAGE@PAGEOFF符号的含义吗?

评论

这些是用于在链接时计算偏移量的汇编程序指令stackoverflow.com/q/38711058/4603507

图片未显示;重新上传它,或者甚至更好地只是将文本粘贴为代码块。

我可以看到图像:i.stack.imgur.com/ngBHx.png

嗯,它现在出现了。但最好使用文本而不是屏幕截图

我知道文本可以搜索,但是渲染可能会被破坏。

#1 楼

在AArch64中,所有指令均为32位长。显然,这不足以对AArch64可能需要处理的64位地址进行编码。因此,有两个选项:在指令附近的常量池中使用64位指针,并使用LDR指令加载它们。这是可行的,但是如果将映像加载到非默认地址,则需要更新(重新定位)此类指针。
使用PC相对寻址以相对于当前位置的固定偏移量加载地址(PIC代码)。这是更常见的方法,但偏移量仍受指令大小限制。因此,ARM设计师提出了一个聪明的技巧:使用两条指令允许范围更大。

ADRP指令在当前指令的+/- 4GB(33位)范围内(占用21个高位偏移量)加载4KB页面的地址。这由@PAGE运算符表示。
然后,我们可以使用LDRSTR读取或写入该页面内的任何地址,或者使用ADD使用偏移量的其余12位(由@PAGEOFF表示)来计算最终地址。

因此,基本上,您可以将这些指令对视为好像最后一条指令直接访问@之前的位置的最终地址,并且如果您不打算重新组装文件,则可以忽略后缀。

另请参阅https://stackoverflow.com/questions/34003338/llvm-arm64-assembly-getting-a-symbol-label-address