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.
Байт | Биты | Ценить | Цель |
---|---|---|---|
0 | Все | 03 | Указывает на начало записи GOFF |
1 | 0-3 | 0 | Запись ESD (внешний символ) |
1 | Запись TXT (текст) | ||
2 | Запись RLD (Relocation) | ||
3 | LEN (длина) запись | ||
4 | КОНЕЦ (Конец) записи | ||
X'5'-X'E ' | Зарезервированный | ||
X'F ' | Запись HDR (заголовок) | ||
4-5 | Зарезервированный | ||
6-7 | 00 | Первоначальная запись, которая не продолжается на следующей записи. Это должно быть единственное значение, используемое для записей GOFF переменной длины. | |
01 | Первоначальная запись, которая продолжается на следующей записи | ||
10 | Продолжение записи не продолжается на следующей записи | ||
11 | Продолжение записи, которое продолжается на следующей записи | ||
2 | Все | 00 | Версия Номер формата объектного файла. Все значения, кроме X'00 ', зарезервированы |
HDR
Запись HDR обязательна и должна быть первой записью.
Байт (ы) | Размер | Поле | Ценить | Цель |
---|---|---|---|---|
0-2 | 3 | PTV | X'03F000 ' | Только допустимое значение; Запись HDR в настоящее время не может быть продолжена |
3-47 | 45 | 0 | Зарезервированный | |
48-51 | 4 | Уровень архитектуры | Двоичный 0 или 1 | Уровень архитектуры GOFF; все значения кроме 0 и 1 зарезервированы |
52-53 | 2 | Размер свойств модуля | двоичный | Длина поля свойств модуля |
54-59 | 6 | 0 | Зарезервированный | |
60- | 0+ | Свойства модуля | Список свойств модуля (необязательно) |
ESD
Запись ESD дает публичное имя для модуля, основной программы, подпрограммы, процедуры, функции, свойства или метода в объекте, Fortran Common или альтернативной точке входа. Запись ESD для публичного имени должна присутствовать в файле до того, как какая-либо ссылка на это имя будет сделана какой-либо другой записью.
Байт (ы) | Размер | Поле | Значение (или биты) | Цель | |
---|---|---|---|---|---|
0-2 | 3 | PTV | X'030000 ' | Запись ESD без продолжений | |
X'030100 ' | Запись ESD, которая продолжается на следующей записи | ||||
3 | 1 | Тип символа | 00 | SD - Определение раздела; Это используется для прежних значений SD, CM (Common) и PC (Private Code, SD с пустым именем). Значение ESDID «Родитель» должно быть 0. Оно используется для определения основной программы, подпрограммы или функции, код которой является частью этого файла. Также используется для Fortran Common. | |
01 | ЭД - Внешнее определение. «Родительский» ESDID должен быть ненулевым и быть значением записи SD, которая ссылается на этот внешний символ. Если значение RLD относится к классу, к которому принадлежит эта запись, класс, к которому относится этот элемент, должен быть указан в поле External Name. Это используется для наименования вызываемой процедуры или функции. | ||||
02 | LD - определение метки. «Родительский» ESDID должен быть ненулевым и быть значением записи SD, которая определяет этот символ внутри себя. Это можно использовать для создания псевдонима для модуля или для раскрытия его части как отдельной процедуры. Например, библиотека времени выполнения для определенного языка программирования может иметь определенные функции, которые она должна использовать сама, но которые полезны для программ, написанных с использованием этого языка, и поэтому функции можно присвоить метку, чтобы ее можно было вызывать напрямую. Например, может существовать полный математический пакет в виде единого модуля, и все стандартные функции (синус, косинус, квадратный корень и т. Д.) Могут быть названы точками входа в этом модуле. | ||||
03 | PR - Ссылка на деталь или псевдо-регистр. Отличается полем ID пространства имен. «Родительский» ESDID должен быть ненулевым и быть значением записи SD, которая определяет этот символ внутри себя. | ||||
04 | ER и WX - внешняя ссылка / слабая внешняя ссылка. Различаются значением «Сила привязки» в поле «Атрибуты». WX используется там, где может отсутствовать внешняя процедура. Например, если у программы калькулятора был быстрый и высокопроизводительный математический пакет, который был необязательным, его можно было назвать WX, а если он отсутствовал или недоступен, программа могла перейти на более раннюю версию математического пакета. | ||||
4-7 | 4 | ESDID | Двоичный | Идентификатор ESDID, начинающийся с 1. Каждый новый ESDID должен быть ровно на 1 выше, чем предыдущая запись. | |
8-11 | 4 | Родительский ESDID | двоичный | Это ESDID объекта, определяющего эту запись, если он является частью другого объекта. Это 0, если у него нет родителя. | |
12-15 | 4 | 0 | Зарезервированный | ||
16-19 | 4 | Компенсировать | Двоичный | Адрес этого символа в его родительском ESDID для записей LD или ED; ноль в противном случае. | |
20-23 | 4 | 0 | Зарезервированный | ||
24-27 | 4 | Длина | Двоичный | Длина этого пункта для типов ЭД и ПР; ноль в противном случае. Если фактическое значение длины отложено; это значение установлено на -1. | |
28-31 | 4 | Расширенный атрибут ESDID | Двоичный | ESDID элемента, который содержит расширенную атрибутивную информацию для типов ED и LD; обычно используется там, где библиотеки DLL поддерживаются для символов, которые разрешаются во время выполнения (например, виртуальные методы). В противном случае - ноль. | |
32-35 | 4 | Расширенное смещение атрибута | Двоичный | Адрес, по которому можно найти расширенные атрибуты для предыдущего поля, используется для записей ED и LD, имеющих расширенные атрибуты; ноль в противном случае. | |
36-39 | 4 | 0 | Зарезервированный | ||
40 | 1 | ID пространства имен | Определяет пространство имен, которому принадлежит | ||
0 | Зарезервировано для подшивки управления программами | ||||
1 | Нормальное имя | ||||
2 | Псевдо Регистр | ||||
3 | Части (выделенное пространство для внешних записей, включая элементы, содержащие инициализированные статические данные) | ||||
41 | 1 | Флаги | |||
Заполнить настоящее | Бит 0 | 0 | Без заливки | ||
1 | Заполнить байт присутствует (только для типов ED) | ||||
Искалеченный | Бит 1 | 0 | Символ не искажен | ||
1 | Символ может быть поврежден | ||||
Переименовываемый | Бит 2 | 0 | Не может быть переименован (то же, что и флаг mapped в XOBJ) | ||
1 | Символ может быть переименован (может участвовать в переименовании типа Language Environment (LE)) | ||||
Съемный класс | Бит 3 | 0 | (По умолчанию) Не снимается | ||
1 | Этот класс можно при желании удалить, не влияя на работу программы (действительно только для типов ED) | ||||
Биты 4-6 | Зарезервированный | ||||
Зарезервировать дополнительное пространство | Бит 7 | 0 | Дополнительного места не зарезервировано | ||
1 | Зарезервируйте 16 байтов места в начале класса (только для типа ED класса MRG) | ||||
42 | 1 | Заполните значение | Значение байта заполнения, если установлен флаг Fill Present | ||
43 | 1 | 0 | Зарезервированный | ||
44-47 | 4 | Связанные данные | Двоичный | Используется для идентификатора среды или статической области для элементов LD с использованием XLINK | |
48-51 | 4 | Приоритет | Двоичный | Порядок сортировки PR-позиций | |
52-59 | 8 | 0 | Зарезервированный | ||
60-69 | 10 | Поведенческие атрибуты | Атрибуты поведения для этого элемента (см. Таблица атрибутов поведения ниже) | ||
70-71 | 2 | Имя Длина | Двоичный | Длина названия этого элемента; не может быть нулевым | |
72- | Имя | Текст | Название этого элемента с обрезанными пробелами в конце. Должен быть хотя бы один символ; Приватный код состоит из одного пробела. Имя чувствительно к регистру. | ||
REM | 0 | Трейлер: неиспользуемое пространство, если необходимо для записей фиксированного размера; должно быть заполнено нулями. Не требуется в записях переменной длины. |
Продолжение
В случае записей фиксированной длины, где для имени требуются записи продолжения, используется следующее:
Байт (ы) | Размер | Поле | Ценить | Цель | |
---|---|---|---|---|---|
0-2 | 3 | PTV | X'030200 ' | Запись продолжения ESD без дальнейших продолжений | |
X'030300 ' | Запись продолжения ESD, которая будет продолжена на следующей записи | ||||
3- | Имя | Текст | Остальная часть имени, если эта запись не продолжается, или следующие 77 байтов имени, если продолжение. | ||
REM | 0 | Остаток для записи фиксированной длины длиннее, чем предоставленные данные. Он содержит завершающие байты, если это последняя запись для этого имени и имя короче, чем размер записи; должно быть 0 заполнено. Это поле отсутствует в записях переменной длины. |
Атрибуты поведения
Компенсировать | Размер (байты) | Биты | Поле | Ценить | Цель | |||||
---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Адресация свойств | Режим адресации, связанный с этим внешним символом. Эти значения также используются AMODE поле КОНЕЦ записывать. | |||||||
00 | AMODE не указан (по умолчанию AMODE (24)) | |||||||||
01 | AMODE (24) | |||||||||
02 | AMODE (31) | |||||||||
03 | AMODE (ЛЮБОЙ) (24 или 31) | |||||||||
04 | AMODE (64) | |||||||||
10 | AMODE (MIN) (используйте наименьший AMODE, используемый всеми модулями) | |||||||||
1 | 1 | Недвижимость в резиденции | Связанный режим проживания внешнего символа | |||||||
00 | RMODE не указан (по умолчанию RMODE (24)) | |||||||||
01 | RMODE (24) | |||||||||
03 | RMODE (31) (эквивалент RMODE (ANY)) | |||||||||
04 | RMODE (64) | |||||||||
2 | 1 | 0-3 (4) | Стиль записи текста | Стиль текста для этого класса (только для типов ED и PR) Весь текст должен быть в одном стиле. | ||||||
0000 | Байт-ориентированный | |||||||||
0001 | Структурированные данные (ориентированные на подшивку) | |||||||||
0010 | Структурированные данные (определяются пользователем) | |||||||||
4-7 (4) | Алгоритм привязки | Метод привязки данных | ||||||||
0000 | Объедините все элементы один за другим | |||||||||
0001 | Слияние (все элементы с одинаковыми именами будут расположены в одном пространстве, с использованием максимального указанного размера и наиболее строгого выравнивания). Элементы с разными именами будут объединены. Это обычная практика для типов CM и PR. | |||||||||
3 | 1 | 0-2 (3) | Поведение при выполнении задач | Индикация того, является ли модуль реентерабельным и / или многоразовым | ||||||
000 | Неопределенные | |||||||||
001 | Ни для повторного использования, ни для повторного использования (НЕ ПОВТОРНО) | |||||||||
010 | Последовательно многоразовые (REUS) | |||||||||
011 | Reentrant (RENT), также подразумевает (REUS) | |||||||||
3 | 0 | Зарезервированный | ||||||||
4 | Только чтение | 0 | Не только для чтения | |||||||
1 | Только чтение | |||||||||
5-7 (3) | Исполняемый | 000 | Не указано | |||||||
001 | Не исполняемый (только данные) | |||||||||
010 | Исполняемый файл (код или код и данные) | |||||||||
4 | 1 | 0-1 (2) | 0 | Зарезервированный | ||||||
2-3 (2) | Повторяющийся символ важности | Уровень ошибки, который должен вызывать повторяющийся символ (только записи типа PR) | ||||||||
00 | Связующее определяет серьезность | |||||||||
01 | Минимум 4 (Предупреждение) | |||||||||
10 | Минимум 8 (ошибка) | |||||||||
11 | Зарезервированный | |||||||||
4-7 (4) | Связующая сила | Слабые ссылки не будут искать другие библиотеки; Сильные ссылки будут искать символ в других библиотеках. Строгие определения можно разрешить по любой ссылке; это значение по умолчанию. | ||||||||
0000 | Сильный | |||||||||
0001 | Слабый | |||||||||
5 | 1 | 0-1 (2) | Поведение при загрузке класса | Определяет, будут ли загружаться элементы класса в случае использования запроса LOAD операционной системы в отношении объекта. | ||||||
00 | ЗАГРУЗИТЬ - Загрузить этот класс | |||||||||
01 | ОТЛОЖЕННАЯ ЗАГРУЗКА - этот класс, вероятно, будет использоваться и должен быть загружен | |||||||||
10 | NOLOAD - не загружать этот класс | |||||||||
11 | Зарезервированный | |||||||||
2 | Общий флаг | Если 1, трактуется как "старый" ОБЩИЙ CM-типа, когда несколько ссылок устанавливают размер на самую большую область, используемую любой ссылкой. Тип SD с тем же именем сохранит размер и текст. Единственный поддерживаемый тип текста - B_TEXT. | ||||||||
3 | Прямая и косвенная ссылка | 0 | Прямые ссылки (для целей Переплета) | |||||||
1 | Для типа PR это дескриптор связи; для типа ER это ссылка на дескриптор связи XPLINK | |||||||||
4-7 (4) | Область привязки | 0000 | Неопределенные | |||||||
0001 | Объем раздела («местный») | |||||||||
0010 | Область действия модуля («глобальная») | |||||||||
0011 | Объем библиотеки | |||||||||
0100 | Объем импорта-экспорта | |||||||||
6 | 1 | 0-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-9 | 3 | Зарезервированный |
Записи 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.
Тип | Описание |
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 определяют инструкции и данные машинного кода, которые должны быть размещены в определенном месте адреса в модуле. Обратите внимание, что везде, где должна быть указана «длина» для этой записи, значение длины должно включать любые продолжения этой записи.
Байт (ы) | Размер | Поле | Биты | Ценить | Цель | |
---|---|---|---|---|---|---|
0-2 | 3 | PTV | X'031000 ' | Запись TXT без продолжений | ||
X'031100 ' | Запись TXT, которая продолжается на следующей записи | |||||
3 | 1 | 0-3 (4) | Зарезервированный | |||
Стиль | 4-7 (4) | Все остальные значения зарезервированы | ||||
0000 | Байтовые данные | |||||
0001 | Структурированные данные (в настоящее время поддерживаются только 19-байтовые поля IDR; см. Таблица данных IDR) | |||||
0010 | Неструктурированные данные | |||||
4-7 | 4 | Элемент ESDID | Двоичное число | ESDID, которому принадлежит содержимое этой записи | ||
8-11 | 4 | Зарезервированный | ||||
12-15 | 4 | Компенсировать | Двоичный адрес | Адрес в ESDID, где должны быть размещены эти данные. Это должно быть 0 для структурированных и неструктурированных данных. | ||
16-19 | 4 | Истинная длина текстового поля | двоичное значение: 0 или полный размер после раскрытия | Если поле Text Encoding равно 0, это должно быть 0. В противном случае это поле представляет собой полный размер текста после распаковки или распаковки. | ||
20-21 | 2 | Кодировка текста | двоичное значение | 0, если текст не требует тиражирования, распаковки или декодирования; ненулевое значение, чтобы указать, что текст должен быть декодирован, распакован или расширен; видеть Таблица сжатия | ||
22-23 | 2 | Длина данных | двоичное значение больше нуля | Общая длина данных в этой записи в байтах как беззнаковое значение и не может быть нулем. | ||
24- | Данные | Машинный код и / или данные, которые нужно вставить. Если включены данные IDR, на них распространяются особые правила и требования, см. Таблица данных IDR | ||||
REM | Отсутствует для записей переменной длины; оставшиеся байты для фиксированной записи длиннее оставшихся данных и должны быть двоичными нулями |
Продолжение
Байт (ы) | Размер | Поле | Биты | Ценить | Цель | |
---|---|---|---|---|---|---|
0-2 | 3 | PTV | X'031200 ' | Продолжение Запись без дальнейших продолжений | ||
X'031300 ' | Продолжение Запись, которая продолжается на следующей записи | |||||
3- | Данные продолжаются с предыдущей записи | |||||
REM | Если остаток записи длиннее данных; ноль заполнен |
Таблица сжатия
Таблица сжатия используется, если байты 20-21 записи TXT отличны от нуля. Значение R используется для определения количества повторений строки; значение L указывает длину текста, который будет повторяться "R" раз. Это может быть использовано для предварительной инициализации таблиц или массивов пробелами или нулями или для любых других целей, где полезно выражать повторяющиеся данные как счетчик повторений и значение.
Байт (ы) | Размер | Поле | Ценить | Цель | |
---|---|---|---|---|---|
Если значение в байтах 20-21 этой записи TXT равно 0001 | |||||
0-1 | 2 | р | Счетчик повторов, целое число без знака больше 0 | Количество раз, чтобы повторить строку, начиная с байта 4. | |
2-3 | 2 | L | Двоичная длина, целое число без знака больше 0 | Длина строки, начиная с байта 4 | |
4- | Нить | Строка длиной «L», которую необходимо повторить «R» раз. | |||
Все остальные значения для байтов 20-21 зарезервированы |
Таблица данных IDR
Байт (ы) | Размер | Поле | Ценить | Цель | |
---|---|---|---|---|---|
0 | 1 | x'00 ' | Зарезервированный | ||
1 | 1 | Тип | Тип поля IDR (обратите внимание, что первичная и вторичная идентификация относятся к первому и второму идентификационным полям, соответственно, появляющимся на карте END в прежнем формате файлов объектного модуля OS / 360). | ||
00 | Первичная идентификация; Старый формат IDR 1 | ||||
01 | Вторичная идентификация; Старый формат IDR 1 | ||||
02 | Расширенная идентификация; IDR формат 2 | ||||
03 | Первичная идентификация; IDR формат 3 | ||||
04 | Вторичная идентификация; IDR формат 3 | ||||
2-3 | 2 | Длина | Двоичное число | Длина данных IDR в виде целого числа без знака больше нуля | |
4+ | Данные IDR в соответствии с указанным форматом в байте 1 этого поля; см. соответствующий Формат IDR таблица для деталей |
IDR Формат 1
Обратите внимание, что в отличие от большинства числовых значений, хранящихся в файле GOFF, значения «версия», «выпуск» и «trans_date» представляют собой числа в виде текстовых символов, а не двоичные.
Байт (ы) | Размер | Поле | Ценить | Цель |
---|---|---|---|---|
0-9 | 10 | Переводчик | Любой текст | Это значение идентифицирует ассемблер или компилятор; IBM называет это "значением PID" или "значением идентификатора программы" из каталожных номеров различных программ IBM, например компилятор Cobol для OS / VS1 называется «IKFCBL00» |
10-11 | 2 | Версия | две цифры | Это номер версии ассемблера или компилятора от 0 до 99. |
12-13 | 2 | Релиз | две цифры | Это часть номера версии, указанная выше, также от 0 до 99. |
14-18 | 5 | Trans_Date | ГГДДД | 5 текстовых символов, обозначающих двухзначный год и трехзначный день года, когда этот модуль был скомпилирован или собран; Предполагается, что годы 01-65 относятся к 21 веку, а год 00 или годы старше 65 - к 20 веку, например 2000 или 1966-1999 гг. Трехзначный день начинается с 001 для 1 января; 032 на 1 февраля; 060 - 1 марта в стандартные годы и 29 февраля в високосные; и продолжается до 365 на 31 декабря в стандартные годы и 366 в високосные годы. |
IDR Формат 2
Обычно компиляторы и ассемблеры не создают эту запись формата, обычно она создается связывателем.
Байт (ы) | Размер | Поле | Ценить | Цель |
---|---|---|---|---|
0-3 | 4 | Дата | Упакованная десятичная форма ГГГГДДДФ | Модуль даты был собран или скомпилирован, с указанием года и дня года |
4-5 | 2 | Data_Length | Двоичное значение | Фактическая длина следующего поля, беззнаковое ненулевое значение |
6-85 | 80 | IDR_Data | Формат этих данных не разглашается. |
IDR Формат 3
Весь текст в этом элементе является символьным; двоичная информация не используется.
Байт (ы) | Размер | Поле | Ценить | Цель |
---|---|---|---|---|
0-9 | 10 | Переводчик | Любое текстовое значение, которое автор компилятора / ассемблера хочет использовать для идентификации (см. Поле Переводчик в старом IDR Формат 1 над) | |
10-11 | 2 | Версия | От 00 до 99 | Номер версии ассемблера или компилятора |
12-13 | 2 | Релиз | От 00 до 99 | Номер выпуска указанной выше версии |
14=20 | 7 | Compile_Date | ГГГГДДД | Год и день года, когда программа была скомпилирована или собрана (это будет тот же формат, что и поле 'Trans Date' из IDR Формат 1 выше, за исключением того, что год - это полный год из четырех цифр). |
21-29 | 9 | Compile_Time | ЧЧММСТТТ | Часы, минуты, секунды и тысячные доли секунды, когда программа была скомпилирована или собрана. |
RLD
Записи RLD позволяют модулю показать, где он ссылается на адрес, который необходимо переместить, например, ссылки на определенные места в себе или на внешние модули.
Байт (ы) | Размер | Поле | Ценить | Цель |
---|---|---|---|---|
0-2 | 3 | PTV | X'032000 ' | Запись не продолжается |
X'032100 ' | Запись продолжается на следующей записи | |||
3 | 1 | Зарезервированный | ||
4-5 | 2 | Длина | Двоичное число | Размер данных о перемещении; беззнаковый и должен быть больше нуля |
6- | Relocation_Data | Данные о переезде; видеть Данные о переезде стол | ||
REM | Отсутствует в записях переменной длины; остаток записи, где запись длиннее данных, должен быть заполнен нулями |
Данные о переезде
Байт (ы) | Размер | Поле | Ценить | Цель |
---|---|---|---|---|
0-5 | 6 | Флаги | Флаги относительно этой записи; видеть Флаги таблица значений | |
6-7 | 2 | Зарезервированный | ||
8-11 | 4 | R_Pointer | ESDID модуля (типа ED или ER) для использования в качестве цели для перемещения | Это «удаленный» адрес в том же или другом модуле, который необходимо разрешить программе. Это поле опускается, если бит 0 байта 0 Флаги поле равно 1. |
12-15[A] | 4 | P_Pointer | ESDID модуля, которому требуется переместить адрес | Это модуль, который хочет, чтобы его ссылка на удаленный идентификатор была изменена на правильное значение. Это поле опускается, если бит 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 были бы одинаковыми.
Флаги
Байт (ы) | Размер | Поле | Биты | Цель |
---|---|---|---|---|
0 | 1 | Same_R_ID | 0 | 1 Если значение R_Pointer для этой записи такое же, как у предыдущего элемента в этой записи; в таком случае значение R_Pointer не указывается в этой записи. |
Same_P_ID | 1 | 1 Если значение P_Pointer для этой записи такое же, как и для предыдущего элемента в этой записи; в таком случае значение P_Pointer не указывается в этой записи. | ||
Same_Offset | 2 | 1 Если значение смещения для этой записи такое же, как и для предыдущего элемента в этой записи; если да, то значение смещения в этой записи не указывается. | ||
3-4 | Зарезервированный | |||
5 | Зарезервированный | |||
Offset_length | 6 | 0 для обозначения длины 4 байта | ||
Чувствительность режима адресации | 7 | 0 Нет чувствительности | ||
1 Установите старшие биты адреса в те же значения, что и для режима адресации в режиме R адреса R_Pointer (применимо только к адресам V-типа) | ||||
1 | 1 | R_Pointer_Indicators | 0-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 | ||||
Все остальные значения зарезервированы | ||||
2 | 1 | Действие_или_Операция | 0-6 | Тип операции для использования со вторым операндом (первый операнд будет 0) результат - 32-битное значение со знаком, которое заменяет первый операнд |
0 - добавить второй операнд к первому | ||||
1 - вычесть второй операнд из первого | ||||
Все остальные значения зарезервированы | ||||
Исправление Target Fetch / Store | 7 | Указывает, следует ли использовать или игнорировать целевое значение | ||
0 - использовать поле исправления / цели в качестве первого операнда | ||||
1 - игнорировать значение целевого поля, использовать исправленное значение в качестве первого операнда; если нет значения исправления, используйте 0 | ||||
3 | 1 | Зарезервированный | ||
4 | 1 | Целевая длина | Беззнаковая длина целевого поля в байтах | |
5 | 1 | Зарезервированный |
LEN
Записи LEN используются для объявления длины модуля, если она не была известна на момент создания записи ESD, например для однопроходных компиляторов.
Поле | Компенсировать | Размер | Описание |
PTV | 0-2 | 3 | Тип записи X'033000 ' |
3-5 | 3 | Зарезервированный | |
Длина | 6-7 | 2 | Длина элементов, следующих за этим полем; значение не должно быть нулевым |
Элементы | 8- | Данные о длине элемента; видеть Элементы Таблица ниже | |
REM | Завершающие данные до конца записи для записей фиксированной длины должны содержать двоичные нули; отсутствует для записей переменной длины. |
Элементы
Запись элемента с отложенной длиной не может быть продолжена или разделена
Поле | Компенсировать | Размер | Описание |
ESDID | 0-3 | 4 | ESDID элемента, к которому относится это значение |
4-7 | 4 | Зарезервированный | |
Длина | 8-11 | 4 | Длина указанного элемента |
КОНЕЦ
END должен быть последней записью для модуля. «Точка входа» используется, когда адрес, отличный от начала модуля, должен использоваться в качестве начальной точки для его выполнения. Это используется либо потому, что в программе есть неисполняемые данные, появляющиеся перед запуском модуля (очень часто для старых программистов на ассемблере, поскольку старые версии ассемблера намного медленнее собирали данные, хранящиеся в программах после указания инструкций), либо потому, что модуль сначала вызывает внешний модуль, например библиотеку времени выполнения, для инициализации.
Поле | Компенсировать | Размер | Биты | Описание |
PTV | 0-2 | 3 | X'034000 '- Продолжение не было | |
X'034100 '- Продолжение следующей записи | ||||
3 | 0-5 | 6 | Зарезервированный | |
Флаги | 6-7 | 2 | Заявления о наличии или отсутствии точки входа | |
00 - точка входа не указана; все остальные значения в этой записи недействительны | ||||
01 - точка входа, заданная ESDID | ||||
10 - точка входа, указанная по имени | ||||
11 - Зарезервировано | ||||
AMODE | 4 | 1 | Значение режима адресации точки входа; значения указаны в поле 0 Атрибуты поведения стол в ESD записывать. | |
5-7 | 3 | Зарезервированный | ||
Количество записей | 8-11 | 4 | Количество записей GOFF в этом модуле (это количество «логических» записей, т.е. без учета продолжений) | |
ESDID | 12-15 | 4 | Значение ESDID, если на точку входа ссылается ESDID; двоичный ноль при ссылке по имени | |
16-19 | 4 | Зарезервированный | ||
Компенсировать | 20-23 | 4 | Смещение адреса точки входа модуля; это не может быть указано для внешней (ER) точки входа | |
Имя Длина | 24-25 | 2 | Длина имени, она должна быть равна нулю, если точка входа была указана в ESDID. | |
Имя | 26- | Имя внешнего символа, используемого в качестве точки входа для этого модуля; двоичные нули, если точка входа была указана в ESDID; если эта запись будет продолжена, это начальные 54 символа имени. Это единственное недвоичное значение в записи; это будет текстовое поле, представляющее публичное имя для точки входа | ||
REM | Трейлер до конца записи; должны быть двоичными нулями до конца записи для записей фиксированной длины; опущено для переменной длины |
Продолжение
Если имя точки входа, указанное в записи END фиксированной длины, длиннее 54 байтов или (если сама эта запись также является продолжением) длиннее дополнительных 77 байтов), используется следующая запись продолжения.
Поле | Компенсировать | Размер | Описание |
PTV | 0-2 | 3 | X'034200 '- Продолжение этой записи не продолжается |
X'034300 '- Сама эта запись продолжения продолжается на следующей записи | |||
Имя | 3- | Оставшаяся часть имени точки входа, если эта запись не продолжается, и в этом случае это следующие 77 символов имени. | |
REM | Если эта запись не продолжается, это конечная часть записи для записей фиксированной длины и должна быть двоичными нулями; отсутствует для записей переменной длины |
Рекомендации
- ^ Джон Р. Эрман (1 марта 2001 г.). «Как работает редактор связей: учебное пособие по модулям объектов / загрузки, редакторам ссылок, загрузчикам и тому, что они делают для вас (и для вас)» (PDF). Лаборатория IBM в Силиконовой долине (Санта-Тереза), Сан-Хосе. Получено 8 сентября, 2019.
- ^ Управление программами OS / MVS: расширенные возможности (PDF) (восьмое изд.). Покипси, Нью-Йорк: IBM. Сентябрь 2007. SA22-7644-07.. Получено 9 августа, 2013.
- ^ IBM High Level Assembler for MVS & VM & VSE Release 2 Руководство по презентации (PDF). Декабрь 1995 г. SG24-3910-01. Архивировано из оригинал (PDF) на 2016-01-23. Получено 13 ноября, 2015.
- ^ Ассемблер высокого уровня для z / OS & z / VM & z / VSE Programmer's Guide (PDF) (шестое изд.). Сан-Хосе, Калифорния: IBM. Июль 2008 г. Приложение C. SC26-4941-05. Получено 8 сентября, 2019.
- ^ «РЛД». www.ibm.com. IBM. Получено 10 июля 2020.