|
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 | CPM86OptionCollector |
| 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 , FLAG_MPMLOCK = 0x04 , FLAG_NO_BANKING = 0x02 } |
| enum | { CPM_FLAG_F1 = 0x01 , CPM_FLAG_F2 = 0x02 , CPM_FLAG_F3 = 0x03 , CPM_FLAG_F4 = 0x04 } |
| enum | format_type { FORMAT_UNKNOWN , FORMAT_8080 , FORMAT_SMALL , FORMAT_COMPACT , FORMAT_FLEXOS , FORMAT_FASTLOAD } |
| Describes the number and type of segment groups, as well as the target operating system. More... | |
| enum | application_type { APPL_UNKNOWN , APPL_CMD , APPL_RSX , APPL_RSP , APPL_MPM , APPL_CON , APPL_OVR , APPL_286 , APPL_SRL } |
| 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... | |
| typedef relocation_source | relocation_target |
Public Member Functions | |
| void | Clear () override |
| Resets all fields to their default values, deallocate memory. | |
| CPM86Format (format_type format=FORMAT_UNKNOWN, application_type application=APPL_UNKNOWN) | |
| uint16_t | GetRelocationSizeParas () const |
| size_t | CountValidGroups () |
| number_t | FindSegmentGroup (unsigned group) const |
| void | CheckValidSegmentGroup (unsigned group) |
| bool | IsFastLoadFormat () const |
| bool | IsSharedRunTimeLibrary () const |
| void | ReadRelocations (Linker::Reader &rd) |
| void | WriteRelocations (Linker::Writer &wr) const |
| offset_t | MeasureRelocations () |
| void | ReadFile (Linker::Reader &rd) override |
| Loads file into memory. | |
| offset_t | ImageSize () const override |
| Retrieves size of stored data. | |
| offset_t | WriteFile (Linker::Writer &wr) const override |
| Stores data in memory to file. | |
| offset_t | GetFullFileSize () const |
| void | Dump (Dumper::Dumper &dump) const 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. | |
| bool | FormatIsProtectedMode () const override |
| Whether the format is in protected mode or not (x86 only) | |
| bool | FormatSupportsLibraries () const override |
| Whether the format supports libraries. | |
| unsigned | FormatAdditionalSectionFlags (std::string section_name) const override |
| std::vector< std::shared_ptr< Linker::Segment > > & | Segments () |
| void | AssignSegmentTypes () |
| Determine the segment group type number, must be called before accessing segment_types. | |
| unsigned | GetSegmentNumber (std::shared_ptr< Linker::Segment > segment) |
| std::vector< Linker::OptionDescription< void > > | GetMemoryModelNames () override |
| Returns a list of the supported memory models, used for documentation. | |
| void | SetModel (std::string model) override |
| Sets the way memory is organized, typically modifying a built-in script. | |
| std::shared_ptr< Linker::OptionCollector > | GetOptions () override |
| Returns object containing a sequence of option fields provided with the -S command line flag. | |
| 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 | BuildLDTImage (Linker::Module &module) |
| Creates the LDT image for a fastload FlexOS binary. | |
| 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) const override |
| Appends a default extension to the filename. | |
Public Member Functions inherited from Linker::SegmentManager | |
| void | ClearSegmentManager () |
| void | SetLinkScript (std::string script_file, std::map< std::string, std::string > &options) override |
| Sets up the linker script and linker parameters. | |
| std::unique_ptr< Script::List > | GetScript (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 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. | |
| virtual std::vector< OptionDescription< void > * > | GetLinkerScriptParameterNames () |
| Returns a list of the parameters used in the linker scripts, used for documentation. | |
| virtual std::vector< OptionDescription< void > > | GetSpecialSymbolNames () |
| Returns a list of special symbol names recognized by the format, used for documentation. | |
| 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 std::string | GetDefaultExtension (Module &module) const |
| 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. | |
Public Member Functions inherited from Linker::Format | |
| Format (offset_t file_offset=0) | |
| offset_t | ImageSize () const override |
| Retrieves size of stored data. | |
| offset_t | WriteFile (Writer &wr, offset_t count, offset_t offset=0) const override |
| Writes data of non-zero filled sections. | |
Public Member Functions inherited from Linker::Image | |
| virtual std::shared_ptr< const ActualImage > | AsImage () const |
| Retrieves a randomly accessible image. | |
| std::shared_ptr< ActualImage > | AsImage () |
| Retrieves a randomly accessible image. | |
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. | |
| uint8_t | cpm_flags = 0 |
| CP/M specific flags used by Concurrent DOS, stored at offset 0x7A. | |
| uint32_t | file_offset = 0 |
| The start of the image within the file, typically 0 except for embedded modules, usually for embedded RSX files. | |
| offset_t | file_size = offset_t(-1) |
| The full size of the image. | |
| format_type | format |
| Format of file to generate. | |
| application_type | application |
| Target application type. | |
| bool | option_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. | |
| bool | option_generate_fixup_group = false |
| On FlexOS, relocations can be part of its own group. | |
| memory_model_t | memory_model = MODEL_SMALL |
| Memory model of generated code, determines how the offsets are calculated within a segment group. | |
| std::map< std::shared_ptr< Linker::Segment >, Descriptor::group_type > | segment_types |
| Assignment from each segment to the segment group type number (1: code, 2: data, etc.) | |
Public Attributes inherited from Linker::SegmentManager | |
| 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. | |
Public Attributes inherited from Linker::Format | |
| offset_t | file_offset |
Static Public Attributes | |
| static std::vector< Linker::OptionDescription< void > > | MemoryModelNames |
Additional Inherited Members | |
Protected Attributes inherited from Linker::SegmentManager | |
| 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, as well as the target operating system.
|
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 is in protected mode or not (x86 only)
This is needed for the ELF parser to determine whether segment references are paragraph offsets (16-byte units) or selector indexes.
For non-x86 targets, the result is meaningless.
Reimplemented from Linker::OutputFormat.
|
overridevirtual |
Whether the format supports libraries.
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 |
Returns a list of the supported memory models, used for documentation.
Reimplemented from Linker::OutputFormat.
|
overridevirtual |
Returns object containing a sequence of option fields provided with the -S command line flag.
Reimplemented from Linker::OutputFormat.
|
overridevirtual |
Retrieves size of stored data.
Implements Linker::Image.
|
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.
|
static |