Ответ 1
В MSDN есть статья "" Глубокий взгляд на Win32 Portable Executable File Format", который описывает структуру исполняемого файла.
В основном,.exe содержит несколько блоков данных и инструкций о том, как их следует загружать в память. Некоторые из этих разделов содержат машинный код, который может быть выполнен (другие разделы содержат данные программы, ресурсы, информацию о перемещении, информацию об импорте и т.д.)
Я предлагаю вам получить копию Windows Internals для полного описания того, что происходит при запуске exe.
Для собственного исполняемого файла машинный код является специфичным для платформы. Заголовок .exe указывает, на какой платформе работает .exe.
При запуске native.exe происходит следующее (сильно упрощенное):
- Создается объект процесса.
- Файл exe считывается в эту память процесса. Различные разделы .exe(код, данные и т.д.) Отображаются отдельно и задаются разные разрешения (код выполняется, данные считываются/записываются, константы доступны только для чтения).
- Перемещения происходят в .exe(адреса получают пропатчен, если .exe не загружается по его предпочтительным адресам.)
- Загружается таблица импорта, и загружается зависимая DLL.
- DLL сопоставляются аналогичным методом с .exe с перераспределениями и загружаемой ими зависимой DLL. Импортируются функции из DLL.
- Процесс запускается в исходном заглушке в NTDLL.
- Начальный загрузчик запускает точки входа для каждой DLL, а затем переходит к точке входа .exe.
Управляемые исполняемые файлы содержат MSIL (Microsoft Intermediate Language) и могут быть скомпилированы, чтобы они могли настроить таргетинг на любой процессор, поддерживаемый средой CLR. Я не знаком с внутренней работой загрузчика CLR (какой исходный код изначально запускается для загрузки ремня CLR и начала интерпретации MSIL) - возможно, кто-то еще может это уточнить.