我当前的设置是 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 上下载。我试过交叉编译,太费劲了
所以我放弃了,去做一些更简单的事情。我找到了这个问题的解决方案,我将在下面作为答案分享。
使用
-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
。
[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!!
它有效! 🎉