I recently compiled a C program I wrote with gcc on my x86 intel MacBook - I downloaded this binary onto my M1 MacBook and it seems to run fine... This challenges my understanding because I figured it had to be complied for a specific instruction set (x86 in this case).. I wonder if there is some software layer in my MacBook automatically 'assembling' the x86 into ARM
Any ideas?
MacOS contains Rosetta 2 software that does dynamic binary translation from x86, so that x86 software can be run on the M1 CPU. Not quite as efficient as code compiled directly from C to AArch64 machine code, but it works.
You can read more here: https://developer.apple.com/documentation/apple-silicon/about-the-rosetta-translation-environment
Stack Overflow has a tag for it: rosetta-2.
There's also a question on the Apple site: How does Rosetta 2 work? where answers point out that the translation is done once and cached, so it can spend significant time optimizing the translation. (For non-JITed x86 code.)