GOFF - GOFF

В GOFF Спецификация (Generalized Object File Format) была разработана для IBM MVS Операционная система заменить IBM Формат объектного файла OS / 360 чтобы компенсировать слабые места в старом формате.[1]

Фон

Оригинальный IBM Формат объектного файла OS / 360 был разработан в 1964 году для нового IBM System / 360 универсальный компьютер. Формат также использовался производителями мэйнфреймов, совместимых с штепсельной вилкой и похожих на рабочие, включая Univac 90/60, 90/70 и 90/80 и Fujitsu B2800. Формат был расширен за счет добавления символьных записей и расширенной информации о модулях, а также поддержки процедур и функций с именами длиной более 8 символов. Хотя это помогло, оно не предоставило расширенной информации, необходимой для современных более сложных языков программирования и более продвинутых функций, таких как объекты, свойства и методы, Unicode поддержка и виртуальные методы.

Формат объектного файла GOFF был разработан IBM примерно в 1995 году как средство решения этих проблем.[2] Самое раннее упоминание об этом формате было во вводной информации о новом ассемблере высокого уровня.[3] Обратите внимание, что формат объектного файла OS / 360 был просто заменен форматом GOFF, он не был признан устаревшим и все еще используется ассемблерами и компиляторами языков, где язык может выдерживать ограничения старого формата.

Конвенции

В этой статье термин «модуль» будет использоваться для обозначения любого имени или эквивалентного символа, который используется для предоставления идентификатора фрагмента кода или данных, внешних по отношению к объем на который он ссылается. Модуль может относиться к подпрограмме, функции, Фортран Общие или блочные данные, объект или класс, метод или свойство объекта или класса, или любая другая именованная процедура или идентификатор, внешний по отношению к этой конкретной области, ссылающийся на внешнее имя.

Термин «ассемблер» для программы, которая преобразует язык ассемблера в машинный код, а также Собрать" как процесс использования одного, и Скомпилировать," как процесс использования «компилятора», который делает то же самое для языков высокого уровня, для целей этой статьи. считаться взаимозаменяемыми; таким образом, когда используются «компиляция» и «компилятор», замените «сборку» и «ассемблер» по мере необходимости.

Числа, используемые в этой статье, выражаются следующим образом: если не указано иное как шестнадцатеричный (основание 16), все числа используются в десятичном формате (основание 10). Когда необходимо выразить число в шестнадцатеричном формате, стандартный формат ассемблера мэйнфрейма с использованием заглавной буквы X перед числом, выражением любых шестнадцатеричных букв в числе в верхнем регистре и заключением числа в одинарные кавычки, например число 1516 будет выражаться как X'15DEADBEEF '.

«Байт», используемый в этой статье, является 8-битным, и, если не указано иное, «байт» и «символ» - это одно и то же; персонажи в EBCDIC тоже 8-битные. Когда многобайтовые наборы символов (например, Unicode ) используются в пользовательских программах, они будут использовать два (или более) байта.

Требования и ограничения

