I compile a macOS driverkit system extension as a Universal library so that it contains both x86_64
and arm64
. One Apple Silicon computer A the driver starts when I attach the USB device. On Apple Silicon computer B I can see kernel: exec_mach_imgact: disallowing arm64 platform driverkit binary "com.example.driver", should be arm64e
being printed in the Console.app when the USB device is attached. I've looked at the source code
of where this is happening but I cannot figure out what the problem is.
If I compile it for arm64e
then it get exec_mach_imgact: not running binary "com.example.driver" built against preview arm64e
on computer A, bit then it starts on computer B.
None of the computers have -arm64e_preview_abi
set in the boot-args
.
If I create a new Xcode (12.4) project on each machine and build Release then computer A and otool -fvv com.example.driver
gives
Fat headers
fat_magic FAT_MAGIC
nfat_arch 2
architecture x86_64
cputype CPU_TYPE_X86_64
cpusubtype CPU_SUBTYPE_X86_64_ALL
capabilities 0x0
offset 16384
size 73856
align 2^14 (16384)
architecture arm64
cputype CPU_TYPE_ARM64
cpusubtype CPU_SUBTYPE_ARM64_ALL
capabilities 0x0
offset 98304
size 73856
align 2^14 (16384)
On computer B the same command gives
Fat headers
fat_magic FAT_MAGIC
nfat_arch 2
architecture x86_64
cputype CPU_TYPE_X86_64
cpusubtype CPU_SUBTYPE_X86_64_ALL
capabilities 0x0
offset 16384
size 73280
align 2^14 (16384)
architecture arm64
cputype CPU_TYPE_ARM64
cpusubtype CPU_SUBTYPE_ARM64_ALL
capabilities 0x0
offset 98304
size 73296
align 2^14 (16384)
How can I make the driver start on both machines?
Dexts should indeed be arm64
and x86_64
(but as pmdj explains, system binaries are still arm64e
.)
As hinted by the name of (and need for) the -arm64e_preview_abi
, arm64e
is currently only exposed as a developer preview, to allow for testing.
However, you shouldn't get the disallowing arm64
error: did you set other interesting boot-args on computer B? (in particular, amfi=
may be relevant)