Введение

Старый формат исполняемых файлов Unix

a.out — это формат файла, используемый в более ранних версиях Unix-подобных операционных систем для исполняемых файлов, объектного кода и, в более поздних системах, общих библиотек. Это сокращенная форма от "assembler output" – имени файла вывода ассемблера PDP-7, разработанного Кеном Томпсоном. Позже этот термин стали применять к формату результирующего файла, чтобы отличать его от других форматов объектного кода. "a.out" по-прежнему остается именем файла по умолчанию для исполняемых файлов, создаваемых некоторыми компиляторами и компоновщиками, если не указано другое имя, хотя создаваемые файлы на самом деле могут быть не в формате a.out. Поддержка формата a.out была удалена в версии ядра Linux 5.18.

История

Формат a.out для PDP 7, аналогичный формату a.out, используемому на PDP 11, появился в первом издании UNIX. Он был вытеснен форматом COFF в AT&T Unix System V, который, в свою очередь, был вытеснен форматом ELF в System V Release 4. Файлы a.out идентифицируются магическими числами с октальными кодами 0407, 0410 или 0413. Хотя Berkeley Unix продолжала использовать формат a.out некоторое время, современные системы BSD впоследствии перешли на ELF. NetBSD/i386 официально перешла с a.out на ELF в выпуске 1.5 (декабрь 2000 года). FreeBSD/i386 перешла на ELF в качестве стандартного формата во время перехода с 2.2 на 3.0 в 1998 году, однако поддержка a.out осталась в системе. MINIX 3 перешла на ELF в выпуске 3.2.0 (февраль 2012 года). Linux также использовал a.out только до ядра 1.2 (март 1995 года), когда он был заменен ELF и для этой платформы. Поддержка ELF была добавлена в экспериментальном ядре 1.1.52. Переход Linux на ELF был в значительной степени вынужден из-за сложности создания разделяемых библиотек на этой платформе, что включало необходимость регистрации виртуального адресного пространства, в котором располагалась библиотека, в централизованном органе, поскольку a.out ld.so в Linux не мог перемещать разделяемые библиотеки. Различные варианты BSD смогли продолжать использовать исполняемые файлы a.out спустя долгое время после того, как Linux был вынужден перейти на ELF, благодаря несколько более гибкому характеру формата a.out BSD по сравнению с форматом Linux. Формат файла a.out в Linux был объявлен устаревшим с выпуском ядра Linux 5.1, а последние части кода, обрабатывающие его, были удалены в версии 5.18.

Очистка

Поддержка вывода отладочной информации осуществляется посредством специальных записей в таблице символов, называемых stabs. Формат stabs также использовался во многих вариантах COFF и ELF.