Формат аналогичен формату объектного файла OS / 360, но добавляет дополнительную информацию для использования при создании приложений.[4]

  • Файлы GOFF представляют собой записи фиксированной или переменной длины.
  • Запись GOFF должна полностью умещаться в одной записи базовой файловой системы. Файл GOFF не является транслировать -тип файла.
  • Записи фиксированной длины должны быть 80 байтов. Минимальный размер записи переменной длины - 56 байтов. В случае записей фиксированной длины в конце записи будут неиспользованные байты. Эти байты должны быть установлены на двоичный ноль.
  • Программа, читающая (или записывающая) записи GOFF, не должна делать предположений о внутреннем формате записей, предполагается, что операционная система способна предоставлять записи фиксированной или переменной длины, при этом программа, читающая их, не должна знать о работе система управления внутренними файлами. Длина записи не является частью самой записи.
  • Двоичные значения хранятся в прямой порядок байтов формат, например значение 1 - X'01 'для 8-битного значения, X'0001' для 16-битного значения, X'00000001 'для 32-битного значения и X'0000000000000001' для 64-битного значения.
  • Биты считаются слева направо; бит 0 - это крайний левый бит в байте или слове.
  • Записи фиксированной длины необходимы для файлов GOFF, развернутых на Unix системы.
  • Запись может быть продолжена на следующей записи. Если запись продолжается, между продолжающейся записью и продолжающейся записью не должно быть никаких промежуточных записей.
  • Объектный файл GOFF начинается с записи HDR и заканчивается записью END. Запись END должна включать количество записей GOFF (а не количество физических записей) в файле.
  • Компилятор языка или ассемблер может создавать несколько файлов GOFF в одной компиляции / сборке, но отдельные файлы GOFF должны быть отделены друг от друга.
  • Имена модулей и классов чувствительны к регистру. Модуль с именем "exit" (используемый C язык) не обязательно должно совпадать с "EXIT", используемым Фортран язык.
  • Некоторые соглашения, применимые к формату объектного файла OS / 360, перенесены в формат объектного файла GOFF, в том числе:
    • Если не указано иное, все символы находятся в EBCDIC набор символов, за исключением внешних имен, как указано ниже.
    • Элементы ESD (основные программы, подпрограммы, функции, FORTRAN Common, методы и свойства в объектах) должны быть пронумерованы, начиная с 1, и каждый новый элемент должен иметь следующий номер в последовательности, без каких-либо «пробелов» в нумерации.
    • Элемент ESD должен быть определен до того, как на него будет ссылаться какая-либо другая запись (например, запись TXT или RLD).
    • Каждая запись ESD содержит ровно один элемент ESD. (Это отличается от старого формата, который позволял использовать до 3 элементов ESD в каждой записи ESD.)
    • Запись RLD (словарь перемещения[5]) может содержать один или несколько элементов, а запись RLD может быть продолжена до следующей записи.
    • Для обеспечения совместимости в будущем поля, обозначенные как «зарезервированные», должны быть установлены на двоичный ноль.
    • Наборы символов, используемые для внешних имен, не определены стандартом GOFF, но есть положение для файла, чтобы указать, какой набор символов используется. (Это для поддержки двухбайтового набора символов Unicode Однако некоторые продукты IBM позволяют использовать символы для внешних имен и других идентификаторов только в ограниченном диапазоне, обычно (EBCDIC) шестнадцатеричные значения от X'41 'до X'FE' плюс сдвиг внутрь и сдвиг символы, X'0F 'и X'0E' соответственно.
  • Новый формат поддерживает имена классов, которых есть два типа: зарезервированный и предоставленный пользователем или же незарезервированный. Все имена классов имеют максимальную длину 16 символов.
  • Зарезервированные имена классов состоят из одной буквы, символа подчеркивания и от 1 до 14 символов. Зарезервированные имена классов, начинающиеся с B_ зарезервированы для связующего; Зарезервированные имена классов, начинающиеся с C_ отмечен как загружаемый зарезервированы для программ, созданных для использования с IBM Language Environment (LE). Имена классов, начинающиеся с C_ которые не помечены как загружаемые, а также классы, начинающиеся с X_, Y_ или же Z_ доступны для общего пользования как незарезервированный.
  • Имена классов, предоставляемые пользователем, могут быть в нижнем регистре.
  • Имена классов нет внешние символы.
При необходимости для компиляции можно ссылаться на следующие классы, используемые связывателем:
B_ESDКласс внешнего словаря символов
B_TEXTТекстовый класс
B_RLDКласс словаря перемещения
B_SYMКласс таблицы внутренних символов
B_IDRLКласс данных идентификации переводчика языка
B_PRVПсевдо-регистровый класс
B_IDRUКласс данных идентификации, определяемый пользователем
Следующие имена классов зарезервированы связывателем и недоступны для пользовательских приложений:
B_IDRBИнформация о данных Binder
B_IDRZИнформация о данных SUPER-Zap
B_IMPEXPТаблица импорта-экспорта
B_LITТаблица информации о загрузке
B_MAPКартографические данные
  • Информация о символьной таблице объектного файла SYM из записи формата объектного файла 360 недоступна для объектных файлов GOFF; Вместо этого должна использоваться запись ADATA (подзапись в TXT).

Типы записей

Как и в более старом формате OS / 360, записи объектного файла делятся на 6 различных типов записей: некоторые добавлены, некоторые удалены, некоторые изменены:

  • Запись HDR (это новая) должна происходить первой, она определяет заголовок объектного файла.
  • Записи ESD определяют основные программы, подпрограммы, функции, фиктивные разделы, общий язык Fortran, методы и свойства, а также любой модуль или подпрограмму, которые могут быть вызваны другим модулем. Они используются для определения программ или сегментов программы, которые были скомпилированы при этом выполнении компилятора, и внешних подпрограмм, используемых программой (например, exit () в C, ВЫЗОВ ВЫЙТИ через Фортран; new () и dispose () в Паскаль ). Записи ESD должны находиться до любой ссылки на символ ESD.
  • Записи TXT были расширены, и помимо машинных инструкций или данных, которые хранятся в модуле, они также содержат записи идентификационных данных (IDR) (20 или более типов), записи связанных данных (ADATA) и дополнительную информацию, связанную с к модулю.
  • Записи RLD используются для перемещения адресов. Например, программа, ссылающаяся на адрес, расположенный в 500 байтах внутри модуля, будет внутренне сохранять адрес как 500, но когда модуль загружается в память, он обязательно должен быть расположен где-то еще, поэтому запись RLD сообщает редактору связи или загрузчику, что адреса изменить. Кроме того, когда модуль ссылается на внешний символ, он обычно устанавливает значение символа равным нулю, а затем включает запись RLD для этого символа, чтобы позволить загрузчику или редактору связей изменить адрес на правильное значение.
  • Записи LEN являются новыми и содержат определенную информацию о длине.
  • Записи END указывают на конец модуля и, возможно, где программа должна начать выполнение. Это должна быть последняя запись в файле.

Формат

Записи GOFF могут быть фиксированной или переменной длины; минимальная длина при использовании записей переменной длины составляет 56 символов, хотя большинство записей будут длиннее этого. За исключением имен модулей и классов, все символы находятся в EBCDIC набор символов. Системы на основе Unix должны использовать записи фиксированной длины (80 байт). Записи в файлах фиксированной длины, которые короче фиксированной длины, должны быть заполнены нулями. Чтобы отличить записи GOFF от более старого формата OS / 360 или от команд, которые могут присутствовать в файле, первым байтом каждой записи GOFF всегда является двоичное значение X'03 ', а команды должны начинаться со значения символа не менее пробел (X'40 '). Следующие 2 байта записи GOFF указывают тип записи, продолжение и версию формата файла. Эти первые 3 байта известны как PTV поле.

PTV

Поле PTV представляет первые 3 байта каждой записи GOFF.

Поле PTV
БайтБитыЦенитьЦель
0Все03Указывает на начало записи GOFF
10-30Запись ESD (внешний символ)
1Запись TXT (текст)
2Запись RLD (Relocation)
3LEN (длина) запись
4КОНЕЦ (Конец) записи
X'5'-X'E 'Зарезервированный
X'F 'Запись HDR (заголовок)
4-5Зарезервированный
6-700Первоначальная запись, которая не продолжается на следующей записи. Это должно быть единственное значение, используемое для записей GOFF переменной длины.
01Первоначальная запись, которая продолжается на следующей записи
10Продолжение записи не продолжается на следующей записи
11Продолжение записи, которое продолжается на следующей записи
2Все00Версия Номер формата объектного файла. Все значения, кроме X'00 ', зарезервированы

HDR

Запись HDR обязательна и должна быть первой записью.

Запись HDR
Байт (ы)РазмерПолеЦенитьЦель
0-23PTVX'03F000 'Только допустимое значение; Запись HDR в настоящее время не может быть продолжена
3-47450Зарезервированный
48-514Уровень архитектурыДвоичный 0 или 1Уровень архитектуры GOFF; все значения кроме 0 и 1 зарезервированы
52-532Размер свойств модулядвоичныйДлина поля свойств модуля
54-5960Зарезервированный
60-0+Свойства модуляСписок свойств модуля (необязательно)

ESD

Запись ESD дает публичное имя для модуля, основной программы, подпрограммы, процедуры, функции, свойства или метода в объекте, Fortran Common или альтернативной точке входа. Запись ESD для публичного имени должна присутствовать в файле до того, как какая-либо ссылка на это имя будет сделана какой-либо другой записью.

Запись ESD
Байт (ы)РазмерПолеЗначение (или биты)Цель
0-23PTVX'030000 'Запись ESD без продолжений
X'030100 'Запись ESD, которая продолжается на следующей записи
31Тип символа00SD - Определение раздела; Это используется для прежних значений SD, CM (Common) и PC (Private Code, SD с пустым именем). Значение ESDID «Родитель» должно быть 0. Оно используется для определения основной программы, подпрограммы или функции, код которой является частью этого файла. Также используется для Fortran Common.
01ЭД - Внешнее определение. «Родительский» ESDID должен быть ненулевым и быть значением записи SD, которая ссылается на этот внешний символ. Если значение RLD относится к классу, к которому принадлежит эта запись, класс, к которому относится этот элемент, должен быть указан в поле External Name. Это используется для наименования вызываемой процедуры или функции.
02LD - определение метки. «Родительский» ESDID должен быть ненулевым и быть значением записи SD, которая определяет этот символ внутри себя. Это можно использовать для создания псевдонима для модуля или для раскрытия его части как отдельной процедуры. Например, библиотека времени выполнения для определенного языка программирования может иметь определенные функции, которые она должна использовать сама, но которые полезны для программ, написанных с использованием этого языка, и поэтому функции можно присвоить метку, чтобы ее можно было вызывать напрямую. Например, может существовать полный математический пакет в виде единого модуля, и все стандартные функции (синус, косинус, квадратный корень и т. Д.) Могут быть названы точками входа в этом модуле.
03PR - Ссылка на деталь или псевдо-регистр. Отличается полем ID пространства имен. «Родительский» ESDID должен быть ненулевым и быть значением записи SD, которая определяет этот символ внутри себя.
04ER и WX - внешняя ссылка / слабая внешняя ссылка. Различаются значением «Сила привязки» в поле «Атрибуты». WX используется там, где может отсутствовать внешняя процедура. Например, если у программы калькулятора был быстрый и высокопроизводительный математический пакет, который был необязательным, его можно было назвать WX, а если он отсутствовал или недоступен, программа могла перейти на более раннюю версию математического пакета.
4-74ESDIDДвоичныйИдентификатор ESDID, начинающийся с 1. Каждый новый ESDID должен быть ровно на 1 выше, чем предыдущая запись.
8-114Родительский ESDIDдвоичныйЭто ESDID объекта, определяющего эту запись, если он является частью другого объекта. Это 0, если у него нет родителя.
12-1540Зарезервированный
16-194КомпенсироватьДвоичныйАдрес этого символа в его родительском ESDID для записей LD или ED; ноль в противном случае.
20-2340Зарезервированный
24-274ДлинаДвоичныйДлина этого пункта для типов ЭД и ПР; ноль в противном случае. Если фактическое значение длины отложено; это значение установлено на -1.
28-314Расширенный атрибут ESDIDДвоичныйESDID элемента, который содержит расширенную атрибутивную информацию для типов ED и LD; обычно используется там, где библиотеки DLL поддерживаются для символов, которые разрешаются во время выполнения (например, виртуальные методы). В противном случае - ноль.
32-354Расширенное смещение атрибутаДвоичныйАдрес, по которому можно найти расширенные атрибуты для предыдущего поля, используется для записей ED и LD, имеющих расширенные атрибуты; ноль в противном случае.
36-3940Зарезервированный
401ID пространства именОпределяет пространство имен, которому принадлежит
0Зарезервировано для подшивки управления программами
1Нормальное имя
2Псевдо Регистр
3Части (выделенное пространство для внешних записей, включая элементы, содержащие инициализированные статические данные)
411Флаги
Заполнить настоящееБит 00Без заливки
1Заполнить байт присутствует (только для типов ED)
ИскалеченныйБит 10Символ не искажен
1Символ может быть поврежден
ПереименовываемыйБит 20Не может быть переименован (то же, что и флаг mapped в XOBJ)
1Символ может быть переименован (может участвовать в переименовании типа Language Environment (LE))
Съемный классБит 30(По умолчанию) Не снимается
1Этот класс можно при желании удалить, не влияя на работу программы (действительно только для типов ED)
Биты 4-6Зарезервированный
Зарезервировать дополнительное пространствоБит 70Дополнительного места не зарезервировано
1Зарезервируйте 16 байтов места в начале класса (только для типа ED класса MRG)
421Заполните значениеЗначение байта заполнения, если установлен флаг Fill Present
4310Зарезервированный
44-474Связанные данныеДвоичныйИспользуется для идентификатора среды или статической области для элементов LD с использованием XLINK
48-514ПриоритетДвоичныйПорядок сортировки PR-позиций
52-5980Зарезервированный
60-6910Поведенческие атрибутыАтрибуты поведения для этого элемента (см. Таблица атрибутов поведения ниже)
70-712Имя ДлинаДвоичныйДлина названия этого элемента; не может быть нулевым
72-ИмяТекстНазвание этого элемента с обрезанными пробелами в конце. Должен быть хотя бы один символ; Приватный код состоит из одного пробела. Имя чувствительно к регистру.
REM0Трейлер: неиспользуемое пространство, если необходимо для записей фиксированного размера; должно быть заполнено нулями. Не требуется в записях переменной длины.

Продолжение

В случае записей фиксированной длины, где для имени требуются записи продолжения, используется следующее:

Запись продолжения ESD
Байт (ы)РазмерПолеЦенитьЦель
0-23PTVX'030200 'Запись продолжения ESD без дальнейших продолжений
X'030300 'Запись продолжения ESD, которая будет продолжена на следующей записи
3-ИмяТекстОстальная часть имени, если эта запись не продолжается, или следующие 77 байтов имени, если продолжение.
REM0Остаток для записи фиксированной длины длиннее, чем предоставленные данные. Он содержит завершающие байты, если это последняя запись для этого имени и имя короче, чем размер записи; должно быть 0 заполнено. Это поле отсутствует в записях переменной длины.

Атрибуты поведения

Поле поведенческих атрибутов (байты 60-69 записи ESD)
КомпенсироватьРазмер (байты)БитыПолеЦенитьЦель
01Адресация свойствРежим адресации, связанный с этим внешним символом. Эти значения также используются AMODE поле КОНЕЦ записывать.
00AMODE не указан (по умолчанию AMODE (24))
01AMODE (24)
02AMODE (31)
03AMODE (ЛЮБОЙ) (24 или 31)
04AMODE (64)
10AMODE (MIN) (используйте наименьший AMODE, используемый всеми модулями)
11Недвижимость в резиденцииСвязанный режим проживания внешнего символа
00RMODE не указан (по умолчанию RMODE (24))
01RMODE (24)
03RMODE (31) (эквивалент RMODE (ANY))
04RMODE (64)
210-3 (4)Стиль записи текстаСтиль текста для этого класса (только для типов ED и PR) Весь текст должен быть в одном стиле.
0000Байт-ориентированный
0001Структурированные данные (ориентированные на подшивку)
0010Структурированные данные (определяются пользователем)
4-7 (4)Алгоритм привязкиМетод привязки данных
0000Объедините все элементы один за другим
0001Слияние (все элементы с одинаковыми именами будут расположены в одном пространстве, с использованием максимального указанного размера и наиболее строгого выравнивания). Элементы с разными именами будут объединены. Это обычная практика для типов CM и PR.
310-2 (3)Поведение при выполнении задачИндикация того, является ли модуль реентерабельным и / или многоразовым
000Неопределенные
001Ни для повторного использования, ни для повторного использования (НЕ ПОВТОРНО)
010Последовательно многоразовые (REUS)
011Reentrant (RENT), также подразумевает (REUS)
30Зарезервированный
4Только чтение0Не только для чтения
1Только чтение
5-7 (3)Исполняемый000Не указано
001Не исполняемый (только данные)
010Исполняемый файл (код или код и данные)
410-1 (2)0Зарезервированный
2-3 (2)Повторяющийся символ важностиУровень ошибки, который должен вызывать повторяющийся символ (только записи типа PR)
00Связующее определяет серьезность
01Минимум 4 (Предупреждение)
10Минимум 8 (ошибка)
11Зарезервированный
4-7 (4)Связующая силаСлабые ссылки не будут искать другие библиотеки; Сильные ссылки будут искать символ в других библиотеках. Строгие определения можно разрешить по любой ссылке; это значение по умолчанию.
0000Сильный
0001Слабый
510-1 (2)Поведение при загрузке классаОпределяет, будут ли загружаться элементы класса в случае использования запроса LOAD операционной системы в отношении объекта.
00ЗАГРУЗИТЬ - Загрузить этот класс
01ОТЛОЖЕННАЯ ЗАГРУЗКА - этот класс, вероятно, будет использоваться и должен быть загружен
10NOLOAD - не загружать этот класс
11Зарезервированный
2Общий флагЕсли 1, трактуется как "старый" ОБЩИЙ CM-типа, когда несколько ссылок устанавливают размер на самую большую область, используемую любой ссылкой. Тип SD с тем же именем сохранит размер и текст. Единственный поддерживаемый тип текста - B_TEXT.
3Прямая и косвенная ссылка0Прямые ссылки (для целей Переплета)
1Для типа PR это дескриптор связи; для типа ER это ссылка на дескриптор связи XPLINK
4-7 (4)Область привязки0000Неопределенные
0001Объем раздела («местный»)
0010Область действия модуля («глобальная»)
0011Объем библиотеки
0100Объем импорта-экспорта
610-1 (2)Зарезервированный
2Тип связиДля типов ER, LD, PD и PR
0Стандартная связь O / S (по умолчанию)
1Связь XPLINK
3-7 (5)ВыравниваниеПодразумеваемое выравнивание этого элемента
00000Байт
00001Полуслово
00010Полное слово
00011Двойное слово
00100Квадворд
00101Страница 4 КБ
Все показанные выравнивания доступны для типов ED и PR, за исключением того, что PR не может использовать выравнивание страниц.
7-93Зарезервированный

Записи ADATA

Записи ADATA («связанные данные») используются для предоставления дополнительной символьной информации о модуле. Они заменили старые записи SYM в формате объектного файла 360. Чтобы создать запись ADATA

  • Создайте запись ESD типа ED для имени класса, частью которого являются записи.
  • Установите все поля в Поведенческие атрибуты запись в 0 кроме
    • Загрузка класса (биты 0-1 байта 5) - X'10 '
    • Алгоритм привязки равен 0
    • Стиль текстовой записи (биты 0–3 байта 2) - X'0010 '
    • При желании установите Только чтение (бит 4 байта 3) и Не исполняемый (биты 5-7 байта 3) значения, если необходимо
  • Создайте запись TXT для каждого элемента ADATA
    • Элемент ESDID это значение записи ADATA ED для этой конкретной записи ADATA
    • Компенсировать ноль
    • Длина данных длина записи ADATA
    • Данные поле содержит саму запись ADATA

Записи ADATA будут добавлены в конец класса в том порядке, в котором они были объявлены.

Имена классов, присвоенные записям ADATA, переводятся программами IBM путем преобразования двоичного значения в текст и добавления его к имени. C_ADATA, Таким образом, элемент с номером X'0033 'станет текстовой строкой C_ADATA0033.

Типы записей ADATA
ТипОписание
X'0000 '- X'7FFF'Записи переводчика (обратите внимание, что некоторые значения в диапазоне от 0 до X'0130 'используются некоторыми продуктами языковых переводчиков IBM, включая Assembler, Кобол и PL / I ).
X'8000 '- X'8FFF'Записи управления программой
X'9000 '- X'DFFF'Зарезервированный
X'E000 '- X'EFFF'Зарезервировано для компиляторов и ассемблеров, выпущенных не IBM.
X'F000 '- X'FFFF'Доступно для пользовательских записей. IBM не будет использовать эти значения.

текст

Записи TXT определяют инструкции и данные машинного кода, которые должны быть размещены в определенном месте адреса в модуле. Обратите внимание, что везде, где должна быть указана «длина» для этой записи, значение длины должно включать любые продолжения этой записи.

Запись TXT
Байт (ы)РазмерПолеБитыЦенитьЦель
0-23PTVX'031000 'Запись TXT без продолжений
X'031100 'Запись TXT, которая продолжается на следующей записи
310-3 (4)Зарезервированный
Стиль4-7 (4)Все остальные значения зарезервированы
0000Байтовые данные
0001Структурированные данные (в настоящее время поддерживаются только 19-байтовые поля IDR; см. Таблица данных IDR)
0010Неструктурированные данные
4-74Элемент ESDIDДвоичное числоESDID, которому принадлежит содержимое этой записи
8-114Зарезервированный
12-154КомпенсироватьДвоичный адресАдрес в ESDID, где должны быть размещены эти данные. Это должно быть 0 для структурированных и неструктурированных данных.
16-194Истинная длина текстового полядвоичное значение: 0 или полный размер после раскрытияЕсли поле Text Encoding равно 0, это должно быть 0. В противном случае это поле представляет собой полный размер текста после распаковки или распаковки.
20-212Кодировка текстадвоичное значение0, если текст не требует тиражирования, распаковки или декодирования; ненулевое значение, чтобы указать, что текст должен быть декодирован, распакован или расширен; видеть Таблица сжатия
22-232Длина данныхдвоичное значение больше нуляОбщая длина данных в этой записи в байтах как беззнаковое значение и не может быть нулем.
24-ДанныеМашинный код и / или данные, которые нужно вставить. Если включены данные IDR, на них распространяются особые правила и требования, см. Таблица данных IDR
REMОтсутствует для записей переменной длины; оставшиеся байты для фиксированной записи длиннее оставшихся данных и должны быть двоичными нулями

Продолжение

Продолжение таблицы
Байт (ы)РазмерПолеБитыЦенитьЦель
0-23PTVX'031200 'Продолжение Запись без дальнейших продолжений
X'031300 'Продолжение Запись, которая продолжается на следующей записи
3-Данные продолжаются с предыдущей записи
REMЕсли остаток записи длиннее данных; ноль заполнен

Таблица сжатия

Таблица сжатия используется, если байты 20-21 записи TXT отличны от нуля. Значение R используется для определения количества повторений строки; значение L указывает длину текста, который будет повторяться "R" раз. Это может быть использовано для предварительной инициализации таблиц или массивов пробелами или нулями или для любых других целей, где полезно выражать повторяющиеся данные как счетчик повторений и значение.

Таблица сжатия
Байт (ы)РазмерПолеЦенитьЦель
Если значение в байтах 20-21 этой записи TXT равно 0001
0-12рСчетчик повторов, целое число без знака больше 0Количество раз, чтобы повторить строку, начиная с байта 4.
2-32LДвоичная длина, целое число без знака больше 0Длина строки, начиная с байта 4
4-НитьСтрока длиной «L», которую необходимо повторить «R» раз.
Все остальные значения для байтов 20-21 зарезервированы

Таблица данных IDR

Поле IDR
Байт (ы)РазмерПолеЦенитьЦель
01x'00 'Зарезервированный
11ТипТип поля IDR (обратите внимание, что первичная и вторичная идентификация относятся к первому и второму идентификационным полям, соответственно, появляющимся на карте END в прежнем формате файлов объектного модуля OS / 360).
00Первичная идентификация; Старый формат IDR 1
01Вторичная идентификация; Старый формат IDR 1
02Расширенная идентификация; IDR формат 2
03Первичная идентификация; IDR формат 3
04Вторичная идентификация; IDR формат 3
2-32ДлинаДвоичное числоДлина данных IDR в виде целого числа без знака больше нуля
4+Данные IDR в соответствии с указанным форматом в байте 1 этого поля; см. соответствующий Формат IDR таблица для деталей

IDR Формат 1

Обратите внимание, что в отличие от большинства числовых значений, хранящихся в файле GOFF, значения «версия», «выпуск» и «trans_date» представляют собой числа в виде текстовых символов, а не двоичные.

Формат 1 (старый формат)
Байт (ы)РазмерПолеЦенитьЦель
0-910ПереводчикЛюбой текстЭто значение идентифицирует ассемблер или компилятор; IBM называет это "значением PID" или "значением идентификатора программы" из каталожных номеров различных программ IBM, например компилятор Cobol для OS / VS1 называется «IKFCBL00»
10-112Версиядве цифрыЭто номер версии ассемблера или компилятора от 0 до 99.
12-132Релиздве цифрыЭто часть номера версии, указанная выше, также от 0 до 99.
14-185Trans_DateГГДДД5 текстовых символов, обозначающих двухзначный год и трехзначный день года, когда этот модуль был скомпилирован или собран; Предполагается, что годы 01-65 относятся к 21 веку, а год 00 или годы старше 65 - к 20 веку, например 2000 или 1966-1999 гг. Трехзначный день начинается с 001 для 1 января; 032 на 1 февраля; 060 - 1 марта в стандартные годы и 29 февраля в високосные; и продолжается до 365 на 31 декабря в стандартные годы и 366 в високосные годы.

IDR Формат 2

Обычно компиляторы и ассемблеры не создают эту запись формата, обычно она создается связывателем.

Формат 2
Байт (ы)РазмерПолеЦенитьЦель
0-34ДатаУпакованная десятичная форма ГГГГДДДФМодуль даты был собран или скомпилирован, с указанием года и дня года
4-52Data_LengthДвоичное значениеФактическая длина следующего поля, беззнаковое ненулевое значение
6-8580IDR_DataФормат этих данных не разглашается.

IDR Формат 3

Весь текст в этом элементе является символьным; двоичная информация не используется.

Формат 3
Байт (ы)РазмерПолеЦенитьЦель
0-910ПереводчикЛюбое текстовое значение, которое автор компилятора / ассемблера хочет использовать для идентификации (см. Поле Переводчик в старом IDR Формат 1 над)
10-112ВерсияОт 00 до 99Номер версии ассемблера или компилятора
12-132РелизОт 00 до 99Номер выпуска указанной выше версии
14=207Compile_DateГГГГДДДГод и день года, когда программа была скомпилирована или собрана (это будет тот же формат, что и поле 'Trans Date' из IDR Формат 1 выше, за исключением того, что год - это полный год из четырех цифр).
21-299Compile_TimeЧЧММСТТТЧасы, минуты, секунды и тысячные доли секунды, когда программа была скомпилирована или собрана.

RLD

Записи RLD позволяют модулю показать, где он ссылается на адрес, который необходимо переместить, например, ссылки на определенные места в себе или на внешние модули.

Каталог переезда
Байт (ы)РазмерПолеЦенитьЦель
0-23PTVX'032000 'Запись не продолжается
X'032100 'Запись продолжается на следующей записи
31Зарезервированный
4-52ДлинаДвоичное числоРазмер данных о перемещении; беззнаковый и должен быть больше нуля
6-Relocation_DataДанные о переезде; видеть Данные о переезде стол
REMОтсутствует в записях переменной длины; остаток записи, где запись длиннее данных, должен быть заполнен нулями

Данные о переезде

Элемент данных о перемещении
Байт (ы)РазмерПолеЦенитьЦель
0-56ФлагиФлаги относительно этой записи; видеть Флаги таблица значений
6-72Зарезервированный
8-114R_PointerESDID модуля (типа ED или ER) для использования в качестве цели для перемещенияЭто «удаленный» адрес в том же или другом модуле, который необходимо разрешить программе. Это поле опускается, если бит 0 байта 0 Флаги поле равно 1.
12-15[A]4P_PointerESDID модуля, которому требуется переместить адресЭто модуль, который хочет, чтобы его ссылка на удаленный идентификатор была изменена на правильное значение. Это поле опускается, если бит 1 байта 0 Флаги поле равно 1.
16-19[B]4КомпенсироватьМестоположение в модуле, указанном P_Pointer, где должен быть найден адрес для настройки.Это адрес, который нужно переместить. Это поле опускается, если бит 2 байта 0 Флаги поле равно 1.
20-23[C]4Зарезервированный
24-27[C]4Зарезервированный

[A] Если R_Pointer опущен (бит 0 байта 0 Флаги 1) это поле начинается на 4 байта ниже, в байтах 8-11.
[B] Если R_Pointer или же P_Pointer (бит 1 байта 0 из Флаги поле 1) опускается, это поле начинается на 4 байта ниже. Если обе поля опущены, это поле начинается на 8 байтов ниже.
[C] Если R_Pointer, P_Pointer, или же Смещение (бит 2 байта 0 Флаги поле 1) опускаются, это поле начинается на 4 байта ниже. Если любые два из них не указаны, это поле начинается на 8 байтов ниже. Если все из них опущены, это поле начинается на 12 байтов ниже.

Чтобы уточнить, если модуль в программе C с именем «Basura» должен был вызвать функцию «exit» для завершения самого себя, адрес R_Pointer будет ESDID процедуры «exit», а P_Pointer будет ESDID «Басура». Если бы адрес находился в одном модуле (например, внутренние подпрограммы или ссылка на данные в одном модуле), R_Pointer и P_Pointer были бы одинаковыми.

Флаги

Флаги позиций RLD
Байт (ы)РазмерПолеБитыЦель
01Same_R_ID01 Если значение R_Pointer для этой записи такое же, как у предыдущего элемента в этой записи; в таком случае значение R_Pointer не указывается в этой записи.
Same_P_ID11 Если значение P_Pointer для этой записи такое же, как и для предыдущего элемента в этой записи; в таком случае значение P_Pointer не указывается в этой записи.
Same_Offset21 Если значение смещения для этой записи такое же, как и для предыдущего элемента в этой записи; если да, то значение смещения в этой записи не указывается.
3-4Зарезервированный
5Зарезервированный
Offset_length60 для обозначения длины 4 байта
Чувствительность режима адресации70 Нет чувствительности
1 Установите старшие биты адреса в те же значения, что и для режима адресации в режиме R адреса R_Pointer (применимо только к адресам V-типа)
11R_Pointer_Indicators0-3Тип данных второго операнда адреса перемещения
0 - R-адрес
1 - Смещение от начала R-адреса
2 - длина R (0 для элементов LD)
6 - Относительно немедленно (чтобы инструкции могли обращаться к внешним символам)
7 - Константа R (неразделенная область данных)
9 - 20-битный длинный адрес смещения
Все остальные значения зарезервированы
4-7Тип элемента, относящийся к значению, которое необходимо переместить.
0 - метка, R-ID ограничен LD
1 - Элемент, R-ID ограничен ED
2 - класс, R-ID ограничен ED; Классы не имеют внешних имен, поэтому у них нет ESDID.
3 - Часть, R-ID ограничен PR
Все остальные значения зарезервированы
21Действие_или_Операция0-6Тип операции для использования со вторым операндом (первый операнд будет 0) результат - 32-битное значение со знаком, которое заменяет первый операнд
0 - добавить второй операнд к первому
1 - вычесть второй операнд из первого
Все остальные значения зарезервированы
Исправление Target Fetch / Store7Указывает, следует ли использовать или игнорировать целевое значение
0 - использовать поле исправления / цели в качестве первого операнда
1 - игнорировать значение целевого поля, использовать исправленное значение в качестве первого операнда; если нет значения исправления, используйте 0
31Зарезервированный
41Целевая длинаБеззнаковая длина целевого поля в байтах
51Зарезервированный

LEN

Записи LEN используются для объявления длины модуля, если она не была известна на момент создания записи ESD, например для однопроходных компиляторов.

ПолеКомпенсироватьРазмерОписание
PTV0-23Тип записи X'033000 '
3-53Зарезервированный
Длина6-72Длина элементов, следующих за этим полем; значение не должно быть нулевым
Элементы8-Данные о длине элемента; видеть Элементы Таблица ниже
REMЗавершающие данные до конца записи для записей фиксированной длины должны содержать двоичные нули; отсутствует для записей переменной длины.

Элементы

Запись элемента с отложенной длиной не может быть продолжена или разделена

ПолеКомпенсироватьРазмерОписание
ESDID0-34ESDID элемента, к которому относится это значение
4-74Зарезервированный
Длина8-114Длина указанного элемента

КОНЕЦ

END должен быть последней записью для модуля. «Точка входа» используется, когда адрес, отличный от начала модуля, должен использоваться в качестве начальной точки для его выполнения. Это используется либо потому, что в программе есть неисполняемые данные, появляющиеся перед запуском модуля (очень часто для старых программистов на ассемблере, поскольку старые версии ассемблера намного медленнее собирали данные, хранящиеся в программах после указания инструкций), либо потому, что модуль сначала вызывает внешний модуль, например библиотеку времени выполнения, для инициализации.

ПолеКомпенсироватьРазмерБитыОписание
PTV0-23X'034000 '- Продолжение не было
X'034100 '- Продолжение следующей записи
30-56Зарезервированный
Флаги6-72Заявления о наличии или отсутствии точки входа
00 - точка входа не указана; все остальные значения в этой записи недействительны
01 - точка входа, заданная ESDID
10 - точка входа, указанная по имени
11 - Зарезервировано
AMODE41Значение режима адресации точки входа; значения указаны в поле 0 Атрибуты поведения стол в ESD записывать.
5-73Зарезервированный
Количество записей8-114Количество записей GOFF в этом модуле (это количество «логических» записей, т.е. без учета продолжений)
ESDID12-154Значение ESDID, если на точку входа ссылается ESDID; двоичный ноль при ссылке по имени
16-194Зарезервированный
Компенсировать20-234Смещение адреса точки входа модуля; это не может быть указано для внешней (ER) точки входа
Имя Длина24-252Длина имени, она должна быть равна нулю, если точка входа была указана в ESDID.
Имя26-Имя внешнего символа, используемого в качестве точки входа для этого модуля; двоичные нули, если точка входа была указана в ESDID; если эта запись будет продолжена, это начальные 54 символа имени. Это единственное недвоичное значение в записи; это будет текстовое поле, представляющее публичное имя для точки входа
REMТрейлер до конца записи; должны быть двоичными нулями до конца записи для записей фиксированной длины; опущено для переменной длины

Продолжение

Если имя точки входа, указанное в записи END фиксированной длины, длиннее 54 байтов или (если сама эта запись также является продолжением) длиннее дополнительных 77 байтов), используется следующая запись продолжения.

