[英]Cross assemble Linux Arm64 using MacOS clang assembler
我正在尝试使用默认的clang
汇编程序在 MacOS 上编写程序集。
我在同一台机器上得到了这个用于 MacOS 的小“Hello World”:
.global _main
.align 2
_main: 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 World!\n"
它取自这个问题。
当我组装它时:
clang hello.s
我可以成功运行它:
./a.out
现在,我尝试使用 64 位 ARM 汇编语言编程一书中的 Linux 的“Hello World”。 它基本上是相同的程序,但系统调用是针对 Linux 的:
.global _start
_start: mov X0, #1
ldr X1, =hello
mov X2, #13
mov X8, #64
svc 0
mov X0, #0
mov X8, #93
svc 0
.data
hello: .ascii "Hello World!\n"
我无法在 MacOS 上使用clang hello.s
组装这个程序,我得到这个错误:
Undefined symbols for architecture arm64:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我假设这个错误是因为我没有告诉clang
它应该使用 Linux 作为目标。
我如何使用内置的 clang 从 Arm64 上的 MacOS 将上面的“Hello World”交叉组装到 Linux Arm64?
我希望能够在 MacOS Arm64 上的 Arm64 Docker 容器中运行 Linux 二进制文件。
您将需要lld
或其他一些可以 output ELF 二进制文件的 linker,因为 Xcode 仅随 Apple 的ld64
一起提供,仅限于达尔文目标。 一旦你的路径中有lld
,你就可以构建你的程序集文件:
clang --target=arm64-linux-gnu -fuse-ld=lld hello.s -nostdlib
当然,如果您想使用库或最终编译 C 代码并包含 header 文件,您将必须查找或构建一个 SDK 以使用 --sysroot 传递给--sysroot
。 我不知道执行此操作的任何标准过程,但我已经取得了一些成功,只是从 Ubuntu/Debian package 镜像中提取公共 deb 文件并将它们解压缩到一个文件夹中。
在回答 Siguza 之后,困难的部分是找到可以完成这项工作的linker 。
这就是最终对我有用的东西。
使用以下命令安装macos 交叉工具链:
brew install aarch64-unknown-linux-gnu
之后我有了这个可以添加到 PATH 中的二进制文件:
/opt/homebrew/Cellar/aarch64-unknown-linux-gnu/11.2.0/bin/aarch64-unknown-linux-gnu-ld
然后我可以构建二进制文件:
clang --target=arm64-linux-gnu -fuse-ld=aarch64-unknown-linux-gnu-ld hello.s -nostdlib
我可以使用这个 Dockerfile 来验证二进制文件:
FROM scratch
ADD a.out /bin/
ENTRYPOINT ["/bin/a.out"]
构建一个容器:
docker build -t app .
运行它并获得 output:
docker run app
Hello World!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.