On Apple silicon, arm app is running as native binary and x86_64 app is translated by Rosseta before executing.
❯ clang -o arm_proc_translated proc_translated.c -target arm64-apple-macos11
❯ clang -o x86_64_proc_translated proc_translated.c -target x86_64-apple-macos11
❯ lipo -create -output universal_proc_translated x86_64_proc_translated arm_proc_translated
❯ file universal_proc_translated
universal_proc_translated: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64:Mach-O 64-bit executable arm64]
universal_proc_translated (for architecture x86_64): Mach-O 64-bit executable x86_64
universal_proc_translated (for architecture arm64): Mach-O 64-bit executable arm64
Test:
❯ arch -x86_64 zsh
❯ ./universal_proc_translated
processIsTranslated: 1
❯ arch -arm64 zsh
❯ ./universal_proc_translated
processIsTranslated: 0
Determine Whether Your App Is Running as a Translated Binary
Building a Universal macOS Binary