Почему исполняемые файлы в операционной системе машинного кода зависят? - PullRequest
6 голосов
/ 23 февраля 2011

В Windows, когда я компилирую простую программу 'C', я получаю конечный исполняемый машинный код .exe.То же самое при использовании gcc в unix дает .out файл машинного кода.

В чем разница между ними?

Мой основной вопрос: .exe и .out - это машинные коды,почему они зависят от операционной системы?

Как в Unix, я не могу выполнить .exe напрямую, а в Windows, я не могу выполнить .out Unix.Почему это так?

Ответы [ 3 ]

12 голосов
/ 23 февраля 2011

Все это связано с тем, как загружается программа.

Windows и Linux имеют разные форматы, определяющие, как программа определяет себя.

В Linux обычно используется формат ELF . Для Windows это PE .

Эти форматы определяют различные данные о программе, необходимые для выполнения машинных инструкций.

Кроме того, интерфейсы операционной системы различны, поэтому необходимо использовать разные библиотеки и делать разные системные вызовы.

Для простой программы вы обычно можете просто перекомпилировать в другой операционной системе, чтобы она работала на обеих, но вы не сможете использовать один файл на обеих.

1 голос
/ 23 февраля 2011

В среде unix любой файл с установленным битом + x считается исполняемым. Помните, что даже недвоичные файлы могут быть исполняемыми (сценарии оболочки, командные файлы и т. Д.). Windows опирается на концепцию расширения файла, в Unix мы просто устанавливаем chmod +x filename.

Вы всегда можете использовать флаг -o file, чтобы заставить gcc создавать любое имя файла.

1 голос
/ 23 февраля 2011

Операционная система абстрагирует доступ к базовому оборудованию и делает его доступным для программистов через системные вызовы.В 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 указывает имя выходного файла, которое показывает, что оно не имеет отношения к фактическому формату выходного файла.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...