如何在Arm64 macOS上用内置Clang交叉编译Linux ARM64汇编程序
在ARM64 macOS上用Clang交叉编译Linux ARM64汇编程序的方法
解决方案编译命令
直接使用带目标平台指定的Clang命令编译你的Linux版汇编代码:
clang --target=aarch64-linux-gnu hello.s -static -o hello-linux
命令参数说明
--target=aarch64-linux-gnu:明确告诉Clang将代码编译为ARM64架构的Linux可执行程序,这会让编译器和链接器适配Linux的系统调用约定、入口符号(_start)以及ELF文件格式规则。-static:强制静态链接所有依赖,避免生成的二进制依赖Linux系统的动态库,确保在Docker容器中可以直接运行,无需额外安装库文件。
验证编译结果
检查生成的文件类型,确认是Linux ARM64格式:
file hello-linux输出应类似:
ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, with debug_info, not stripped在ARM64 Linux Docker容器中运行测试:
- 启动容器并挂载当前目录:
docker run -it --rm -v $(pwd):/workdir arm64v8/ubuntu - 在容器内执行程序:
cd /workdir && ./hello-linux
此时会正常输出
Hello World!- 启动容器并挂载当前目录:
原错误原因解释
你之前直接用clang hello.s编译时,Clang默认使用macOS的目标平台(arm64-apple-darwin):
- macOS平台的可执行程序入口符号是
_main,而你的Linux代码使用的是Linux标准的_start入口,因此链接器找不到_main符号导致报错。 - 同时,macOS和Linux的系统调用号、调用约定也存在差异,指定目标平台后才能正确适配这些规则。
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

