@Override
	public RelocationResult relocate(Address address, CoffRelocation relocation,
			CoffRelocationContext relocationContext)
			throws MemoryAccessException, RelocationException {

		Program program = relocationContext.getProgram();
		Memory mem = program.getMemory();

		int byteLength = 4; // most relocations affect 4-bytes (change if different)

		int bytesToAdjust = mem.getInt(address);
		Address symbolAddr = relocationContext.getSymbolAddress(relocation);
		switch (relocation.getType()) {

			case IMAGE_REL_ARM64_ABSOLUTE:
				return RelocationResult.SKIPPED;

			case IMAGE_REL_ARM64_ADDR32NB:
				mem.setInt(address, (int) symbolAddr.getOffset());
				break;

			case IMAGE_REL_ARM64_BRANCH26:
				int instMask = 0xfc000000;
				bytesToAdjust = bytesToAdjust & instMask;
				int displacement = (int) symbolAddr.subtract(address);
				displacement >>= 2;
				displacement &= (~instMask);
				bytesToAdjust = bytesToAdjust | displacement;
				mem.setInt(address, bytesToAdjust);
				break;

			case IMAGE_REL_ARM64_PAGEBASE_REL21:
				long base = address.getOffset() & ~0xfff;
				long offset = symbolAddr.getOffset() - base;
				offset = offset >> 12;
				int immlo = (int) offset & 0x3;
				offset = offset >> 2;
				int immhi = (int) offset & 0x7ffff;
				instMask = ~((0x3 << 29) | (0x7ffff << 5));
				bytesToAdjust &= instMask;
				bytesToAdjust = bytesToAdjust | (immhi << 5) | (immlo << 29);
				mem.setInt(address, bytesToAdjust);
				break;

			case IMAGE_REL_ARM64_PAGEOFFSET_12A:
				offset = symbolAddr.getOffset() & 0xfff;
				instMask = ~(0xfff << 10);
				bytesToAdjust &= instMask;
				bytesToAdjust = (int) (bytesToAdjust | (offset << 10));
				mem.setInt(address, bytesToAdjust);
				break;

			case IMAGE_REL_ARM64_PAGEOFFSET_12L:
				int size = bytesToAdjust >>> 30;
				offset = symbolAddr.getOffset() & 0xfff;
				offset >>= size;
				instMask = ~(0xfff << 10);
				bytesToAdjust &= instMask;
				bytesToAdjust = (int) (bytesToAdjust | (offset << 10));
				mem.setInt(address, bytesToAdjust);
				break;

			default: {
				return RelocationResult.UNSUPPORTED;
			}
		}
		return new RelocationResult(Status.APPLIED, byteLength);
	}
32-bit relative address from byte following relocation
Ghidra/Processors/AARCH64/src/main/java/ghidra/app/util/bin/formatt/coff/relocation/AARCH64_CoffRelocationHandler.java