I am trying to write Assembly on MacOS using the default clang
assembler.
I got this small "Hello World" working for MacOS on the same machine:
.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"
It is taken from this question.
When I assembler it with:
clang hello.s
I can successfully run it with:
./a.out
Now, I try to follow the "Hello World" for Linux from the book Programming with 64-Bit ARM Assembly Language. It is basically the same program, but the sys-calls is for 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"
I cannot event assemble this program using clang hello.s
on MacOS, I get this error:
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)
I assume that this error is because I have not told clang
that it should use Linux as target.
How can I cross assemble the above "Hello World" to Linux Arm64 from MacOS on Arm64 using the built in clang?
I want to be able to run the Linux binary in a Arm64 Docker container on MacOS Arm64.
CodePudding user response:
You will need lld
or some other linker that can output ELF binaries, as Xcode only ships with Apple's ld64
, which is limited to Darwin targets. Once you have lld
in your path, you can build your assembly file with:
clang --target=arm64-linux-gnu -fuse-ld=lld hello.s -nostdlib
Of course, if you want to use libraries or eventually compile C code and include header files, you will have to either find or build an SDK to pass to clang with --sysroot
. I'm not aware of any standard process for doing this, but I've had some success with just pulling public deb files from Ubuntu/Debian package mirrors and unpacking them into one folder.