assembly - 如何修复 "ld: warning: arm64 function not 4-byte aligned"警告?

标签 assembly memory-alignment arm64

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

相关文章:

gcc - 如何生成未对齐的访问条件以及如何使用 gcc 检测它?

c - 检测 objective-c PU 上的对齐内存要求

c++ - C++ 中结构的大小 (sizeof) 与数组的实际大小不对应

c - ptrace 更改系统调用编号 arm64

ios - Appcelerator 第三方框架 arm64 错误

assembly - 为什么每当我尝试使用中断时,我的 masm32 程序就会崩溃?

assembly - 在 Commodore 64 上动态更新图 block 数据的更好方法

c - 理解 if (a>=3) 的 gcc 输出

assembly - 从人为的子例程返回到修改后的返回地址时,BR/RET 时序差异

c - 链接两个目标文件以生成一个二进制文件