RetroLinker
Linker for several 8-bit, 16-bit and 32-bit formats
|
The native file format for 8086 based CP/M derived operating systems, including FlexOS 186/286. More...
#include <cpm86.h>
Classes | |
class | Descriptor |
A representation of segment group within the executable. More... | |
class | FastLoadDescriptor |
(FlexOS 286 only) The fast loading group (unimplemented) More... | |
struct | library |
(FlexOS 286 only) A shared runtime library entry in the shared runtime library group More... | |
struct | library_id |
(FlexOS only) A shared runtime library identifier More... | |
class | LibraryDescriptor |
A special descriptor to represent the group for imported shared runtime libraries. More... | |
struct | Relocation |
Represents a single relocation. More... | |
struct | relocation_source |
Represents the location of a 16-bit words that needs to be relocated. More... | |
struct | rsx_record |
Represents an attached RSX file (residential system extension) More... | |
Public Types | |
enum | { FLAG_FIXUPS = 0x80 , FLAG_OPTIONAL_8087 = 0x40 , FLAG_REQUIRED_8087 = 0x20 , FLAG_RSX = 0x10 , FLAG_DIRECT_VIDEO = 0x08 } |
enum | format_type { FORMAT_UNKNOWN , FORMAT_8080 , FORMAT_SMALL , FORMAT_COMPACT , FORMAT_FLEXOS } |
Describes the number and type of segment groups. More... | |
enum | memory_model_t { MODEL_DEFAULT , MODEL_TINY , MODEL_SMALL , MODEL_COMPACT } |
Represents the memory model of the running executable, which is the way in which the segments are set up during execution. More... | |
Public Member Functions | |
void | Clear () override |
Resets all fields to their default values, deallocate memory. | |
CPM86Format (format_type format=FORMAT_UNKNOWN) | |
uint16_t | GetRelocationSizeParas () const |
size_t | CountValidGroups () |
number_t | FindSegmentGroup (unsigned group) const |
void | CheckValidSegmentGroup (unsigned group) |
bool | IsFastLoadFormat () const |
void | ReadRelocations (Linker::Reader &rd) |
void | WriteRelocations (Linker::Writer &wr) |
void | ReadFile (Linker::Reader &rd) override |
Loads file into memory. | |
void | WriteFile (Linker::Writer &wr) override |
Stores data in memory to file. | |
offset_t | GetFullFileSize () const |
void | Dump (Dumper::Dumper &dump) override |
Display file contents in a nice manner. | |
void | CalculateValues () override |
Intermediate step between processing module and generating output file to set up headers and management sections It is expected that after a module is processed, additional steps are required to evaluate the final values of the fields. | |
bool | FormatSupportsSegmentation () const override |
Whether the format supports multiple segments. | |
bool | FormatIs16bit () const override |
Whether the format is 16-bit or not. | |
unsigned | FormatAdditionalSectionFlags (std::string section_name) const override |
std::vector< std::shared_ptr< Linker::Segment > > & | Segments () |
unsigned | GetSegmentNumber (std::shared_ptr< Linker::Segment > segment) |
void | SetModel (std::string model) override |
Sets the way memory is organized, typically modifying a built-in script. | |
void | SetOptions (std::map< std::string, std::string > &options) override |
Passes command line parameters as settings over to format object. | |
std::unique_ptr< Script::List > | GetScript (Linker::Module &module) |
void | Link (Linker::Module &module) |
void | ProcessModule (Linker::Module &module) override |
Processes the module object and initializes format fields. | |
void | GenerateFile (std::string filename, Linker::Module &module) override |
The main function that handles processing, calculating and generating the final image. | |
std::string | GetDefaultExtension (Linker::Module &module, std::string filename) override |
Appends a default extension to the filename. | |
Public Member Functions inherited from Linker::OutputFormat | |
virtual bool | AddSupplementaryOutputFormat (std::string subformat) |
If the output format actually drives multiple output formats (resource file, apple double, etc.), specify multiple types, return false if unknown. | |
std::optional< std::string > | FetchOption (std::map< std::string, std::string > &options, std::string name) |
Convenience method to look up option by name. | |
std::string | FetchOption (std::map< std::string, std::string > &options, std::string name, std::string default_value) |
Convenience method to look up option by name, returning default value if name is missing. | |
std::optional< offset_t > | FetchIntegerOption (std::map< std::string, std::string > &options, std::string name) |
Convenience method to look up option by name and convert it to integer. | |
virtual void | SetLinkScript (std::string script_file, std::map< std::string, std::string > &options) |
Selects a script file to use for linking. | |
virtual std::string | GetDefaultExtension (Linker::Module &module) |
Provides a default filename for the output file. | |
virtual bool | FormatIsLinear () const |
Whether the address space is linear or segmented. | |
virtual bool | FormatSupportsResources () const |
Whether the format supports resources. | |
virtual bool | FormatSupportsLibraries () const |
Whether the format supports libraries. | |
Public Member Functions inherited from Linker::Format | |
Format (offset_t file_offset=0) | |
Public Member Functions inherited from Linker::LinkerManager | |
void | ClearLinkerManager () |
void | SetLinkScript (std::string script_file, std::map< std::string, std::string > &options) |
Sets up the linker script and linker parameters. | |
bool | SetLinkerParameter (std::map< std::string, std::string > &options, std::string key) |
Sets a single linker parameter, if inside options. | |
bool | SetLinkerParameter (std::map< std::string, std::string > &options, std::string key, std::string variable) |
Sets a single linker parameter, if inside options. | |
std::unique_ptr< Script::List > | GetScript (Linker::Module &module) |
Compiles the linker script into an internal format. | |
offset_t | GetCurrentAddress () const |
Retrieves current address pointer. | |
void | SetCurrentAddress (offset_t address) |
Moves the current address pointer further, and if the current segment already contains data, fill it up to the point. | |
void | AlignCurrentAddress (offset_t align) |
Aligns current address to alignment, using SetCurrentAddress. | |
void | SetLatestBase (offset_t address) |
Sets the base of the current section (the value from which offsets are counted from) | |
void | FinishCurrentSegment () |
Closes the current segment, sets current_segment to null. | |
virtual void | OnNewSegment (std::shared_ptr< Segment > segment) |
Callback function when allocating a new segment When the linker script runs, it creates segments consecutively. Overriding this method permits the output format to handle the allocated segment. | |
std::shared_ptr< Segment > | AppendSegment (std::string name) |
Terminates the current segment (if there is one), creates a new segment and attaches it to the image. | |
std::shared_ptr< Segment > | FetchSegment (std::string name) |
Attempts to fetch a segment, returns null if not found. | |
void | AppendSection (std::shared_ptr< Section > section) |
Adds a new section to the current segment, sets the base to the same as the segment. | |
void | ProcessScript (std::unique_ptr< Script::List > &directives, Module &module) |
Executes a parsed linker script on a module and collects segments The function OnNewSegment can be defined to handle each newly allocated segment. | |
void | ProcessAction (std::unique_ptr< Script::Node > &action, Module &module) |
void | PostProcessAction (std::unique_ptr< Script::Node > &action, Module &module) |
void | ProcessCommand (std::unique_ptr< Script::Node > &command, Module &module) |
bool | CheckPredicate (std::unique_ptr< Script::Node > &predicate, std::shared_ptr< Section > section, Module &module) |
offset_t | EvaluateExpression (std::unique_ptr< Script::Node > &expression, Module &module) |
Public Attributes | |
std::array< Descriptor, 8 > | descriptors |
A .cmd file may contain up to 8 descriptors that describer the segment groups. | |
LibraryDescriptor | library_descriptor |
FlexOS 286 defines a shared runtime library group at offset 0x48. | |
FastLoadDescriptor | fastload_descriptor |
FlexOS 286 defines a fast load segment (unknown name) at offset 0x51. | |
library_id | lib_id |
FlexOS 286 library identifier (for libraries) at offset 0x60. | |
std::vector< Relocation > | relocations |
The sequence of intramodule relocations. | |
uint32_t | relocations_offset = 0 |
Offset of relocation records, stored in 128 byte units at offset 0x7D. | |
std::array< rsx_record, 8 > | rsx_table |
Represents a list of attached RSX modules. | |
uint32_t | rsx_table_offset = 0 |
The actual RSX table, stored in 128 byte units at offset 0x7B. | |
uint8_t | flags = 0 |
Execution flags, stored at offset 0x7F. | |
uint32_t | file_offset = 0 |
The start of the image within the file, typically 0 except for embedded modules, usually for embedded RSX files. | |
format_type | format = FORMAT_SMALL |
Format of file to generate. | |
bool | shared_code = false |
Flag indicating that the code group is shared, not possible in 8080 format. | |
bool | option_no_relocation = false |
Flag to indicate that relocations must be suppressed. | |
memory_model_t | memory_model = MODEL_SMALL |
Memory model of generated code, determines how the offsets are calculated within a segment group. | |
Public Attributes inherited from Linker::Format | |
offset_t | file_offset |
Public Attributes inherited from Linker::LinkerManager | |
offset_t | current_base = 0 |
The base address of the current section. | |
std::vector< std::shared_ptr< Segment > > | segment_vector |
Ordered sequence of segments. | |
std::map< std::string, std::shared_ptr< Segment > > | segment_map |
Map of segments from their names. | |
std::shared_ptr< Segment > | current_segment |
Currently processed segment. | |
std::map< std::string, Location > | linker_parameters |
Parameters that permit customizing the linker script. | |
std::string | linker_script |
Contents of the linker script. | |
Additional Inherited Members | |
Protected Attributes inherited from Linker::LinkerManager | |
offset_t | current_address = 0 |
Holds the current address value when there is no current_segment. | |
bool | current_is_template = false |
bool | current_is_template_head = false |
offset_t | template_counter = 0 |
std::string | current_template_name |
The native file format for 8086 based CP/M derived operating systems, including FlexOS 186/286.
The current implementation supports 3 memory model formats:
The format was used on a multitude of Digital Research operating systems, from CP/M-86 and DOS Plus to Multiuser DOS, as well as FlexOS. It supports many special features, such as shared libraries and attachable residential system extensions. These are not currently implemented.
anonymous enum |
Describes the number and type of segment groups.
|
overridevirtual |
Intermediate step between processing module and generating output file to set up headers and management sections It is expected that after a module is processed, additional steps are required to evaluate the final values of the fields.
Reimplemented from Linker::OutputFormat.
|
overridevirtual |
Resets all fields to their default values, deallocate memory.
Reimplemented from Linker::Format.
|
overridevirtual |
Display file contents in a nice manner.
Reimplemented from Linker::Format.
|
overridevirtual |
Reimplemented from Linker::OutputFormat.
|
overridevirtual |
Whether the format is 16-bit or not.
This is needed for the ELF parser which can not distinguish between the 8086 and 80386 backends.
Reimplemented from Linker::OutputFormat.
|
overridevirtual |
Whether the format supports multiple segments.
This is typically true for Intel 8086 targets and false for non-Intel targets. The ELF parser uses this to provide extended relocations, including the following:
Reimplemented from Linker::OutputFormat.
|
overridevirtual |
The main function that handles processing, calculating and generating the final image.
Reimplemented from Linker::OutputFormat.
|
overridevirtual |
Appends a default extension to the filename.
A typical behavior would be to append .exe at the end of the filename. The default action is to leave it intact.
Reimplemented from Linker::OutputFormat.
|
overridevirtual |
Processes the module object and initializes format fields.
Reimplemented from Linker::OutputFormat.
|
overridevirtual |
Loads file into memory.
Implements Linker::Format.
|
overridevirtual |
Sets the way memory is organized, typically modifying a built-in script.
Reimplemented from Linker::OutputFormat.
|
overridevirtual |
Passes command line parameters as settings over to format object.
Reimplemented from Linker::OutputFormat.
|
overridevirtual |
Stores data in memory to file.
Implements Linker::Format.