Операционная система абстрагирует доступ к базовому оборудованию и делает его доступным для программистов через системные вызовы.В Windows это делается через Windows API (который обычно дополнительно абстрагируется библиотеками, облегчающими программирование, такими как MFC и т. Д.).В UNIX это часто делается через прерывания, которые системная библиотека C делает немного проще, следуя API POSIX (часто с несколькими системно-зависимыми дополнениями).
Например, в Linux системные вызовы выполняются через int 0x80
, при этом несколько регистров загружаются с аргументами функции, а библиотека C делает это проще, позволяя вам вызывать, например, read
с ожидаемыми аргументами ( int fd, void *buf, size_t count )
.Это преобразуется в вызов прерывания, на который отвечает ядро.
Эти два способа выполнения запросов к операционной системе несовместимы, и поэтому вы (как правило) не можете запустить исполняемый файл Windows в системах UNIX,и наоборот, без использования какой-либо дополнительной системы, которая действует как слой перевода, такой как WINE, VMWare и т. д. (хотя способ работы этих двух функций очень различен).
(Кстати, a.out
ничего не говорит осодержимое исполняемого файла, это традиционное имя файла, данное исполняемым файлам, скомпилированным в системах UNIX, и сокращение от «вывод ассемблера». GCC допускает кросс-компиляцию, так что вы можете даже скомпилировать Win32-совместимые .EXE-файлы с ним. Вы можете использоватьфлаг -o
для gcc указывает имя выходного файла, которое показывает, что оно не имеет отношения к фактическому формату выходного файла.)