如何在 Apple Silicon 中从 C 源代码创建 x86_64 汇编文件?

问题描述 投票:0回答:2

我当前的设置是 m1 MacBook Air。

我正在阅读一本低级编程书籍。
我想要将我编写的 C 代码编译为 x86_64 程序集。

有了 clang,我可以很容易地做到这一点:

clang -target x86_64 -masm=intel -S add_two_numbers.c

但是当我包含一个库(例如 stdio)时它不起作用。

❯ clang -target x86_64 -masm=intel -S hello.c
hello.c:1:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
         ^~~~~~~~~

正如 clang 文档所说,我可以手动安装 x86_64 库并执行:

clang -target x86_64 -masm=intel -I path/to/Include -L path/to/Library -S hello.c

但是我找不到预构建的包可以在 MacOS 上下载。我试过交叉编译,太费劲了

所以我放弃了,去做一些更简单的事情。我找到了这个问题的解决方案,我将在下面作为答案分享。

macos assembly x86-64 cross-compiling apple-silicon
2个回答
0
投票

使用

-arch
,而不是
-target

示例源/命令行/输出:

#include <stdio.h>

int main(void)
{
    printf("Hello world\n");
    return 0;
}
clang -arch x86_64 -masm=intel -S -Wall -O3 -o - t.c 
    .section    __TEXT,__text,regular,pure_instructions
    .build_version macos, 13, 0 sdk_version 13, 1
    .intel_syntax noprefix
    .globl  _main                           ## -- Begin function main
    .p2align    4, 0x90
_main:                                  ## @main
    .cfi_startproc
## %bb.0:
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset rbp, -16
    mov rbp, rsp
    .cfi_def_cfa_register rbp
    lea rdi, [rip + L_str]
    call    _puts
    xor eax, eax
    pop rbp
    ret
    .cfi_endproc
                                        ## -- End function
    .section    __TEXT,__cstring,cstring_literals
L_str:                                  ## @str
    .asciz  "Hello world"

.subsections_via_symbols

或者,如果你想使用

-target
,你需要指定一个目标三元组,如
x86_64-apple-macos13

clang -target x86_64-apple-macos13 -masm=intel -S -Wall -O3 -o - t.c

如果您只指定

x86_64
,即被视为
x86_64-unknown-unknown


-1
投票
[Solution]

❯ sudo port install x86_64-elf-gcc

❯ x86_64-elf-gcc -masm=intel -S hello.c

Hello Hackers 🤖 (for decoration purposes only.)

TLDR; I can't execute this code on my arm processor. so no hello world here!!

它有效! 🎉

© www.soinside.com 2019 - 2024. All rights reserved.