Последняя редакция: 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 (симв. формат номера).
