簡體   English   中英

使用 MacOS clang 匯編程序交叉匯編 Linux Arm64

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM