A.out заменен форматом файла ELF?

У меня есть несколько вопросов:

  • Почему a.out был заменен на ELF?
  • Каковы были основные недостатки формата a.out, которые привели к повышению формата файла ELF?
  • Ранние дампы ядра были основаны на a.out, но теперь они основаны на ELF. Каковы различные преимущества, предоставляемые ELF?

Ответ 1

Формат a.out форматированных разделяемых библиотек занимает фиксированное место в памяти. Если вы хотите распространять общую библиотеку a.out, вам необходимо зарегистрировать ее адресное пространство. Это было хорошо для производительности, но оно вообще не масштабировалось. Посмотрите сами насколько это было сложно (linuxjournal).

В отличие от ELF, общие библиотеки могут быть загружены в любую точку памяти и даже могут отображаться на разных адресах для разных приложений, работающих на одном компьютере (при этом код по-прежнему эффективно загружается только в одном месте в физической памяти)! Для этого в архитектуре IA-32 необходимо пожертвовать регистром (% ebx). Более полная справочная информация, показывающая, что общие библиотеки стали более сложными в ELF, но это была сложность компилятора, в отличие от сторон программиста.

Ответ 2

Немного тривиальности - a.out означало Assembler OUTput и по сей день gcc скомпилирует код C и по умолчанию будет именовать выходной файл a.out, если не указано другое имя вывода, хотя выходной файл все еще ELF, Это был перерыв с тех пор, когда код был непосредственно переведен на выход ассемблера... приятно видеть, что в жизни живет дух!

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

Ответ 3

Как я помню, одной из исходных проблем с форматом a.out является то, что он поддерживает только три раздела: текст, данные и bss. ELF позволяет любое число (или, по крайней мере, еще много). Формат заголовка a.out был очень простым, например:

word <magic>
word <text size>
word <data size>
word <bss size>

Формат ELF, напротив, имеет заголовки разделов с именами, размерами и т.д.

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