Как правило, программы несовместимы из-за различий в их двоичном интерфейсе приложения (ABI) .
Разве программа не запускается прямо на процессоре?
НЕТ ! Это задача операционной системы - предотвращать запуск приложений «непосредственно» на процессоре. Как правило, на самом низком уровне (то есть на том, на котором построен API-интерфейс ОС) приложение взаимодействует с ядром операционной системы .
Это потому, что сама скомпилированная программа должна ссылаться на определенные библиотеки ОС?
Да . Многие библиотеки ОС написаны для облегчения взаимодействия с самой операционной системой, но столько же написано для кроссплатформенности. Они скрывают низкоуровневый интерфейс ОС от разработчика и предполагают, что скомпилированная версия для этой ОС будет доступна во время выполнения (см. Ниже).
Хотя библиотеки могут быть написаны в кросс-платформенных образом, при компиляции они не могут работать кросс-платформенный. Их по-прежнему необходимо перекомпилировать для конкретной целевой операционной системы, чтобы снова использовать конкретные базовые компоненты операционной системы (ядра).
В чем разница между скомпилированной программой для одной ОС против другой?
Наконец, сами исполняемые файлы часто содержат очень специфичные двоичные заголовки загрузки и т. Д. (Например, формат исполняемого файла PE [.exe, .dll и т. Д.] Для Windows или ELF для Linux [нет, .o, .so , так далее...]). Они также могут включать в себя код для загрузки скомпилированных специфичных для ОС двоичных файлов для конкретной библиотеки программного обеспечения.
Наконец, с точки зрения программиста: соглашение о вызовах . Скомпилированный код передает переменные функциям заданным образом (т.е. через регистры или в стеке) в очень определенном порядке. Даже в этом случае необходимо также договориться о том, кто отвечает за «очистку» вызовов функций (вызывающий или вызываемый?). Хотя существует несколько стандартных и широко используемых соглашений о вызовах x86 , некоторые из них могут не поддерживаться определенными операционными системами (это является частью ABI).