ПРИМЕЧАНИЕ: все числа имеют размер 4 байта; константы EOBLK и EOSEC определены в файле magic.h
Файл делится на неделимые блоки. Подробнее см. Процессоры.
В самом начале файла размещаются эти самые блоки, разделенные специальной константой EOBLK (end of block). Если в программе встретится это число, то это непременно приведет к ошибке формата файла. Так что этот способ разделения блоков не самый удачный. Но я все же постарался сделать это число таким, чтобы ни одному извращенному уму не пришло в голову сделать такую переменную у себя в программе.
Блок может быть пустым, то есть блоки можно разделять не только одним EOBLK, но и несколькими. Это никак не повлияет на работу других программ.
После того, как все блоки кончились, идет число EOSEC (end of section). Оно тоже сильно некрасивое, чтобы избежать случайных совпадений.
Следующим этапом в файл попадает таблица экспортируемых символов. Сначала пишется адрес первого символа, а потом его имя. Здесь и далее запись строк в файл осуществляется следующим образом: сначала пишутся собственно строковые данные, а в конце добавляется символ 0x0d (\r). Для считывания такой строки из файла удобно использовать fscanf:
fscanf(file, "%s", name);
fseek(file, 1, SEEK_CUR);
После первого символа точно таким же образом пишутся остальные. После этого в файл записывается EOSEC.
Затем записывается таблица импортируемых символов: сначала пишутся адреса внутри файла, в которые линкер должен будет прописать адрес символа. Для этого в файл просто пишутся последовательно все адреса, после всего списка EOSEC. Наконец, пишется имя символа. Таким же образом пишутся все остальные импортируемые символы, и весь список завершается EOSEC.
Потом пишутся данные о переменных и метках, объявленных в этом файле. Тут все просто - сначала пишется адрес, а за ним имя символа. Заканчивается список, как водится, EOSEC.
И напоследок записывается информация о номерах строк и соответствующих им адресах. Пишется номер строки, адрес символа и имя файла. Так же записываются все остальные строки. В конце стоит EOSEC.
Тут и описывать нечего - это просто образ памяти робота. Единственное, что может показаться интересным, это первые 4 байта. Они обозначают версию формата. Она будет изменяться очень редко. И уж если изменилась, то значит формат претерпел серьезные изменения, и программы уже вряд ли будут поддерживать устаревшие версии.
В этом файле хранится символьная информация для отладчика о файле re.
Сначала идет информация о соответствии строк исходников адресам программы. Сначала пишется адрес, потом номер строки, а потом имя файла. Так повторяется для всех строк, в которых есть какие-то эффективные данные (то есть данные, которые каким-то образом попали в файл re). После всего списка записывается EOSEC.
Потом пишется информация о соответствии имен переменных и меток из адресам в программе. Для этого сначала пишется адрес, а потом имя. Так для каждого символа. Все заканчивается EOSEC.