我开始在M1 Mac上编写arm64汇编代码。
这是非常简单的示例代码。
.global _main
_main:
mov x0, #1
ret
当我用clang编译这段代码时,会显示标题为linker warning的警告。
$ 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 -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
1条答案
按热度按时间lhcgjxsq1#
正如您观察编译器所做的那样,您需要在每个函数符号之前添加一个对齐指令,以保证该符号以特定的对齐方式发出。
可以使用
.align
、.balign
或.p2align
指令。我个人对
.balign
的偏好较弱;你所看到的就是你所得到的。.balign 4
将解决你的问题。对于.p2align
,第一个操作数有一个隐含的2^N(“幂2对齐”)。根据我的经验,.align
的行为可能是特定于目标的,这在我看来是一个混乱。这里有一个区别: