为什么 ARM mac 上的 hello world 汇编“无效”?

2024-02-11

其他答案没有告诉我如何编译,我被困住了

我在汇编中有一个简单的 hello world

    .global start
    .align 2

    start: mov X0, #1
        adr     X1, hello
        mov     X2, #13
        mov     X16, #4
        svc     0

        mov     X0, #0
        mov     X16, #1
        svc     0

    hello: .ascii  "Hello\n"

我编译它使用clang hello.s -nostdlib -static
文件说

% file ./a.out 
./a.out: Mach-O 64-bit executable arm64

objdump 显示了这一点,也许未知的架构是问题所在?

    ./a.out:     file format mach-o-arm64


    Disassembly of section .text:

    0000000100003fd8 <start>:
        100003fd8:  d2800020    mov x0, #0x1                    // #1
        100003fdc:  100000e1    adr x1, 100003ff8 <hello>
        100003fe0:  d28001a2    mov x2, #0xd                    // #13
        100003fe4:  d2800090    mov x16, #0x4                       // #4
        100003fe8:  d4000001    svc #0x0
        100003fec:  d2800000    mov x0, #0x0                    // #0
        100003ff0:  d2800030    mov x16, #0x1                       // #1
        100003ff4:  d4000001    svc #0x0

    0000000100003ff8 <hello>:
        100003ff8:  6c6c6548    ldnp    d8, d25, [x10, #-320]
        100003ffc:  Address 0x0000000100003ffc is out of bounds.


    Disassembly of section LC_THREAD.UNKNOWN_ARCHITECTURE.0:

    0000000000000000 <LC_THREAD.UNKNOWN_ARCHITECTURE.0>:
        ...
    100:    00003fd8    udf #16344
    104:    00000001    udf #1
        ...

在 zsh 中运行显示“已杀死”,错误代码为 137。

这就是 dtruss 所说的

    % sudo dtruss ./a.out                                     
    dtrace: system integrity protection is on, some features will not be available

    dtrace: failed to execute ./a.out: Bad executable (or shared library)

我哪里做错了?我在M2上


arm64 macOS 上的内核不允许静态二进制文件。就这么简单,看看为什么 macOS 会杀死由 clang 创建的静态可执行文件? https://stackoverflow.com/q/71723764/2302862

但你不需要你的二进制文件是静态的。只需重命名start to _main并编译clang hello.s它会起作用的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 ARM mac 上的 hello world 汇编“无效”? 的相关文章

随机推荐