计算机编码与数据类型深入解析
ARM64 中的重定位
在 ARM64 架构里,由于指令长度为 4 字节,无法用单条指令将一个大数写入寄存器。不过,可执行镜像能加载到内存的任意随机地址,这就是重定位(relocs)存在的原因。
在 ARM64 中,地址是通过 ADRP 和 ADD 指令对来形成的。ADRP 指令加载一个 4KiB 页面地址,ADD 指令则加上剩余部分。以下是在 Win32 环境下使用 GCC(Linaro)4.9 编译“Hello, world!”示例的过程:
...>aarch64-linux-gnu-gcc.exe hw.c -c
...>aarch64-linux-gnu-objdump.exe -d hw.o
目标文件的反汇编结果如下:
0000000000000000 <main>:
0: a9bf7bfd stp x29, x30, [sp,#-16]!
4: 910003fd mov x29, sp
8: 90000000 adrp x0, 0 <main>
c: 91000000 add x0, x0, #0x0
10: 94000000 bl 0 <printf>
14: 52800000 mov w0, #0x0 // #0
18: a8c17bfd ldp x29, x30,