上面是对64位ARM固件映像的分解。有人知道这些
@PAGE
和@PAGEOFF
符号的含义吗?#1 楼
在AArch64中,所有指令均为32位长。显然,这不足以对AArch64可能需要处理的64位地址进行编码。因此,有两个选项:在指令附近的常量池中使用64位指针,并使用LDR
指令加载它们。这是可行的,但是如果将映像加载到非默认地址,则需要更新(重新定位)此类指针。 使用PC相对寻址以相对于当前位置的固定偏移量加载地址(PIC代码)。这是更常见的方法,但偏移量仍受指令大小限制。因此,ARM设计师提出了一个聪明的技巧:使用两条指令允许范围更大。
ADRP指令在当前指令的+/- 4GB(33位)范围内(占用21个高位偏移量)加载4KB页面的地址。这由
@PAGE
运算符表示。 然后,我们可以使用
LDR
或STR
读取或写入该页面内的任何地址,或者使用ADD
使用偏移量的其余12位(由@PAGEOFF
表示)来计算最终地址。 因此,基本上,您可以将这些指令对视为好像最后一条指令直接访问
@
之前的位置的最终地址,并且如果您不打算重新组装文件,则可以忽略后缀。 另请参阅https://stackoverflow.com/questions/34003338/llvm-arm64-assembly-getting-a-symbol-label-address
评论
这些是用于在链接时计算偏移量的汇编程序指令stackoverflow.com/q/38711058/4603507图片未显示;重新上传它,或者甚至更好地只是将文本粘贴为代码块。
我可以看到图像:i.stack.imgur.com/ngBHx.png
嗯,它现在出现了。但最好使用文本而不是屏幕截图
我知道文本可以搜索,但是渲染可能会被破坏。