Quando tu compili per un certo sistema operativo significa che ti stai appoggiando alle chiamate di sistema di tale piattaforma (direttamente o indirettamente, le chiamate possono essere ad esempio mediate dal runtime) e che generi come file eseguibile finale un file che ha un determinato layout (ad esempio può essere un file PE per Windows o un ELF per Linux). Tuttavia si può scrivere codice che sia indipendente da syscall (che si appoggi quindi solo ai servizi offerti dall'hardware o dal software di base, ossia al BIOS) e si può dire al linker di non dare in output un eseguibile dotato di un layout specifico, ma solo codice macchina senza intestazioni varie. In sostanza, non stai compilando per un'abbinata sistema operativo/architettura (che so, Windows/x86, Linux/PowerPC), ma semplicemente per una certa architettura (x86, PowerPC, IA64, ...).
Tra l'altro mi pare che ne avessimo parlato tempo addietro nel forum Programmazione (ed è lì che andrebbe questa domanda, credo): prova a fare una ricerca.