Если вернуться в далёкое тёмное прошлое, то тогда компьютеры были очень просто устроены. На них могла работать простая, маленькая система. Формат a.out полностью решал задачу представления программ на простых системах (PDP-11). Когда же люди перенесли unix с простых систем, они оставили a.out, так как его было достаточно для ранних реализаций unix для таких архитектур, как Motorola 68k, VAX, итд.
Затем какой-то умный инженер решил, что если он может заставить
программное обеспечение делать некоторые тонкие манипуляции, то это
позволит преодолеть некоторые ограничения при проектировании и позволит
ядру процессора работать быстрее. Когда это было сделано с новым типом
аппаратуры (в наши дни известном как RISC), оказалось, что a.out
плохо подходит для этой аппаратуры, поэтому было разработано много новых
форматов для достижения большей производительности от такого аппаратного
обеспечения, чем может дать простой, имеющий ограничения формат
a.out
. Были разработаны такие форматы, как COFF
, ECOFF
и
ещё несколько безвестных других со своими ограничениями, пока наконец
все не остановились на формате ELF
.
Вдобавок к этому, так как размеры программ стали достигать огромных
размеров, а дисковая (и физическая) память оставалась сравнительно
небольшой, то возникла концепция совместно используемых библиотек.
Система VM также стала более мощной. Хотя каждое из этих нововведений
продолжало использовать формат a.out
, его бесполезность становилась
видна всё больше и больше с добавлением каждой новой возможности. К тому
же люди захотели динамически загружать код во время выполнения программ
или сбрасывать части программ после выполнения кода инициализации для
экономии основной памяти и/или размера свопа. Языки программирования
становились всё более умными и люди захотели автоматического запуска
некоторого кода перед главной процедурой программы. С форматом
a.out
была сделана масса ухищрений для реализации всех этих
требований, и они в общем-то работали. В конце концов наступил момент,
когда формат a.out
перестал бы справляться со всеми этими
проблемами без ещё больших потерь в коде и гибкости в работе. Тогда
как ELF
решал многие из этих проблем, переход на него был бы
болезненным на рабочей системе. Так что ELF
ждал момента, когда
был бы более болезненным оставаться с форматом a.out
, чем перейти
к формату ELF
.
Однако с течением времени инструменты разработки, на которых
основаны инструменты разработки FreeBSD (особенно ассемблер и
загрузчик), разделились на две параллельные ветви. В дерево FreeBSD
была добавлена поддержка совместно используемых библиотеки и были
исправлены некоторые ошибки. Разработчики из GNU, которые изначально
писали эти программы, полностью их переделали, добавив более простую
поддержку построения кросс-компиляторов, в котором можно использовать
различные форматы, итд. Когда многие захотели строить кросс-компилятор
с выходнвм кодом для FreeBSD, то им не повезло, так как старые исходные
тексты, которые FreeBSD использовала для as и ld, не подошли. Новый
набор утилит от GNU (binutils) поддерживает кросс-компиляцию, ELF
,
совместно используемые библиотеки, расширения C++, итд. Вдобавок,
многие разработчики выпускают программы в бинарном формате ELF
, и
для FreeBSD было бы полезно иметь возможность их запускать. И если
такая возможность будет реализована, зачем тогда вообще продолжать
опираться на a.out
? Это измученная старая лошадь, которая была
полезна долгое время, но сейчас самое время от неё отказаться, оставив
в прошлом долгие годы преданной службы.
ELF
более выразителен, чем a.out, и позволяет реализовать
большую расширяемость основной системы. Инструменты для работы с
ELF
лучше поддерживаются разработчиками, и предоставляют поддержку
кросс-компиляции, что для многих важно. ELF
может работать немного
медленнее, чем a.out, но это трудно измерить. Также между ними есть
некоторые отличия по распределению страниц памяти, обработке кода
инициализации, итд. Никакие из этих отличий особо не важны, но эти
отличия всё же есть. Со временем поддержка a.out
будет убрана из
ядра GENERIC, и постепенно убрана из системы совсем, как только отпадёт
нужда в запуске старых программ в формате a.out
.