
This adds the remaining pe-aarch64 relocations, and gets them working. It also brings in the constant directives from ELF, as otherwise .word would be 2 rather than 4 bytes, and .xword and .dword wouldn't be defined.
159 lines
3 KiB
ArmAsm
159 lines
3 KiB
ArmAsm
.text
|
|
|
|
.dword 0
|
|
.dword 0
|
|
|
|
# 2010
|
|
.global foo
|
|
foo:
|
|
|
|
# 4-byte literal
|
|
.long 0x12345678
|
|
.word 0x12345678
|
|
|
|
# IMAGE_REL_ARM64_ADDR32 (BFD_RELOC_32)
|
|
.long foo
|
|
.word foo
|
|
.long bar
|
|
.word bar
|
|
.long foo + 1
|
|
.word foo + 1
|
|
.long bar + 1
|
|
.word bar + 1
|
|
.long foo - 1
|
|
.word foo - 1
|
|
.long bar - 1
|
|
.word bar - 1
|
|
|
|
# 8-byte literal
|
|
.dword 0x123456789abcdef0
|
|
.xword 0x123456789abcdef0
|
|
|
|
# IMAGE_REL_ARM64_ADDR64 (BFD_RELOC_64)
|
|
.dword foo
|
|
.xword foo
|
|
.dword bar
|
|
.xword bar
|
|
.dword foo + 1
|
|
.xword foo + 1
|
|
.dword bar + 1
|
|
.xword bar + 1
|
|
.dword foo - 1
|
|
.xword foo - 1
|
|
.dword bar - 1
|
|
.xword bar - 1
|
|
|
|
# IMAGE_REL_ARM64_ADDR32NB (BFD_RELOC_RVA)
|
|
.rva foo
|
|
.rva bar
|
|
.rva foo + 1
|
|
.rva bar + 1
|
|
.rva foo - 1
|
|
.rva bar - 1
|
|
|
|
# IMAGE_REL_ARM64_BRANCH26 (BFD_RELOC_AARCH64_JUMP26)
|
|
b foo
|
|
b foo + 4
|
|
b foo - 4
|
|
b bar
|
|
b bar + 4
|
|
b bar - 4
|
|
|
|
# IMAGE_REL_ARM64_BRANCH26 (BFD_RELOC_AARCH64_CALL26)
|
|
bl foo
|
|
bl foo + 4
|
|
bl foo - 4
|
|
bl bar
|
|
bl bar + 4
|
|
bl bar - 4
|
|
bl .text - 4
|
|
|
|
# IMAGE_REL_ARM64_BRANCH19 (BFD_RELOC_AARCH64_BRANCH19)
|
|
cbz x0, foo
|
|
cbz x0, foo + 4
|
|
cbz x0, foo - 4
|
|
cbz x0, bar
|
|
cbz x0, bar + 4
|
|
cbz x0, bar - 4
|
|
cbz x0, .text - 4
|
|
|
|
# IMAGE_REL_ARM64_BRANCH14 (BFD_RELOC_AARCH64_TSTBR14)
|
|
tbz x0, 0, foo
|
|
tbz x0, 0, foo + 4
|
|
tbz x0, 0, foo - 4
|
|
tbz x0, 0, bar
|
|
tbz x0, 0, bar + 4
|
|
tbz x0, 0, bar - 4
|
|
tbz x0, 0, .text - 4
|
|
|
|
# IMAGE_REL_ARM64_PAGEBASE_REL21 (BFD_RELOC_AARCH64_ADR_HI21_PCREL)
|
|
adrp x0, foo
|
|
adrp x0, foo + 1
|
|
adrp x0, foo - 1
|
|
adrp x0, bar
|
|
adrp x0, bar + 1
|
|
adrp x0, bar - 1
|
|
adrp x0, .text - 4
|
|
|
|
# IMAGE_REL_ARM64_REL21 (BFD_RELOC_AARCH64_ADR_LO21_PCREL)
|
|
adr x0, foo
|
|
adr x0, foo + 1
|
|
adr x0, foo - 1
|
|
adr x0, bar
|
|
adr x0, bar + 1
|
|
adr x0, bar - 1
|
|
adr x0, .text - 1
|
|
|
|
# IMAGE_REL_ARM64_PAGEOFFSET_12L (BFD_RELOC_AARCH64_LDST8_LO12)
|
|
strb w0, [x0,:lo12:foo]
|
|
strb w0, [x0,:lo12:foo + 4]
|
|
strb w0, [x0,:lo12:foo - 4]
|
|
strb w0, [x0,:lo12:bar]
|
|
strb w0, [x0,:lo12:bar + 4]
|
|
strb w0, [x0,:lo12:bar - 4]
|
|
strb w0, [x0,:lo12:.text - 4]
|
|
|
|
# IMAGE_REL_ARM64_PAGEOFFSET_12L (BFD_RELOC_AARCH64_LDST16_LO12)
|
|
strh w0, [x0,:lo12:foo]
|
|
strh w0, [x0,:lo12:foo + 4]
|
|
strh w0, [x0,:lo12:foo - 4]
|
|
strh w0, [x0,:lo12:bar]
|
|
strh w0, [x0,:lo12:bar + 4]
|
|
strh w0, [x0,:lo12:bar - 4]
|
|
strh w0, [x0,:lo12:.text - 4]
|
|
|
|
# IMAGE_REL_ARM64_PAGEOFFSET_12L (BFD_RELOC_AARCH64_LDST32_LO12)
|
|
str w0, [x0,:lo12:foo]
|
|
str w0, [x0,:lo12:foo + 4]
|
|
str w0, [x0,:lo12:foo - 4]
|
|
str w0, [x0,:lo12:bar]
|
|
str w0, [x0,:lo12:bar + 4]
|
|
str w0, [x0,:lo12:bar - 4]
|
|
str w0, [x0,:lo12:.text - 4]
|
|
|
|
# IMAGE_REL_ARM64_PAGEOFFSET_12L (BFD_RELOC_AARCH64_LDST64_LO12)
|
|
str x0, [x0,:lo12:foo]
|
|
str x0, [x0,:lo12:foo + 8]
|
|
str x0, [x0,:lo12:foo - 8]
|
|
str x0, [x0,:lo12:bar]
|
|
str x0, [x0,:lo12:bar + 8]
|
|
str x0, [x0,:lo12:bar - 8]
|
|
str x0, [x0,:lo12:.text - 8]
|
|
|
|
# IMAGE_REL_ARM64_PAGEOFFSET_12L (BFD_RELOC_AARCH64_LDST128_LO12)
|
|
str q0, [x0,:lo12:foo]
|
|
str q0, [x0,:lo12:foo + 16]
|
|
str q0, [x0,:lo12:foo - 16]
|
|
str q0, [x0,:lo12:bar]
|
|
str q0, [x0,:lo12:bar + 16]
|
|
str q0, [x0,:lo12:bar - 16]
|
|
str q0, [x0,:lo12:.text - 16]
|
|
|
|
# IMAGE_REL_ARM64_PAGEOFFSET_12A (BFD_RELOC_AARCH64_ADD_LO12)
|
|
add x0, x0, #:lo12:foo
|
|
add x0, x0, #:lo12:foo + 1
|
|
add x0, x0, #:lo12:foo - 1
|
|
add x0, x0, #:lo12:bar
|
|
add x0, x0, #:lo12:bar + 1
|
|
add x0, x0, #:lo12:bar - 1
|
|
add x0, x0, #:lo12:.text - 1
|