[英]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.