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

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

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

person Karthik Balaguru    schedule 28.02.2010    source источник


Ответы (2)


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

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

person Pascal Cuoq    schedule 28.02.2010
comment
Немного тривиальности - a.out означает Assembler OUTput, и по сей день gcc компилирует код C и по умолчанию называет выходной файл a.out, если не указано другое имя вывода, хотя выходной файл по-прежнему ELF. Это пережиток тех дней, когда код напрямую переводился на ассемблер... приятно видеть, что наследие живет духом!! - person t0mm13b; 28.02.2010
comment
Обратите внимание, хотя gcc по умолчанию использует имя a.out, формат по-прежнему ELF. - person hlovdal; 28.02.2010
comment
Мне было бы интересно узнать, как использовался ebx до и после, а также чем coff отличался от elf. - person Evan Carroll; 28.02.2018
comment
@EvanCarroll Исходный вопрос вообще не относится к COFF. Ваш комментарий звучит как новый вопрос, который я приглашаю вас задать. - person Pascal Cuoq; 28.02.2018
comment
@EvanCarroll В a.out ebx доступен для кода пользователя как регистр общего назначения. В x86 (32-разрядном) ELF ABI ebx содержит адрес глобальной таблицы смещений (GOT), поэтому он недоступен для пользовательского кода. Листовые функции — функции, которые не вызывают никаких других функций — могут сохранять и использовать его, но, в отличие от регистра сохранения вызываемого объекта, недостаточно сохранить его при входе, чтобы иметь возможность использовать его в целом. - person Pascal Cuoq; 28.02.2018

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

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

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

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

person Richard Pennington    schedule 28.02.2010
comment
Это объясняет различия, но не объясняет, что не так с a.out или почему лучше иметь больше разделов. - person Thomas Bonini; 28.02.2010