diff --git a/macho/reloc-aarch64.o b/macho/reloc-aarch64.o new file mode 100644 index 0000000..f4acf1f Binary files /dev/null and b/macho/reloc-aarch64.o differ diff --git a/macho/reloc-aarch64.s b/macho/reloc-aarch64.s new file mode 100644 index 0000000..9852a1c --- /dev/null +++ b/macho/reloc-aarch64.s @@ -0,0 +1,35 @@ + .subsections_via_symbols + .text + // ARM64_RELOC_BRANCH26 + bl _g0 + // ARM64_RELOC_ADDEND, ARM64_RELOC_BRANCH26 + bl _g0 + 20 + // ARM64_RELOC_PAGE21 + adrp x0, _g0@PAGE + // ARM64_RELOC_PAGEOFF12 + ldr w0, [x0, _g0@PAGEOFF] + // ARM64_RELOC_ADDEND, ARM64_RELOC_PAGE21 + adrp x0, _g0@PAGE + 20 + // ARM64_RELOC_ADDEND, ARM64_RELOC_PAGEOFF12 + ldr w0, [x0, _g0@PAGEOFF + 20] + // ARM64_RELOC_GOT_LOAD_PAGE21 + adrp x0, _g0@GOTPAGE + // ARM64_RELOC_GOT_LOAD_PAGEOFF12 + ldr w0, [x0, _g0@GOTPAGEOFF] + // ARM64_RELOC_TLVP_LOAD_PAGE21 + adrp x0, _g0@TLVPPAGE + // ARM64_RELOC_TLVP_LOAD_PAGEOFF12 + ldr w0, [x0, _g0@TLVPPAGEOFF] + + .data +_data: + // ARM64_RELOC_UNSIGNED + .quad _g0 + 20 + // ARM64_RELOC_SUBTRACTOR, ARM64_RELOC_UNSIGNED, length=3 + .quad _g0 - _g1 + 20 + // ARM64_RELOC_SUBTRACTOR, ARM64_RELOC_UNSIGNED, length=2 + .long _g0 - _g1 + 20 + // ARM64_RELOC_POINTER_TO_GOT, pcrel=0, length=3 + .quad _g0@GOT + // ARM64_RELOC_POINTER_TO_GOT, pcrel=1, length=2 + .long _g0@GOT - . diff --git a/macho/reloc-arm.o b/macho/reloc-arm.o new file mode 100644 index 0000000..cdd7af4 Binary files /dev/null and b/macho/reloc-arm.o differ diff --git a/macho/reloc-arm.s b/macho/reloc-arm.s new file mode 100644 index 0000000..5f1ccca --- /dev/null +++ b/macho/reloc-arm.s @@ -0,0 +1,43 @@ + .subsections_via_symbols + .text + .arm +_g1: + // ARM_RELOC_BR24, extern=1 + bl _g0 + 20 + // ARM_RELOC_BR24, extern=0 + bl _g2 + // ARM_RELOC_BR24, scattered + bl _g2 + 20 + // ARM_RELOC_HALF, length=0 + movw r0, :lower16:(_g0 + 20) + // ARM_RELOC_HALF, length=1 + movt r0, :upper16:(_g0 + 20) + + .p2align 2 + .globl _g2 + .thumb +_g2: +_g3: + // ARM_THUMB_RELOC_BR22, extern=1 + bl _g0 + 20 + // ARM_THUMB_RELOC_BR22, extern=0 + bl _g2 + // ARM_THUMB_RELOC_BR22, scattered + bl _g2 + 20 + // ARM_RELOC_HALF, length=2 + movw r0, :lower16:(_g0 + 20) + // ARM_RELOC_HALF, length=3 + movt r0, :upper16:(_g0 + 20) + + .data + // ARM_RELOC_VANILLA, extern=1 + .long _g0 + 20 + // ARM_RELOC_VANILLA, extern=0 + .long _g2 + // ARM_RELOC_VANILLA, scattered + .long _g2 + 20 + // ARM_RELOC_SECTDIFF, ARM_RELOC_PAIR + .long _g2 - _g1 + 20 + // ARM_RELOC_SECTDIFF, ARM_RELOC_PAIR + // TODO: should be ARM_RELOC_LOCAL_SECTDIFF, ARM_RELOC_PAIR? + .long _g3 - _g1 + 20 diff --git a/macho/reloc-i386.o b/macho/reloc-i386.o new file mode 100644 index 0000000..67b2e2c Binary files /dev/null and b/macho/reloc-i386.o differ diff --git a/macho/reloc-i386.s b/macho/reloc-i386.s new file mode 100644 index 0000000..dac35f2 --- /dev/null +++ b/macho/reloc-i386.s @@ -0,0 +1,27 @@ + .subsections_via_symbols + .text +_g1: + // GENERIC_RELOC_VANILLA, pcrel=1, extern=1 + call _g0 + 20 + // GENERIC_RELOC_VANILLA, pcrel=1, extern=0 + call _g2 + // GENERIC_RELOC_VANILLA, pcrel=1, scattered + call _g2 + 20 + + .p2align 2 + .globl _g2 +_g2: +_g3: + ret + + .data + // GENERIC_RELOC_VANILLA, pcrel=0, extern=1 + .long _g0 + 20 + // GENERIC_RELOC_VANILLA, pcrel=0, extern=0 + .long _g2 + // GENERIC_RELOC_VANILLA, pcrel=0, scattered + .long _g2 + 20 + // GENERIC_RELOC_SECTDIFF, GENERIC_RELOC_PAIR + .long _g2 - _g1 + 20 + // GENERIC_RELOC_LOCAL_SECTDIFF, GENERIC_RELOC_PAIR + .long _g3 - _g1 + 20 diff --git a/macho/reloc-x86_64.o b/macho/reloc-x86_64.o new file mode 100644 index 0000000..7f7e750 Binary files /dev/null and b/macho/reloc-x86_64.o differ diff --git a/macho/reloc-x86_64.s b/macho/reloc-x86_64.s new file mode 100644 index 0000000..3e22303 --- /dev/null +++ b/macho/reloc-x86_64.s @@ -0,0 +1,34 @@ + .text +_g1: + // X86_64_RELOC_BRANCH + call _g2 + 20 +_g2: + // X86_64_RELOC_SIGNED + movl _g1 + 20(%rip), %eax + // X86_64_RELOC_SIGNED_1, extern=1 + movb $0x12, _g1(%rip) + // X86_64_RELOC_SIGNED_2, extern=1 + movw $0x1234, _g1(%rip) + // X86_64_RELOC_SIGNED_4, extern=1 + movl $0x12345678, _g1(%rip) + // X86_64_RELOC_SIGNED_1, extern=0 + movb $0x12, L1(%rip) + // X86_64_RELOC_SIGNED_2, extern=0 + movw $0x1234, L1(%rip) + // X86_64_RELOC_SIGNED_4, extern=0 + movl $0x12345678, L1(%rip) + // X86_64_RELOC_GOT_LOAD + movq _g1@GOTPCREL(%rip), %rax + // X86_64_RELOC_GOT + pushq _g1@GOTPCREL(%rip) + // X86_64_RELOC_TLV + movq _g1@TLVP(%rip), %rax + + .data +L1: + // X86_64_RELOC_UNSIGNED, extern=1 + .quad _g1 + 20 + // X86_64_RELOC_UNSIGNED, extern=0 + .quad L1 + 20 + // X86_64_RELOC_UNSIGNED, X86_64_RELOC_SUBTRACTOR + .quad _g1 - _g2 + 20 diff --git a/macho/reloc.sh b/macho/reloc.sh new file mode 100755 index 0000000..eb19385 --- /dev/null +++ b/macho/reloc.sh @@ -0,0 +1,5 @@ +#!/bin/sh +llvm-mc-16 -n -triple i386-apple-darwin reloc-i386.s -filetype=obj -o reloc-i386.o +llvm-mc-16 -n -triple x86_64-apple-darwin reloc-x86_64.s -filetype=obj -o reloc-x86_64.o +llvm-mc-16 -n -triple thumbv7-apple-darwin reloc-arm.s -filetype=obj -o reloc-arm.o +llvm-mc-16 -n -triple arm64-apple-darwin reloc-aarch64.s -filetype=obj -o reloc-aarch64.o