Последняя редакция: 7.05.2004 ФОРМАТ REL-СОВМЕСТИМЫХ ОБЪЕКТНЫХ ФАЙЛОВ Объектные файлы REL-формата фирмы Microsoft, представляют собой битовый поток. Отдельные поля в битовом потоке не выровнены на границу байта, кроме элементов, описанных ниже. Использование битового потока для объектных файлов уменьшает их размер, сводя к минимуму число обращений к диску для чтения/записи данных. Имеются два основных типа: Абсолютный и Перемещаемый. Первый бит служит индикатором типов. Если он равен 0, следующие 8 бит загружаются как абсо- лютный байт. Если первый бит равен 1, следующие 2 бита определяют 4 типа: 00b Спец-элемент (описание ниже). 01b Перемещаемый Код. Значение следующих 16 бит (2 байта) необходимо прибавить с текущему значению счетчика адреса Кода. 10b Перемещаемые Данные. Значение следующих 16 бит (2 байта) необходимо прибавить с текущему значению счетчика адреса Данных. 11b Перемещаемая Общая область (код+данные). Значение следующих 16 бит (2 байта) необходимо прибавить с текущему значению счетчика адреса Common-области. Спец-элемент(ы) содержит: ■ контр. поле из 4-х бит номеров элементов 0..15. ■ не обязательное A-поле. Содержит 2 бита типа адресации cseg, dseg,common (кроме абсолютного) и 2 (4 у extended REL) байта значения. ■ не обязательное B-поле. Содержит 3 бита (5 у extended REL) длины имени и самого имени идентификатора. Общее представление спец-элемента: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 00b xxx yy nnnn mmmm zzz + имя идентификатора -------------- ------------------------ A-поле B-поле xxx 4 бита контр. поля (0..15 номера элементов, см. ниже) yy 2 бита типа адресации (cseg/dseg/common) nnnn 16 бит значения (адрес) mmmm 16 бит дополнительно, при расширенном REL-формате zzz 3 бита длины имени (5 бит при расш. REL-формате) ... имя идентификатора Номера элементов контрольного поля ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Номера элементов только в B-поле: 0 - имя метки, на которую имеется ссылка 1 - имя блока COMMON 2 - имя прогр. модуля (program name) 3 - request-имя файла (request library search) 4 - элемент расширения. См. примечание. Номера элементов в A-поле и B-поле: 5 - размер COMMON (элемент только для A-поля ?) 6 - внешняя цепочка: для A-поля: адрес головной цепочки для B-поля: внешнее имя 7 - точка входа метки: для A-поля: адрес располож. метки для B-поля: имя метки Номера элементов только в A-поле: 8 - External - offset. Used for JMP and CALL to externals. 9 - External + offset. The A value will be added to the two bytes starting at the current location counter immediately before execution. 10 - размер области Данных. 11 - счетчик памяти сегмента (ORG cseg/dseg/common). 12 - адрес цепочки. A is head of chain, replace all entries in chain with current location counter. Вход последней цепочки имеет нулевой адрес. 13 - размер области Кода. 14 - конец программного модуля (end program), далее идет выравнивание до границы байта. Этот элемент не содержит ни A-поле, ни B-поле: 15 - конец файла Примечание по элементу расширения: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C-поле элемента расширения имеет формат B-поля спец-элемента, но область имени не содержит имя идентификатора, как в B-поле. Вместо него здесь находится один байт типа (сигнатура) элемента расширения, далее следует от 1 до 7 байт дополнительной информации. Таким образом, каждый элемент расширения имеет формат: 1 00b 0100b zzz i jjjjjjjj ---------------- C-поле zzz любые 3 бита (000b представляется как 8). (001b у асма SOLID). i 8 бит типа (сигнатура) элемента расширения. (0FEh у асма SOLID). jjjjjjjj zzz-1 число байт информации. Значение зависит от типа i. Это присутствует только в одном элементе расширения: zzz 010b (2) i X'35' тип (сигнатура) оверлейного сегмента COBOL j номер COBOL-сегмента - 31h (цифровой формат номера) Когда линкеру встречается сигнатура оверлейного сегмента, текущее число оверлейных сегментов устанавливается в значение j+31h (симв. формат номера). Если предварительно существующий номер сегмента не был нулевой и включена опция /N (сохр. файл с заданным именем), то область данных записывается на диск в файл. Имя файла равно текущему имени программы, с расширением файла - Vxx, где "xx" две hex-цифры номера сегмента j+31h (симв. формат номера).