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

wljmcqd8  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(132)

我现在用的是MacBook Air M1。
我正在阅读一本低级编程的书。
我想我写的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 docs所说,我可以手动安装x86_64库并执行以下操作:

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

但是我在MacOS上找不到可以下载的预构建软件包。我试过交叉编译,它太费力气了。
所以我放弃了,去找一些更简单的东西。我找到了这个问题的解决方案,我将在下面作为答案分享。

nr7wwzry

nr7wwzry1#

使用-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

5f0d552i

5f0d552i2#

[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!!

而且很管用!🎉

相关问题