GOFF
| Company type | File format |
|---|---|
| Industry | Computer software |
| Predecessor | IBM OS/360 Object File Format |
| Founded | 1995 |
| Products | Object file format for MVS operating system |
| Owner | IBM |
The GOFF (Generalized Object File Format) was introduced by IBM for the MVS operating system as a successor to the IBM OS/360 Object File Format, addressing the shortcomings of the earlier design.
Background
Initially developed in 1964 for the IBM System/360 mainframe, the IBM OS/360 Object File Format was also implemented by compatible platforms such as the Univac 90/60, 90/70, 90/80 and Fujitsu B2800 systems. Although enhancements were made to accommodate symbolic records and longer identifiers for procedures and functions, it lacked support for features essential to contemporary programming languages, including objects, properties, methods, Unicode, and virtual methods.
IBM created GOFF circa 1995 to resolve these limitations. Its first documented mention coincided with the release of the High Level Assembler. GOFF incorporates embedded debugging information through the Associated Data (ADATA) format but does not support legacy SYM records generated by the TEST option. While GOFF has largely replaced the OS/360 format, the original format remains in use where its limitations are acceptable.
Conventions
Within this article, "module" refers to any named entity or symbol representing code or data external to the current referencing scope. Examples include subroutines, functions, Fortran Common or Block Data segments, objects/classes, methods, properties, or any externally named routine.
The terms "assembler" (for translating assembly language into machine instructions) and "compile" (for processing high-level languages) are used interchangeably; thus, "compile"/"compiler" may substitute for "assemble"/"assembler" when appropriate.
Unless otherwise indicated as hexadecimal (base 16) using the notation X'...' with uppercase letters (e.g., X'15DEADBEEF'), numbers are expressed in decimal. A "byte" consists of 8 bits; characters typically occupy one byte in EBCDIC, whereas multi-byte encodings like Unicode require two or more bytes.
Requirements and restrictions
GOFF builds upon the OS/360 Object File Format by incorporating additional data necessary for application construction.
- GOFF files may contain fixed-length or variable-length records.
- Each record is confined within a single file system record; GOFF files do not function as streams.
- Fixed-length records measure exactly 80 bytes; variable-length records have a minimum length of 56 bytes. Any unused bytes in fixed-length records must be zero-filled.
- Software processing GOFF records should not presume knowledge of internal record structures; operating systems transparently handle fixed- or variable-length records. Record length information is external to the record itself.
- Binary data is stored in big endian order (e.g., decimal 1 appears as X'01' in 8-bit form and X'0001' in 16-bit form).
- Bit numbering proceeds from left to right, with bit 0 being the leftmost bit.
- GOFF files deployed on Unix systems require fixed-length records.
- Records may continue onto subsequent records without interruption by other record types.
- Each GOFF object file starts with an HDR record and concludes with an END record, which includes a count of GOFF records (excluding physical file system records).
- Multiple GOFF files can be generated per build by compilers or assemblers; each represents a distinct module beginning with HDR and ending with END.
- Module and Class identifiers are case sensitive; for example, "exit" in C differs from "EXIT" in Fortran.
- Several OS/360 conventions persist:
- Characters default to the EBCDIC character set except for external names.
- ESD items—including programs, subroutines, functions, and methods—are numbered sequentially starting at 1 without gaps.
- All ESD items must be defined before any subsequent references occur.
- Each ESD record contains exactly one ESD item, unlike the old format that allowed up to three per record.
- RLD records (relocation dictionaries) can include multiple items and may span multiple records.
- Reserved fields must be zeroed to ensure future compatibility.
- The character set for external names is not strictly defined but supports double-byte Unicode names for modules. Certain IBM products restrict external name characters to specified EBCDIC ranges.
- Two types of Class names exist: reserved and user-supplied (non-reserved), each limited to a maximum length of 16 characters.
- Reserved Class names begin with a letter followed by an underscore and then 1–14 additional characters. Those starting with B_ are reserved by the binder; C_ classes designated as loadable pertain to IBM's Language Environment. Unmarked classes beginning with C_, X_, Y_, Z_ are general-purpose non-reserved classes. User-defined class names may include lowercase letters.
- Class names are explicitly not considered external symbols.
During compilation, the binder refers to these classes when required:
| B_ESD | External Symbol Dictionary Class |
| B_TEXT | Text Class |
| B_RLD | Relocation Dictionary Class |
| B_SYM | Internal Symbol Table Class |
| B_IDRL | Language-Translator Identification Data Class |
| B_PRV | Pseudo-Register Class |
| B_IDRU | User-specified Identification Data Class |
The following class names are reserved by the binder and inaccessible to user programs:
| B_IDRB | Binder Data Information |
| B_IDRZ | SUPER-Zap Data Information |
| B_IMPEXP | Import-Export Table |
| B_LIT | Loading Information Table |
| B_MAP | Mapping Data |
- The SYM symbolic table found in the OS/360 Object File format is not present in GOFF; instead, symbolic information is conveyed through ADATA records embedded within TXT records.
Size Restriction
As specified in the z/OS XL C/C++ User's Guide, a GOFF object cannot exceed a size of 1 gigabyte.
Record Categories
GOFF object files incorporate six distinct record categories, some of which are newly introduced or altered from the traditional OS/360 format:
- The HDR record (a new addition) initiates the file and establishes the header information.
- ESD records identify main programs, subroutines, functions, dummy sections, Fortran Common blocks, methods, properties, and all callable modules or routines. These records appear before any references to ESD symbols and cover external routines such as exit() in C or CALL EXIT in Fortran.
- TXT records hold executable machine code or data and now also encompass Identification Data (IDR), Associated Data (ADATA), along with supplementary module-specific details.
- RLD records manage address relocation for both internal references and external symbols, allowing loaders or linkage editors to correctly adjust addresses.
- The LEN record (recently introduced) conveys length-related information.
- END records signify a module’s conclusion and may optionally define the program entry point; these must be positioned last.
Structure
GOFF records can be either fixed-length or variable-length; variable-length records have a minimum length of 56 characters. Apart from module and class names, all characters are encoded using the EBCDIC character set. On Unix platforms, fixed-length 80-byte records are required and shorter records are padded with zeros. Each GOFF record begins with byte X'03' to differentiate it from OS/360 format files (which start with X'02') and commands (which begin at least with space X'40'). The subsequent two bytes specify record type, continuation status, and version—collectively known as the PTV field.
PTV
The PTV field comprises the first three bytes of every GOFF record:
| Byte | Bits | Value | Description |
|---|---|---|---|
| 0 | All | 03 | Denotes the beginning of a GOFF record |
| 1 | 0-3 | 0 | ESD (External Symbol) record |
| 1 | TXT (Text) record | ||
| 2 | RLD (Relocation) record | ||
| 3 | LEN (Length) record | ||
| 4 | END (End) record | ||
| X'5'-X'E' | Reserved for future use | ||
| X'F' | HDR (Header) record | ||
| 4-5 | Reserved fields | ||
| 6-7 | 00 | Initial record not continued; typical for variable-length GOFF records | |
| 01 | Initial record continued onto next record | ||
| 10 | Continuation record not followed by another continuation | ||
| 11 | Continuation record followed by another continuation record | ||
| 2 | All bits | 00 | Version number of object file format; only X'00' is valid currently; others reserved |
HDR
The HDR record is required and must appear as the first record in the file.
| Byte(s) | Length | Field Name | Expected Value | Description/Purpose |
|---|---|---|---|---|
| 0-2 | 3 bytes | PTV | X'03F000' | Mandatory fixed value; HDR cannot be continued onto subsequent records |
| 3-47 | 45 bytes | 0 (zero) | Reserved space; must be zeroed out | |
| 48-51 | 4 bytes | Architecture Level | Binary 0 or 1 | Defines GOFF Architecture level; only values 0 and 1 permitted |
| 52-53 | 2 bytes | Module Properties Size | Binary value | Specifies length of Module Properties field |
| 54-59 | 6 bytes | 0 (zero) | Reserved; must be zero-filled | |
| 60 onward | (variable) | Module Properties |
(Optional list of module properties) |
ESD
An ESD entry establishes a public identifier for modules, procedures, functions, properties, methods, or entry points. This record must precede any usage of the referenced identifier.
rowspan=12 |41 rowspan=12 |1 colspan=4 |Flags rowspan=2 |Fill Present rowspan=2 |Bit 0 rowspan=2 |Mangled rowspan=2 |Bit 1 rowspan=2 |Renameable rowspan=2 |Bit 2 rowspan=2 |Removable Class rowspan=2 |Bit 3 rowspan=2 |Reserve Extra Space rowspan=2 |Bit 7| Byte(s) | Size | Field | Value (or bits) | Description | |
|---|---|---|---|---|---|
| 0-2 | 3 | PTV | X'030000' | ESD record without continuation | |
| X'030100' | ESD record continued in following record | ||||
| 3 | 1 | Symbol Type | 00 | SD - Section Definition; specifies main program, subroutine, function, or Fortran Common within this file; Parent ESDID = 0. | |
| 01 | ED - External Definition; identifies called procedures/functions; Parent ESDID non-zero. | ||||
| 02 | LD - Label Definition; creates aliases or exposes segments as distinct routines. | ||||
| 03 | PR - Part Reference or Pseudo Register; Parent ESDID non-zero. | ||||
| 04 | ER/WX - External/Weak External Reference; WX permits optional foreign routines. | ||||
| 4-7 | 4 | ESDID | Binary | Unique identifier starting at 1, incremented by 1 for each entry. | |
| 8-11 | 4 | Parent ESDID | binary | ESDID of defining entity; zero if none. | |
| 12-15 | 4 | 0 | Reserved | ||
| 16-19 | 4 | Offset | Binary | Address offset within Parent for LD/ED types; zero otherwise. | |
| 20-23 | 4 | 0 | Reserved | ||
| 24-27 | 4 | Length | Binary | Length for ED/PR entries; zero otherwise. -1 if deferred. | |
| 28-31 | 4 | Extended Attribute ESDID | Binary | ESDID referencing extended attributes for ED/LD entries; zero if none. | |
| 32-35 | 4 | Extended Attribute Offset | Binary | Address of extended attributes linked to previous field; zero if none. | |
| 36-39 | 4 | 0 | Reserved | ||
| 40 | 1 | Name Space ID | |||
| 0 | Reserved for Program Management Binder | ||||
| 1 | Standard Name | ||||
| 2 | Pseudo Register | ||||
| 3 | Parts (external entries containing initialized static data) | ||||
| 0 | No Fill Byte Present | ||||
| 1 | Fill Byte Included (valid only for ED types) | ||||
| 0 | Symbol is not mangled | ||||
| 1 | Symbol may be mangled | ||||
| 0 | Cannot be renamed (mapped flag in XOBJ) | ||||
| 1 | Symbol supports renaming (compatible with Language Environment renaming) | ||||
| 0 | (Default) Not Removable | ||||
| 1 | Class may be removed without impacting functionality (ED types only) | ||||
| Bits 4-6 | Reserved | ||||
| 0 | No extra space reserved | ||||
| 1 | Reserve 16 bytes at class start (MRG class ED type only) | ||||
| 42 | 1 | Fill Value | Value of fill byte if Fill Present flag is set | ||
| 43 | 1 | 0 | Reserved | ||
| 44-47 | 4 | Associated Data | Binary | Environment or static area ID for LD entries using XLINK | |
| 48-51 | 4 | Priority | Binary | Sort order for PR entries | |
| 52-59 | 8 | 0 | Reserved | ||
| 60-69 | 10 | Behavioral Attributes | Behavior attributes (refer to Behavior Attributes table) | ||
| 70-71 | 2 | Name Length | Binary | Length of the item's name; cannot be zero | |
| 72- |
Name |
Text |
Item name truncated after trailing spaces; must contain at least one character. Case sensitive. Private Code is a single blank. | ||
|
REM |
0 |
Trailer: unused space zero-filled if fixed-length records require it; unnecessary in variable-length records. | |||
Continuation
For fixed-length records that require continuation, the following ESD continuation records are utilized:
| Byte(s) | Size | Field | Value | Description | |
|---|---|---|---|---|---|
| 0-2 | 3 | PTV | X'030200' | ESD continuation record indicating no further continuations | |
| X'030300' | ESD continuation record continued onto the subsequent record | ||||
| 3- | Name | Text | Remaining name if this is the last record, or next 77 bytes if continuation follows | ||
| REM | 0 | Padding bytes for fixed-length records shorter than provided data; filled with zeros. Not applicable to variable-length records. | |||
Behavior Attributes
| Offset | Size (Bytes) | Bits | Field | Value | Description | |||||
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | Addressing Properties | Defines addressing mode for this external symbol; also referenced by AMODE in the END record. | |||||||
| 00 | AMODE unspecified (defaults to AMODE (24)) | |||||||||
| 01 | AMODE(24) | |||||||||
| 02 | AMODE(31) | |||||||||
| 03 | AMODE(ANY) (24 or 31) | |||||||||
| 04 | AMODE(64) | |||||||||
| 10 | AMODE(MIN) (smallest AMODE among all modules) | |||||||||
| 1 | 1 | Residence Properties | Residence mode of external symbol | |||||||
| 00 | RMODE unspecified (defaults to RMODE (24)) | |||||||||
| 01 | RMODE(24) | |||||||||
| 03 | RMODE(31) (Equivalent to RMODE(ANY)) | |||||||||
| 04 | RMODE(64) | |||||||||
| 2 | 1 | 0-3 (4) | Text Record Style | Specifies text style for this class (applicable to ED and PR types only); all text must maintain uniform style. | ||||||
| 0000 | Byte-oriented format | |||||||||
| 0001 | Structured data (Binder Oriented) | |||||||||
| 0010 | Structured data (user-defined) | |||||||||
| 4-7 (4) | Binding Algorithm | Method of data binding: | ||||||||
| 0000 | Concatenate all items sequentially | |||||||||
| 0001 | Merge identically named items at identical locations using largest size and strictest alignment; differently named items concatenated. Standard for CM and PR types. | |||||||||
| 3 | 1 | 0-2 (3) | Tasking Behavior | Indicates module reentrancy and reusability: | ||||||
| 000 | Unspecified | |||||||||
| 001 | Neither Reusable nor Reentrant (NON-REUS) | |||||||||
| 010 | Serially Reusable (REUS) | |||||||||
| 011 | Reentrant (RENT), which implies REUS as well. | |||||||||
|
0 |
Reserved | |||||||||
| 4 | Read Only Flag: | 0 | Not Read Only | |||||||
| 1 | Read Only | |||||||||
| 5-7 (3) | Executable Flag: | 000 | Not Specified | |||||||
| 001 | Not Executable (Data only) | |||||||||
| 010 | Executable (Code or Code and data) | |||||||||
| 4 | 1 |
0-1 (2) |
0 |
Reserved | ||||||
| 2-3 (2) |
Duplicate Symbol Severity (PR type only): error level triggered by duplicates: | |||||||||
|
00 |
Severity determined by Binder | |||||||||
|
01 |
Minimum level 4 (Warning) | |||||||||
|
10 |
Minimum level 8 (Error) | |||||||||
|
11 |
Reserved | |||||||||
|
4-7 (4) |
Binding Strength: weak references do not search other libraries; strong references do. Strong definitions resolve any references; this is the default setting. | |||||||||
|
0000 |
Strong reference | |||||||||
|
0001 |
Weak reference | |||||||||
|
rowspan=13 style="text-align:center"|5 |
rowspan=13 style="text-align:center"|1 |
rowspan=5 |0-1 (2) |
Class Loading Behavior: defines how classes are loaded during OS LOAD requests. | |||||||
|
00 |
LOAD - Load this class | |||||||||
|
01 |
DEFERRED LOAD - Likely used, should be loaded | |||||||||
|
10 |
NOLOAD - Do not load this class | |||||||||
|
11 |
Reserved | |||||||||
|
2 |
Common Flag: if set to 1, treat as "old" CM-type COMMON where multiple references set size to largest area used by any reference; SD type with identical name preserves size and text. Only B_TEXT supported. | |||||||||
|
3 |
Direct vs. Indirect Reference: 0 = Direct References for Binder; 1 = linkage descriptor for PR type or XPLINK linkage descriptor for ER type. | |||||||||
|
4-7 (4) |
Binding Scope: defines the visibility scope of the symbol. | |||||||||
|
0000 |
Unspecified | |||||||||
|
0001 |
Section scope (“local”) | |||||||||
|
0010 |
Module scope (“global”) | |||||||||
|
0011 |
Library scope | |||||||||
|
0100 |
Import-Export scope | |||||||||
|
12 style="text-align:center"|6 |
12 style="text-align:center"|1 |
Reserved bytes | ||||||||
|
2 |
Linkage Type for ER, LD, PD, PR types: | |||||||||
|
0 |
Standard O/S linkage (default) | |||||||||
|
1 |
XPLINK Linkage | |||||||||
|
3-7 (5) |
Alignment: implied alignment of item. Applies to ED and PR types except PR cannot use page alignment. | |||||||||
|
00000 |
Byte alignment | |||||||||
|
00001 |
Halfword alignment | |||||||||
|
00010 |
Fullword alignment | |||||||||
|
00011 |
Doubleword alignment | |||||||||
|
00100 |
Quadword alignment | |||||||||
|
00101 |
4KB page alignment | |||||||||
ADATA records
ADATA (short for "associated data") records deliver supplementary symbol details about a module, serving as a replacement for the earlier SYM records found in the 360 object file format. The process to generate an ADATA record involves the following steps:
- Begin by creating an ESD record of type ED corresponding to the relevant class name
- Initialize all fields within the Behavioral Attributes record to zero except for:
- Class Loading (bits 0-1 of byte 5) set to X'10'
- Binding Algorithm assigned a value of 0
- Text Record Style (bits 0-3 of byte 2) set to X'0010'
- Optionally enable Read Only (bit 4 of byte 3) and Not Executable (bits 5-7 of byte 3) if applicable
- For each ADATA element, produce a TXT record containing:
- Element ESDID: the corresponding ADATA ED record identifier
- Offset: always zero
- Data Length: length of the ADATA record
- Data: the actual content of the ADATA record
ADATA records are appended sequentially to the class in the order they are declared.
IBM utilities convert class names for ADATA records by translating their binary values into text strings prefixed with C_ADATA; for instance, X'0033' becomes C_ADATA0033.
| Type Range | Description |
| X'0000' - X'7FFF' | Translator-related records, with certain codes up to X'0130' utilized by IBM language translators such as Assembler, COBOL, and PL/I |
| X'8000' - X'8FFF' | Records pertaining to Program Management |
| X'9000' - X'DFFF' | Reserved for future use |
| X'E000' - X'EFFF' | Allocated for non-IBM compilers and assemblers |
| X'F000' - X'FFFF' | Designated for User Records; IBM does not utilize these values |
TXT
TXT records define machine instructions and data placement at precise addresses within a module. The length field accounts for any continuation records that follow.
| Byte(s) | Size | Field Name | Bits | Value | Function | |
|---|---|---|---|---|---|---|
| 0-2 | 3 bytes | PTV | X'031000' | Indicates a TXT record without continuation | ||
| X'031100' | Indicates TXT record continues onto subsequent record | |||||
| 3 | 1 byte | Bits 0-3 (4 bits) | Reserved for future use | |||
|
Style field |
Bits 4-7 (4 bits) | All other values reserved except below: | ||||
|
0000 (binary) |
Represents Byte Oriented Data | |||||
|
0001 (binary) |
Structured Data (currently limited to 19-byte IDR fields; refer to IDR Data Table) | |||||
|
0010 (binary) |
Unstructured Data type | |||||
|
Bits 4-7 (4 bits) |
Element ESDID in binary form |
Identifies ESDID associated with this data segment | ||||
|
Bits 8-11 (4 bits) |
Reserved bits with no current function |
|||||
|
Bits 12-15 (4 bits) |
Offset (binary address) |
Specifies address offset within ESDID where data is placed; generally zero for structured or unstructured data. | ||||
|
Bits 16-19 (4 bits) |
True length of text field in binary |
Must be zero if Text Encoding equals 0; otherwise reflects full size post decompression or unpacking. | ||||
|
Bits 20-21 (2 bits) |
Text Encoding mode in binary |
Zero indicates no decoding required; nonzero signals decoding/unpacking needed—see Compression Table | ||||
|
Bits 22-23 (2 bits) |
Data Length in binary bytes |
Total byte count of data on this record; cannot be zero. May occasionally be imprecise as noted in Caution. | ||||
| 24 and onwards |
Data field |
Contains machine code and/or data to be inserted. IDR data follows special guidelines; see IDR Data Table | ||||
| REM (remainder bytes) |
Absent in variable-length records; in fixed-length records, any remaining bytes must be zeros. | |||||
Warning
The byte length indicated in positions 22-23, representing an unsigned value, might be inaccurate. Comments from the LLVM Compiler suite's GOFF generator reveal that despite the official specification, the maximum byte count for an RLD or TXT record and its continuations is constrained by a SIGNED 16-bit integer. Consequently, each card's permissible attachment size is capped at 32K minus 1 byte.
Continuation
| Byte(s) | Size | Field | Bits | Value | Description | |
|---|---|---|---|---|---|---|
| 0-2 | 3 | PTV | X'031200' | Continuation Record without subsequent continuations | ||
| X'031300' | Continuation Record continued in the following record | |||||
| 3- | Data carried over from the preceding record | |||||
| REM | If remainder surpasses data length; filled with zeros | |||||
Compression Table
A compression table is employed when bytes 20-21 of the TXT record contain a nonzero value. The R parameter specifies how many times a sequence repeats, while L defines the length of the text segment repeated "R" times. This mechanism facilitates efficient initialization of tables or arrays by representing repeated data as a count and corresponding string.
| Byte(s) | Size | Field | Value | Description | |
|---|---|---|---|---|---|
| Applicable if bytes 20-21 equal 0001 | |||||
| 0-1 | 2 | R | Repeat Count (unsigned integer greater than zero) | Indicates how often to duplicate string starting at byte 4 | |
| 2-3 | 2 | L | Binary length (unsigned integer greater than zero) | Length of string beginning at byte 4 | |
| 4- | String | String of length "L" repeated "R" times | |||
| Other values in bytes 20-21 are reserved for future use | |||||
IDR Data Table
From byte 24 onward in the TXT record, the IDR Table specifies the compiler or assembler and its version responsible for producing the object file.
| Byte(s) | Size | Field | Value | Description | |
|---|---|---|---|---|---|
| 0 | 1 | x'00' | Reserved for future use | ||
| 1 | 1 | Type | Indicates IDR field type (Primary and Secondary identification correspond to first and second fields on END card in former OS/360 Object Module File Format) | ||
| 00 | Primary Identification; Legacy IDR format 1 | ||||
| 01 | Secondary Identification; Legacy IDR format 1 | ||||
| 02 | Extended Identification; IDR format 2 | ||||
| 03 | Primary Identification; IDR format 3 | ||||
| 04 | Secondary Identification; IDR format 3 | ||||
| 2-3 | 2 | Length | Binary number | Length of IDR data (unsigned integer greater than zero) | |
| 4+ | IDR data formatted according to byte 1 specification; refer to IDR Format table for details | ||||
IDR Format 1
Contrary to typical numeric values in a GOFF file, the fields "version," "release," and "trans_date" are stored as text characters rather than binary numbers.
| Byte(s) | Size | Field | Value | Description |
|---|---|---|---|---|
| 0-9 | 10 | Translator Identifier | string text | Denotes assembler or compiler identity; IBM calls this the "PID value" or "Program ID," such as "IKFCBL00" for Cobol Compiler on OS/VS1 |
| 10-11 | 2 | Version Number | string digits | Assembler or compiler version (range: 0–99) |
| 12-13 | 2 | Release Number | string digits | (Sub-version) Release number within version (range: 0–99) |
| 14-18 | 5 | Trans_Date | string digits (YYDDD) | (Compilation date formatted as two-digit year plus three-digit day of year; years between 01–65 interpreted as 21st century, others as 20th century) |
IDR Format 2
This format is generally produced by the binder rather than by compilers or assemblers.
| Byte(s) | Size | Field | Value | Description |
|---|---|---|---|---|
| 0-3 | 4 | Date | Packed decimal YYYYDDDF | Assembly or compilation date of the module, including year and day of the year |
| 4-5 | 2 | Data_Length | Binary value | Length of the subsequent field; unsigned and nonzero |
| 6-85 | 80 | IDR_Data | Format of data is proprietary and not publicly disclosed |
IDR Format 3
All components consist solely of character data; no binary values are involved.
| Byte(s) | Size | Field | Value | Description |
|---|---|---|---|---|
| 0-9 | 10 | Translator | Identifier of compiler or assembler (analogous to Translator field in Format 1) | |
| 10-11 | 2 | Version | 00 to 99 | Version number of assembler or compiler |
| 12-13 | 2 | Release | 00 to 99 | Release iteration within the version |
| 14-20 | 7 | Compile_Date | YYYYDDD | Complete 4-digit year plus day of year when compiled (similar to Trans_Date in Format 1) |
| 21-29 | 9 | Compile_Time | HHMMSSTTT | Compilation time including hour, minute, second, and millisecond |
RLD
Relocation Directory (RLD) entries indicate addresses that require relocation, covering both internal references and connections to external modules.
rowspan=2 |0-2 rowspan=2 |3 rowspan=2 |PTV 3 1 4-5 2 Length Binary number Size of relocation information; unsigned and greater than zero 6- REM colspan=3 | Padding with zeros if record length exceeds actual data length (not applicable for variable-length records)| Byte(s) | Size | Field | Value | Description |
|---|---|---|---|---|
| 'X'032000' | 'Record does not continue' | |||
| 'X'032100' | 'Record continues in next entry' | |||
| Reserved for future use | ||||
| Relocation_Data | Details for relocation; refer to Relocation Data table for specifics |
Relocation Data
| Byte(s) | Size | Field | Value | Description | |
|---|---|---|---|---|---|
| 0-5 | 6 | Flags | Flags that describe this entry; see Flags table for definitions | ||
| 6-7 | 2 | Reserved fields | |||
| 8-11 | 4 | R_Pointer | ESDID of target module (type ED or ER) for relocation reference | Address considered "distant," potentially in another module. Omitted if bit 0 in byte 0 of Flags equals 1. | |
| 12-15[A] | 4 | P_Pointer | ESDID of the module requiring relocation update | Module requesting modification of its distant reference. Omitted if bit 1 in byte 0 of Flags equals 1. | |
| 16-19[B] | 4 | Offset | Location within P_Pointer module where address adjustment is applied. | Address subject to relocation. Omitted if bit 2 in byte 0 of Flags equals 1. | |
| 20-23[C] | 4 | Reserved fields for future use. | |||
| 24-27[C] | 4 | ||||
[A] When R_Pointer is omitted (bit 0 in byte 0 of Flags is set), this field starts at bytes 8-11.
[B] If either R_Pointer or P_Pointer is omitted (bit 1 in byte 0 of Flags is set), the Offset field shifts accordingly.
[C] Reserved fields adjust position based on omitted fields as indicated by flags.
For instance, if a C program module named "Basura" invokes the function "exit," then R_Pointer corresponds to the ESDID for "exit," while P_Pointer represents the ESDID for "Basura." When addressing occurs within the same module, both pointers are identical.
Flags
| Byte(s) | Size | Field | Bits | Description | ||||
|---|---|---|---|---|---|---|---|---|
| 0 | 1 | Same_R_ID | 0 | Set to 1 if R_Pointer matches the previous entry; value is omitted in this case. | ||||
| Same_P_ID | 1 | Set to 1 if P_Pointer matches the previous entry; value omitted accordingly. | ||||||
| Same_Offset | 2 | Set to 1 when Offset equals the preceding entry; value excluded if true. | ||||||
| 3-4 | Reserved | |||||||
|
5 |
Reserved |
|||||||
|
Offset_length |
6 |
0 denotes a 4-byte length |
||||||
|
Addressing mode sensitivity |
7 |
0 indicates no sensitivity; 1 means high bits are set according to R mode addressing of R_Pointer (applicable for V-type addresses) |
| Byte(s) | Size | Field Group | Description / Values |
|---|---|---|---|
| 1 | 1 | R_Pointer_Indicators | |
| 0-3 |
| Byte(s) | Size | Field Group / Field Name / Bits / Description |
|---|---|---|
| 2 | 1 |
LEN
LEN records specify the module length when unknown during ESD record creation, such as with single-pass compilers.
| Field | Offset | Size | Description |
| PTV | 0-2 | 3 | Record Type X'033000' |
| 3-5 | 3 | Reserved space | |
| Length | 6-7 | 2 | Length of subsequent items; must not be zero |
| Elements | 8- | Element length information; refer to Elements table below | |
| REM | Trailing data for fixed-length records, must contain binary zeros; omitted for variable-length records. |
Elements
Entries with deferred lengths cannot be split or continued.
| Field | Offset | Size | Description |
| ESDID | 0-3 | 4 | ESDID corresponding to the element this length applies to |
| 4-7 | 4 | Reserved area | |
| Length | 8-11 | 4 | Length of the referenced element/item |
END
The END record concludes a module and must appear last. An 'Entry Point' defines a starting execution address different from the module start, often due to preceding non-executable data or external module invocations such as runtime libraries.
| Field | Offset | Size | Bits | Description |
| PTV | 0-2 | 3 | X'034000' - No continuation follows | |
| X'034100' - Continued in subsequent record | ||||
| 3 | 0-5 | 6 |
Reserved bits | |
| Flags | 6-7 | 2 |
Entry point specifications: | |
|
00 - No entry point declared; all related fields invalid | ||||
|
01 - Entry point indicated by ESDID | ||||
|
10 - Entry point indicated by name | ||||
|
11 - Reserved for future use | ||||
| AMODE | 4 | 1 |
Addressing Mode of entry point, as defined under Behavior Attributes in ESD record. | |
| 5-7 | 3 |
Reserved bits | ||
| Record Count | 8-11 | 4 |
Count of GOFF logical records within the module (excluding continuation records) | |
| ESDID | 12-15 | 4 |
ESDID if entry point is specified by ESDID; zero if specified by name | |
| 16-19 | 4 |
Reserved bytes | ||
| Offset | 20-23 | 4 |
Entry point address offset; not allowed for external (ER) entry points | |
| Name Length | 24-25 | 2 |
Length of entry point name; zero if entry point specified by ESDID | |
| Name | 26- |
External symbol name of entry point; binary zeros if specified by ESDID. For continued records, initial 54 characters are provided. This is the only textual field. | ||
| REM |
Trailing data at record end; binary zeros for fixed-length records; omitted for variable-length. |
Continuation
When the entry-point name in a fixed-length END record surpasses 54 bytes (or 77 bytes if the record extends further), a continuation record is implemented.
| Field | Offset | Size | Description |
| PTV | 0-2 | 3 | X'034200' - Continuation record not extended further |
| X'034300' - Continuation record extends to the following record | |||
| Name | 3- | Remaining segment of the entry-point name; if extended, up to the next 77 characters of the name | |
| REM | Trailing portion for fixed-length records (filled with binary zeroes); not present in variable-length records | ||