Root cause of 'zsh: killed' (SIGKILL) was two missing Mach-O elements:
1. Missing MH_PIE flag (0x200000): macOS 11+ (especially Apple Silicon/arm64)
requires all executables to be Position Independent. The kernel kills
non-PIE binaries with SIGKILL before even checking the code signature.
This is why even empty.pe (no externals) was killed.
2. Missing LC_DYLD_INFO_ONLY (0x80000022): The BIND opcodes for external
symbol resolution were generated but never referenced by any load
command. dyld had no way to find them, so symbols like printf were
never bound. Now properly referenced via dyld_info_command.
Additional changes:
- Generate rebase opcodes for Abs64 fixups (required for PIE: dyld adds
ASLR slide to absolute addresses in .data at runtime)
- Reorganize LINKEDIT layout: rebase -> bind -> symtab -> indirect -> strtab -> sig
- Update ncmds from 11 to 12, sizeofcmds += 48 (dyld_info_command size)
- Applied to both MachOWriter.cs (x64) and MachOWriterArm64.cs (arm64)
- Workflow: add PIE/LC_DYLD_INFO_ONLY verification + time.pe run test