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, секции конструктора и даже один раздел для каждой функции, если мы этого хотим.