RetroLinker
Linker for several 8-bit, 16-bit and 32-bit formats
|
A record that defines a segment, used for SEGDEF records. More...
#include <omf.h>
Classes | |
class | LoadTimeLocatable |
Additional data for LTL segment, not part of TIS. More... | |
struct | Relocatable |
Type representing a relocatable segment. More... | |
Public Types | |
enum | alignment_t : uint8_t { AlignAbsolute = 0 , Align1 = 1 , Align2 = 2 , Align16 = 3 , AlignPage = 4 , AlignLTL16 = 6 , Align256 = FlagIntel | AlignPage , Align4096 = FlagTIS | AlignPage , AlignUnnamed = FlagIntel | 5 , Align32 = FlagTIS | 5 } |
Alignment type for a segment. More... | |
enum | combination_t : uint8_t { Combination_Private = 0 , Combination_Merge_Highest = 1 , Combination_Append = 2 , Combination_Public = Combination_Append , Combination_Join_Low = 4 , Combination_Public4 = FlagTIS | 4 , Combination_Join_High = FlagIntel | 5 , Combination_Stack = FlagTIS | 5 , Combination_Merge_Low = FlagIntel | 6 , Combination_Common = FlagTIS | 6 , Combination_Merge_High = 7 , Combination_Public7 = FlagTIS | 4 } |
Describes how two segments of the same name and class name should be combined. More... | |
enum | access_t { AccessReadOnly = 0 , AccessExecuteOnly = 1 , AccessExecuteRead = 2 , AccessReadWrite = 3 } |
Represents an additional field used by Phar Lap. | |
typedef uint32_t | Absolute |
Additional data used for absolute segments, type 0 or 5 if Intel version is used. | |
![]() | |
enum | record_type_t { RHEADR = 0x6E , REGINT = 0x70 , REDATA = 0x72 , RIDATA = 0x74 , OVLDEF = 0x76 , ENDREC = 0x78 , BLKDEF = 0x7A , BLKEND = 0x7C , DEBSYM = 0x7E , THEADR = 0x80 , LHEADR = 0x82 , PEDATA = 0x84 , PIDATA = 0x86 , COMENT = 0x88 , MODEND16 = 0x8A , MODEND = 0x8A , MODEND32 = 0x8B , EXTDEF = 0x8C , TYPDEF = 0x8E , PUBDEF16 = 0x90 , PUBDEF = 0x90 , PUBDEF32 = 0x91 , LOCSYM = 0x92 , LINNUM = 0x94 , LNAMES = 0x96 , SEGDEF = 0x98 , GRPDEF = 0x9A , FIXUPP16 = 0x9C , FIXUPP = 0x9C , FIXUPP32 = 0x9D , LEDATA16 = 0xA0 , LEDATA = 0xA0 , LEDATA32 = 0xA1 , LIDATA16 = 0xA2 , LIDATA = 0xA2 , LIDATA32 = 0xA3 , LIBHED = 0xA4 , LIBNAM = 0xA6 , LIBLOC = 0xA8 , LIBDIC = 0xAA , COMDEF = 0xB0 , BAKPAT16 = 0xB2 , BAKPAT = 0xB2 , BAKPAT32 = 0xB3 , LEXTDEF16 = 0xB4 , LEXTDEF = 0xB4 , LEXTDEF32 = 0xB5 , LPUBDEF16 = 0xB6 , LPUBDEF = 0xB6 , LPUBDEF32 = 0xB7 , LCOMDEF = 0xB8 , CEXTDEF = 0xBC , COMDAT16 = 0xC2 , COMDAT = 0xC2 , COMDAT32 = 0xC3 , LINSYM16 = 0xC4 , LINSYM = 0xC4 , LINSYM32 = 0xC5 , ALIAS = 0xC6 , NBKPAT16 = 0xC8 , NBKPAT = 0xC8 , NBKPAT32 = 0xC9 , LLNAMES = 0xCA , VERNUM = 0xCC , VENDEXT = 0xCE , LibraryHeader = 0xF0 , LibraryEnd = 0xF1 } |
The recognized record types in an OMF86 file. | |
Public Member Functions | |
SegmentDefinitionRecord (record_type_t record_type) | |
void | ReadRecordContents (OMF86Format *omf, Linker::Reader &rd) override |
Reads the record contents, except for the type, length and checksum. | |
uint16_t | GetRecordSize (OMF86Format *omf) const override |
Calculates the required bytes to write the record, might be less than record_length. | |
void | WriteRecordContents (OMF86Format *omf, ChecksumWriter &wr) const override |
Writes the record contents, except for the type, length and checksum. | |
void | CalculateValues (OMF86Format *omf, Module *mod) override |
Updates all fields that will be used for writing an OMF module, should be called before output. | |
void | ResolveReferences (OMF86Format *omf, Module *mod) override |
Resolves any fields read from an OMF module, should be called after inpnut. | |
void | ReadRecordContents (OMFFormat *omf, Linker::Reader &rd) override |
Converts omf to OMF86Format and calls the other implementation of ReadRecordContents. | |
virtual void | ReadRecordContents (OMF86Format *omf, Linker::Reader &rd)=0 |
Reads the record contents, except for the type, length and checksum. | |
uint16_t | GetRecordSize (OMFFormat *omf) const override |
Converts omf to OMF86Format and calls the other implementation of GetRecordSize. | |
virtual uint16_t | GetRecordSize (OMF86Format *omf) const=0 |
Calculates the required bytes to write the record, might be less than record_length. | |
void | WriteRecordContents (OMFFormat *omf, ChecksumWriter &wr) const override |
Converts omf to OMF86Format and calls the other implementation of WriteRecordContents. | |
virtual void | WriteRecordContents (OMF86Format *omf, ChecksumWriter &wr) const=0 |
Writes the record contents, except for the type, length and checksum. | |
![]() | |
Record (record_type_t record_type) | |
bool | Is32Bit (OMF86Format *omf) const |
Records are 32-bit if the least significant bit of their record type is set. | |
size_t | GetOffsetSize (OMF86Format *omf) const |
The number of bytes in an offset appearing inside the record, 2 for 16-bit records, 4 for 32-bit records. | |
![]() | |
Record (uint8_t record_type=0) | |
virtual void | WriteRecord (OMFFormat *omf, Linker::Writer &wr) const |
Writes the full record. | |
Public Attributes | |
uint64_t | segment_length |
The length of the segment (maximum 0x100000000) | |
alignment_t | alignment |
Alignment of segment. | |
std::variant< Relocatable, Absolute, LoadTimeLocatable > | location = Relocatable{} |
Information on where the segment should be placed at runtime. | |
combination_t | combination |
How segments of the same type should be combined. | |
bool | page_resident = false |
Set if the segment should not cross a 256 byte page boundary (only Intel) | |
bool | use32 = false |
Set if the USE32 directive is used for the segment. The field appears in different places for Phar Lap and TIS. | |
NameIndex | segment_name |
The name of the segment (not used for AlignUnnamed) | |
NameIndex | class_name |
The name of the segment's class (not used for AlignUnnamed) | |
NameIndex | overlay_name |
The name of the overlay the segment appears in (not used for AlignUnnamed) | |
std::optional< access_t > | access |
Represents the value of a Phar Lap specific extension word. | |
![]() | |
offset_t | record_offset |
Offset of record within the file. | |
uint16_t | record_length |
Length of record body file, excluding the type byte and 2-byte length field. | |
uint8_t | record_type |
A byte value identifying the type of record. | |
Additional Inherited Members | |
![]() | |
static std::shared_ptr< OMFFormat::Record > | ReadRecord (OMF86Format *omf, Linker::Reader &rd) |
Parses and returns an instance of the next record. | |
A record that defines a segment, used for SEGDEF records.
enum OMF::OMF86Format::SegmentDefinitionRecord::alignment_t : uint8_t |
Alignment type for a segment.
Enumerator | |
---|---|
AlignAbsolute | Absolute segment, its position in memory is fixed. |
Align1 | Relocatable segment, byte aligned. |
Align2 | Relocatable segment, word (2-byte) aligned. |
Align16 | Relocatable segment, paragraph (16-byte) aligned. |
AlignPage | Relocatable segment, page aligned, exact size depends on OMF version. |
AlignLTL16 | Load-time locatable or, if not part of a group, paragraph (16-byte) aligned (Intel only) |
Align256 | Relocatable segment, page (256-byte) aligned, as defined by Intel. |
Align4096 | Relocatable segment, page (4096-byte) aligned, as used by IBM. |
AlignUnnamed | Unnamed absolute portion of the memory address space, type 5 as defined by Intel. |
Align32 | Relocatable segment, double word (4-byte) aligned, type 5 as defined by TIS. |
enum OMF::OMF86Format::SegmentDefinitionRecord::combination_t : uint8_t |
Describes how two segments of the same name and class name should be combined.
|
overridevirtual |
Updates all fields that will be used for writing an OMF module, should be called before output.
Reimplemented from OMF::OMF86Format::Record.
|
overridevirtual |
Calculates the required bytes to write the record, might be less than record_length.
Implements OMF::OMF86Format::Record.
|
virtual |
Calculates the required bytes to write the record, might be less than record_length.
Implements OMF::OMF86Format::Record.
|
overridevirtual |
Converts omf to OMF86Format and calls the other implementation of GetRecordSize.
Reimplemented from OMF::OMF86Format::Record.
|
overridevirtual |
Reads the record contents, except for the type, length and checksum.
Implements OMF::OMF86Format::Record.
|
virtual |
Reads the record contents, except for the type, length and checksum.
Implements OMF::OMF86Format::Record.
|
overridevirtual |
Converts omf to OMF86Format and calls the other implementation of ReadRecordContents.
Reimplemented from OMF::OMF86Format::Record.
|
overridevirtual |
Resolves any fields read from an OMF module, should be called after inpnut.
Reimplemented from OMF::OMF86Format::Record.
|
overridevirtual |
Writes the record contents, except for the type, length and checksum.
Implements OMF::OMF86Format::Record.
|
virtual |
Writes the record contents, except for the type, length and checksum.
Implements OMF::OMF86Format::Record.
|
overridevirtual |
Converts omf to OMF86Format and calls the other implementation of WriteRecordContents.
Reimplemented from OMF::OMF86Format::Record.