В чем разница между исполняемыми форматами?

Существуют ли существенные различия между PE, ELF и Mach-O? Я имею в виду, есть ли у одного способности, которых нет у других? Может ли один нести больше информации, чем другие? Или это просто разные форматы контейнеров для одной и той же информации?
Я не очень разбираюсь в этом, но мне кажется, что все они несут текстовые (кодовые) секции, секции инициализированных и неинициализированных данных и т.д., а также таблицы перемещений, символов, строк, импорта и экспорта.

Я не спрашиваю о незначительных различиях, таких как то, что формат X может разбивать раздел данных или что формат Y может более эффективно анализироваться аппаратно.
Я спрашиваю об основных различиях, которые могут повлиять на выбор нового ОС общего назначения. Или что, если бы на платформе был загрузчик для всех трех форматов, было бы тривиально конвертировать из одного формата в другой, просто «переупаковав» разделы и переписав таблицы в новый формат.


person Baruch    schedule 29.03.2016    source источник


Ответы (1)


Mach-O происходит от CMU Mach с 1985 года. Он был принят NeXT, а затем Apple. PE происходит от Microsoft Windows NT 3.1 1993 года. ELF происходит от ATT System V не позднее 1993 года. Это старые форматы 32b, которые с тех пор были расширены до 64b. Были добавлены поля и расширены перечисления, но их структура осталась прежней. Их основные отличия заключаются в том, что Mach-O является базовым для OSX+iOS; PE является базовым для Windows; и ELF является базовым для Linux, FreeBSD, .... ELF также поддерживается в Windows с помощью подсистемы Windows для Linux. Каждый из них поддерживает динамические библиотеки, PIE, ASLR, .... Вы не выберете один из них на основе функций, а скорее выберете цель, и это выберет ваш объект/исполняемый формат. Компоновщик GNU ld обрабатывает все три формата, а компоновщик OSX действительно является разветвленной версией ld.

person Olsonist    schedule 29.10.2020