ПолеКомпенсироватьРазмерОписание
PTV0-23X'034200 '- Продолжение этой записи не продолжается
X'034300 '- Сама эта запись продолжения продолжается на следующей записи
Имя3-Оставшаяся часть имени точки входа, если эта запись не продолжается, и в этом случае это следующие 77 символов имени.
REMЕсли эта запись не продолжается, это конечная часть записи для записей фиксированной длины и должна быть двоичными нулями; отсутствует для записей переменной длины

Рекомендации

  1. ^ Джон Р. Эрман (1 марта 2001 г.). «Как работает редактор связей: учебное пособие по модулям объектов / загрузки, редакторам ссылок, загрузчикам и тому, что они делают для вас (и для вас)» (PDF). Лаборатория IBM в Силиконовой долине (Санта-Тереза), Сан-Хосе. Получено 8 сентября, 2019.
  2. ^ Управление программами OS / MVS: расширенные возможности (PDF) (восьмое изд.). Покипси, Нью-Йорк: IBM. Сентябрь 2007. SA22-7644-07.. Получено 9 августа, 2013.
  3. ^ IBM High Level Assembler for MVS & VM & VSE Release 2 Руководство по презентации (PDF). Декабрь 1995 г. SG24-3910-01. Архивировано из оригинал (PDF) на 2016-01-23. Получено 13 ноября, 2015.
  4. ^ Ассемблер высокого уровня для z / OS & z / VM & z / VSE Programmer's Guide (PDF) (шестое изд.). Сан-Хосе, Калифорния: IBM. Июль 2008 г. Приложение C. SC26-4941-05. Получено 8 сентября, 2019.
  5. ^ «РЛД». www.ibm.com. IBM. Получено 10 июля 2020.