Skip to content

Instantly share code, notes, and snippets.

@tingwei628
Last active August 29, 2021 07:32
Show Gist options
  • Save tingwei628/2a684cf81e63f91b97b0aeb0c585faf9 to your computer and use it in GitHub Desktop.
Save tingwei628/2a684cf81e63f91b97b0aeb0c585faf9 to your computer and use it in GitHub Desktop.
aarch64 on mac

update: I used dockcross instead.

compile .c into aarch64(arm64v8) with ELF format

brew tap SergioBenitez/osxct
brew install aarch64-none-elf
cd /usr/local/Cellar/aarch64-none-elf/7.2.0/bin

aarch64-none-elf-addr2line	aarch64-none-elf-gcov-dump
aarch64-none-elf-ar		aarch64-none-elf-gcov-tool
aarch64-none-elf-as	        aarch64-none-elf-gdb
aarch64-none-elf-c++filt	aarch64-none-elf-gprof
aarch64-none-elf-cc		aarch64-none-elf-ld
aarch64-none-elf-cpp		aarch64-none-elf-ld.bfd
aarch64-none-elf-ct-ng.config	aarch64-none-elf-ld.gold
aarch64-none-elf-dwp		aarch64-none-elf-nm
aarch64-none-elf-elfedit	aarch64-none-elf-objcopy
aarch64-none-elf-gcc		aarch64-none-elf-objdump
aarch64-none-elf-gcc-7.2.0	aarch64-none-elf-ranlib
aarch64-none-elf-gcc-ar		aarch64-none-elf-readelf
aarch64-none-elf-gcc-nm		aarch64-none-elf-size
aarch64-none-elf-gcc-ranlib	aarch64-none-elf-strings
aarch64-none-elf-gcov		aarch64-none-elf-strip

aarch64-none-elf-as (from asm to ELF format executable)

homebrew-osxct@SergioBenitez

export CFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CCFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CXXFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CPPFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CPATH="/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/"

compile .c into aarch64(arm64v8) with Mach-O format

xcrun -sdk macosx clang -arch arm64 -o hello hello.c

xcrun - Run or locate development tools and properties.

@tingwei628
Copy link
Author

tingwei628 commented Aug 5, 2021

Dockcross

Fatal: kernel too old

After docker version --format '{{json .}}'

Docker version 20.10.7, build f0df350
KernelVersion: 5.10.25-linuxkit

Linuxkit : /Applications/Docker.app/Contents/Resources/linuxkit

UPDATE

PR dockcross/dockcross #547 fixed Fatal: kernel too old

@tingwei628
Copy link
Author

tingwei628 commented Aug 8, 2021

compile arm64 assembly into elf executable

./dockcross-linux-arm64 bash -c '$AS hello.s -o hello.o && $LD hello.o -o hello_arm'

execute

./dockcross-linux-arm64 bash -c './hello_arm'

arm64 asm

; hello.s
.text
.global _start

_start:

main:
	mov x0, #1
	ldr x1, =message
	ldr x2, =len
	mov x8, 0x40
	svc 0
	mov x8, #93
	svc 0

.data
message: .asciz "hello world\n"
len = . - message

func.s

.text

.global square
.LC0:
        .string "AA\n"
square:
        stp     x29, x30, [sp, -32]!
        mov     x29, sp
        str     w0, [sp, 28]
        ldr     w1, [sp, 28]
        adrp    x0, .LC0
        add     x0, x0, :lo12:.LC0
        
        mov     x1, x0              //const char *buf -> arg1 (x1)
        mov     x0, #1              // unsigned int fd -> arg0 (x0)
        mov     x2, #4              // size_t count -> arg2 (x2)
        mov     x8, 0x40            // write #0x40 -> system call number (x8)
        svc     0

        ldr     w0, [sp, 28]
        mul     w0, w0, w0
        ldp     x29, x30, [sp], 32
        ret

main.s

.text
.global _start
_start:
main:
        stp     x29, x30, [sp, -32]!
        mov     x29, sp
        mov     w0, 1
        bl      square
        str     w0, [sp, 28]

        mov     w0, 0               // restore
        ldp     x29, x30, [sp], 32
        
        mov     x8, #93             // exit
        svc     0
$AS func.s main.s -o func.o main.o

$AS func.s -o func.o
$AS main.s -o main.o
$LD func.o main.o -o main_arm

@tingwei628
Copy link
Author

tingwei628 commented Aug 8, 2021

compile .c to arm64 elf executable

./dockcross-linux-arm64 bash -c '$CC hello.c -o hello_arm'

execute

./dockcross-linux-arm64 bash -c './hello_arm'

enter dockcross container

./dockcross-linux-arm64 bash

@tingwei628
Copy link
Author

tingwei628 commented Aug 23, 2021

ENV CROSS_ROOT ${XCC_PREFIX}/${CROSS_TRIPLE}
ENV AS=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-as \
    AR=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-ar \
    CC=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-gcc \
    CPP=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-cpp \
    CXX=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-g++ \
    LD=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-ld \
    ```

gdb
aarch64-unknown-linux-gnu-gdb

@tingwei628
Copy link
Author

compile c++ to arm64 elf executable

aarch64-unknown-linux-gnu-g++ (crosstool-NG 1.24.0.409_d47b234) 11.2.0

@tingwei628
Copy link
Author

ARMv8 example programs to learn from and armsim, an ARMv8 simulator
https://github.com/d-gaston/armv8-examples

@tingwei628
Copy link
Author

tingwei628 commented Aug 28, 2021

read core dump

readelf --notes core | grep -v "description data:"
objdump -s core

Segmentation fault

/usr/lib/x86_64-linux-gnu/libpython3.9.so.1.0
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28
objdump -tT /usr/lib/x86_64-linux-gnu/libpython3.9.so.1.0 | grep 135
objdump -d /usr/lib/x86_64-linux-gnu/libpython3.9.so.1.0 --start-address=0x135a90 | grep 135E95

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment