Для понимания того, почему FreeBSD использует формат a.out
,
вы должны сначала получить представление о трёх "основных" форматах
выполнимых файлов для UNIX:
Это самый старый, `классический' формат объектных файлов для UNIX. В нём используется короткий и компактный заголовок с магическим числом в начале, которое часто используется для определения формата (за подробным описанием обратитесь к странице Справочника о a.out(5)). Он содержит три загружаемых сегмента: .text, .data и .bss плюс таблицу символов и таблицу строк.
Это формат объектных файлов SVR3. Дополнительно в заголовок включена таблица секций, так что вы можете иметь их больше, чем только .text, .data и .bss.
Преемник COFF
, в который добавлены возможности иметь много
секций и 32- или 64-разрядные значения. Один большой минус:
ELF
был спроектирован также в предположении, что для каждой
аппаратной платформы будет существовать только один ABI. Это
предположение достаточно некорректно, и даже в мире коммерческих
реализаций SYSV (в котором имеется по крайней мере три ABI: SVR4,
Solaris и SCO) это не так.
FreeBSD каким-то образом пытается решить эту проблему, предоставляя
утилиту для пометки конкретного выполнимого файла ELF
с информацией о ABI, с которым он совместим. Обратитесь к странице
Справочника об утилите brandelf
за подробной информацией.
FreeBSD выросла на "классических" традициях и традиционно использовала
формат a.out, технологию, опробованную и проверенную во многих
вариациях BSD. Хотя давно уже можно было компилировать и выполнять
родные выполнимые файлы (и ядро) в формате ELF
, FreeBSD с самого
начала сопротивлялась переходу на ELF
как на формат, используемый
по умолчанию. Почему? Когда мир Linux делал болезненный переход к
ELF
, причин отвергнуть формат a.out
было не так уж и много,
разве что их негибкий механизм работы с совместно используемыми
библиотеками, который был основан на таблице переходов, что делало
построение таких библиотек очень затруднительным для разработчиков.
Так как средства работы с ELF
предоставляли решение этой проблемы
и это было в общем-то "шагом вперёд" в любом случае, цена перехода была
признана стоящей того и переход был сделан.
В случае FreeBSD, наш механизм работы с совместно используемыми
библиотеками очень похож на механизм, применяемый в SunOS
,
поэтому его очень легко использовать. Однако, начиная с 3.0, FreeBSD
официально поддерживает ELF
как формат, используемый по умолчанию.
И, хотя формат a.out
поддерживается в полной мере, разработчики
из проекта GNU, являющиеся авторами компилятора, который мы используем,
больше не поддерживают формат a.out
. Это заставило нас поддерживать
различные версии компилятора и компоновщика, и не позволило
воспользоваться всеми возможностями последних разработок GNU.
Потребность в наличии реализации ISO-C++, в основном конструкторов и
деструкторов, также привела к поддержке ELF
в будущих релизах
FreeBSD.