assembly 如何修复“ld:警告:arm64函数未对齐4字节”警告?

wpx232ag  于 2023-02-12  发布在  其他
关注(0)|答案(1)|浏览(412)

我开始在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
lhcgjxsq

lhcgjxsq1#

正如您观察编译器所做的那样,您需要在每个函数符号之前添加一个对齐指令,以保证该符号以特定的对齐方式发出。
可以使用.align.balign.p2align指令。
我个人对.balign的偏好较弱;你所看到的就是你所得到的。.balign 4将解决你的问题。对于.p2align,第一个操作数有一个隐含的2^N(“幂2对齐”)。根据我的经验,.align的行为可能是特定于目标的,这在我看来是一个混乱。
这里有一个区别:

.global _main
+.balign 4
 _main:
     mov x0, #1
     ret

相关问题