An IRL file is an indexed REL file. The index is used to improve linker performance.
A file offset in an IRL is three bytes long:
DB high ;(File offset >> 14 ) & 0x7F DB middle ;(File offset >> 7 ) & 0x7F DB low ;(File offset 1 ) & 0x7F
The IRL file consists of three sections:
This is 128 bytes long. Only the first three bytes are used; these contain the file offset of the REL image (see below). The other bytes are set to zero.
DB h,m,0 ;Offset to REL image. The "low" figure is always 0; ;the REL image will be aligned to 128 bytes. DS 125 ;Unused, set to 0
Note that bit 7 of the first byte is always zero. In an orthodox non-indexed REL file, bit 7 of the first byte will always be 1 (the first bit of the Module Name record).
The symbol table is at offset 80h in the file, and contains a number of variable-length symbol records. Each record is formed:
DB h,m,l ;Offset to the REL module containing the symbol, ;from the start of the REL image. DB 'SYMBOL' ;ASCII, 1-8 characters DB 0FEh ;End of string
The end of the table is marked by a zero-length symbol:
DB h,m,0 ;Length of the REL image. Note that this does NOT ;give the offset of the "EOF" record in the REL image; ;it gives the number of bytes in the REL image ;including those that pack it out to a multiple of 128 ;bytes in length. DB 0FEh ;End of string
After this record, the table is then packed out (LIB uses 1Ah as the packing character) to the next 128-byte boundary.
The REL image then follows. This is in standard REL format. To convert an IRL library to a REL library, just remove the header and symbol table.