我开始在 M1 mac 上编写 arm64 汇编代码。
这是非常简单的示例代码。
.global _main
_main:
mov x0, #1
ret
当我通过 clang 编译此代码时,将显示标题为链接器的警告。
$ clang test.s
ld: warning: arm64 function not 4-byte aligned: _main from /var/folders/st/df0gjt9x5tl0cv7fw0xg5s9m0000gn/T/test-3c883c.o
$ ./a.out
$ echo $?
1
生成的二进制文件运行良好,但如何解决此链接器警告?
工具链版本(Xcode 12.3)
$ clang --version
Apple clang version 12.0.0 (clang-1200.0.32.28)
Target: arm64-apple-darwin20.2.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
写完这个问题后。 像这样编写相同行为的 C 文件。
int main() { return 1; }
然后通过clang输出汇编代码
$ clang -S -O test.c
生成的test.s文件包含.p2align 2
如果包含该内容,则不会显示警告。
.section __TEXT,__text,regular,pure_instructions
.build_version macos, 11, 0 sdk_version 11, 1
.globl _main ; -- Begin function main
.p2align 2
_main: ; @main
.cfi_startproc
; %bb.0:
mov w0, #1
ret
.cfi_endproc
; -- End function
.subsections_via_symbols
最佳答案
正如您观察编译器所做的那样,您需要在每个函数符号之前添加对齐指令,以保证该符号以特定对齐方式发出。
您可以使用.align
, .balign
,或.p2align
指令。
我个人对.balign
有较弱的偏好;你所看到的就是你得到的。 .balign 4
将解决您的问题。对于 .p2align
,第一个操作数隐含 2^N(“2 次方对齐”)。根据我的经验,.align
的行为可能是针对特定目标的,这在我看来是一团糟。
这是一个差异:
.global _main
+.balign 4
_main:
mov x0, #1
ret
关于assembly - 如何修复 "ld: warning: arm64 function not 4-byte aligned"警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65748033/