двоичные файлы в этом смысле компилируются для выполнения вызовов операционной системы, когда ваша программа имеет функцию printf (), которая сводится к вызовам операционной системы. Если операционная система, для которой он был скомпилирован, скажем, 64-битный RedHat Linux, то это, вероятно, означает, что двоичный файл будет искать имена RedHat Linux для общих библиотек в путях RedHAT Linux. Который не имеет абсолютно никакого отношения к совершенно другой операционной системе, Mac OS X, системным вызовам, общим или статическим библиотекам и т. Д. Это все равно, что снять колесо с мини-бондаря и попытаться его прикрутить на велосипед. Да, когда-то это был сырой металл и резина, и они могли быть превращены в велосипедную шину. Но как только вы сделаете этот двоичный файл, автомобильную шину или велосипедную шину, это то, что есть. иногда вы находите эмулятор, такой как wine, который эмулирует окна поверх системы posix. или виртуальная машина, такая как vmware, которая позволяет вам запускать совершенно другую операционную систему поверх другой, виртуализируя целый компьютер.
также верно, что вы, как правило, не можете рассчитывать на то, что вы возьмете какую-либо старую программу на Си, и она будет скомпилирована и запущена в любой операционной системе, которая, скажем, имеет компилятор gcc. да, вы можете научиться писать c-программы, которые переносимы, но вы должны тщательно придерживаться библиотек, которые поддерживаются на всех целевых платформах. поэтому даже перенос исходного кода вашей программы на mac и его компиляция не обязательно будут работать просто так.