Apple Clang12 LLVM - 未知的 AArch64 修复类型
Apple Clang12 LLVM - unknown AArch64 fixup kind
我正在尝试将一些 Linux C 代码移植到 Apple M1 Mac 并且遇到了一些内联汇编的问题。这让我难住了。
我有以下内联汇编块:
#define TEST asm volatile(\
"adr x0, label9 \n"\
: : : "x0");
并且遇到了以下错误:
test.c:73:5: error: unknown AArch64 fixup kind!
TEST
^
./ARM_branch_macros.h:2862:7: note: expanded from macro 'TEST'
"adr x0, label9 \n"\
^
<inline asm>:1:2: note: instantiated into assembly here
adr x0, label9
^
1 error generated.
make: *** [indirect_branch_latency.o] Error 1
我正在使用以下编译器:
Apple clang version 12.0.0 (clang-1200.0.32.27)
Target: arm64-apple-darwin20.1.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
使用命令行:
clang -c -o test.o test.c -I. -w -g -lrt -O0 -static -DARM_ASSEMBLY
如有任何帮助,我们将不胜感激!
ADR 指令存储从当前 PC 值到您引用的标签的偏移量。
当您有一条指令引用不同目标文件(或同一目标文件的不同部分)中的符号时,汇编程序无法直接对确切的偏移量进行编码,因为它不知道如何链接器会将它们布置出来,但必须在目标文件中留下重定位,指示链接器在知道符号的确切位置后修复指令。
我认为这里的问题很简单,就是 MachO 目标文件(在苹果平台上使用)格式没有重定位类型来修复指向别处符号的 ADR 指令。即使它有,该构造也非常脆弱 - 它指向的符号必须在引用它的指令的 +/- 1 MB 范围内 - 这是一个很容易达到的限制。
为了访问更大的范围,通常使用 ADRP+ADD 指令对,它为您提供 +/- 4 GB 的范围,而 MachO 格式确实支持这些。
它们的汇编语法在 MachO 和 ELF(和 COFF)之间略有不同。对于 MachO,语法如下所示:
adrp x0, symbol@PAGE
add x0, x0, symbol@PAGEOFF
或者如果您想同时从中加载:
adrp x0, symbol@PAGE
ldr x1, [x0, symbol@PAGEOFF]
在 ELF(Linux 上使用的目标文件格式)和 COFF(windows,当使用 LLVM 组装 GNU 风格程序集时)平台上,语法如下所示:
adrp x0, symbol
add x0, x0, :lo12:symbol
我正在尝试将一些 Linux C 代码移植到 Apple M1 Mac 并且遇到了一些内联汇编的问题。这让我难住了。
我有以下内联汇编块:
#define TEST asm volatile(\
"adr x0, label9 \n"\
: : : "x0");
并且遇到了以下错误:
test.c:73:5: error: unknown AArch64 fixup kind!
TEST
^
./ARM_branch_macros.h:2862:7: note: expanded from macro 'TEST'
"adr x0, label9 \n"\
^
<inline asm>:1:2: note: instantiated into assembly here
adr x0, label9
^
1 error generated.
make: *** [indirect_branch_latency.o] Error 1
我正在使用以下编译器:
Apple clang version 12.0.0 (clang-1200.0.32.27)
Target: arm64-apple-darwin20.1.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
使用命令行:
clang -c -o test.o test.c -I. -w -g -lrt -O0 -static -DARM_ASSEMBLY
如有任何帮助,我们将不胜感激!
ADR 指令存储从当前 PC 值到您引用的标签的偏移量。
当您有一条指令引用不同目标文件(或同一目标文件的不同部分)中的符号时,汇编程序无法直接对确切的偏移量进行编码,因为它不知道如何链接器会将它们布置出来,但必须在目标文件中留下重定位,指示链接器在知道符号的确切位置后修复指令。
我认为这里的问题很简单,就是 MachO 目标文件(在苹果平台上使用)格式没有重定位类型来修复指向别处符号的 ADR 指令。即使它有,该构造也非常脆弱 - 它指向的符号必须在引用它的指令的 +/- 1 MB 范围内 - 这是一个很容易达到的限制。
为了访问更大的范围,通常使用 ADRP+ADD 指令对,它为您提供 +/- 4 GB 的范围,而 MachO 格式确实支持这些。
它们的汇编语法在 MachO 和 ELF(和 COFF)之间略有不同。对于 MachO,语法如下所示:
adrp x0, symbol@PAGE
add x0, x0, symbol@PAGEOFF
或者如果您想同时从中加载:
adrp x0, symbol@PAGE
ldr x1, [x0, symbol@PAGEOFF]
在 ELF(Linux 上使用的目标文件格式)和 COFF(windows,当使用 LLVM 组装 GNU 风格程序集时)平台上,语法如下所示:
adrp x0, symbol
add x0, x0, :lo12:symbol