RetroLinker
Linker for several 8-bit, 16-bit and 32-bit formats
|
The native executable format for the Motorola 68000 port of CP/M. More...
#include <cpm68k.h>
Classes | |
struct | Relocation |
Public Types | |
enum | magic_type { MAGIC_CONTIGUOUS = 1 , MAGIC_NONCONTIGUOUS , MAGIC_CRUNCHED } |
Represents the magic number at the beginning of the executable file. More... | |
enum | system_type { SYSTEM_UNKNOWN , SYSTEM_CPM68K , SYSTEM_GEMDOS_EARLY , SYSTEM_GEMDOS , SYSTEM_HUMAN68K , SYSTEM_CDOS68K } |
Different systems have different relocation formats and expectations as to what segments should be present. More... | |
Public Member Functions | |
magic_type | GetSignature () const |
void | SetSignature (magic_type magic) |
void | Clear () override |
Resets all fields to their default values, deallocate memory. | |
CPM68KFormat (system_type system=SYSTEM_UNKNOWN) | |
CPM68KFormat (system_type system, magic_type magic) | |
void | ReadFile (Linker::Reader &rd) override |
Loads file into memory. | |
void | WriteFile (Linker::Writer &wr) override |
Stores data in memory to file. | |
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. | |
std::shared_ptr< Linker::Segment > | CodeSegment () |
Return code segment (if it exists) | |
std::shared_ptr< Linker::Segment > | DataSegment () |
Return data segment (if it exists) | |
unsigned | FormatAdditionalSectionFlags (std::string section_name) const override |
void | SetOptions (std::map< std::string, std::string > &options) override |
Passes command line parameters as settings over to format object. | |
void | OnNewSegment (std::shared_ptr< Linker::Segment > segment) override |
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. | |
void | CreateDefaultSegments () |
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 | SetModel (std::string model) |
Sets the way memory is organized, typically modifying a built-in script. | |
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 | FormatSupportsSegmentation () const |
Whether the format supports multiple segments. | |
virtual bool | FormatIs16bit () const |
Whether the format is 16-bit or not. | |
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. | |
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) |
Static Public Member Functions | |
template<typename SizeType > | |
static void | CDOS68K_WriteRelocations (Linker::Writer &wr, std::map< uint32_t, SizeType > relocations) |
Public Attributes | |
char | signature [2] = { 0x60, 0x1A } |
The magic number at the beginning of the executable file, one of 0x601A (contiguous), 0x601B (non-contiguous), 0x601C (contiguous with crunched relocations) | |
uint32_t | code_size = 0 |
Size of the code/text segment. | |
uint32_t | data_size = 0 |
Size of the initialized data segment. | |
uint32_t | bss_size = 0 |
Size of the uninitialized data (bss) segment. Human68k includes the stack in it. | |
uint32_t | symbol_table_size = 0 |
Size of the symbol table. | |
uint32_t | stack_size = 0 |
Size of the stack segment. Only used by Concurrent DOS 68K. | |
uint32_t | code_address = 0 |
Load address of the code/text segment. Not used by GEMDOS which stores the program flags at this offset. | |
uint32_t | program_flags = 0 |
Program flags, used by GEMDOS. | |
uint16_t | relocations_suppressed = 1 |
Set to a non-0 value when relocations are suppressed. Typically this can be 1, but Human68k specifically expects a 0xFFFF, according to documentation. | |
uint32_t | data_address = 0 |
Load address of the initialized data segment. Only relevant for non-contiguous executables (CP/M-68K), otherwise it should follow the code/text segment directy. | |
uint32_t | bss_address = 0 |
Load address of the uninitialized data (bss) segment. Only relevant for non-contiguous executables (CP/M-68K), otherwise it should follow the initialized data segment directy. | |
offset_t | file_size = 0 |
Size of entire file, not used for generation. | |
std::shared_ptr< Linker::Writable > | code = nullptr |
Storage for code segment. | |
std::shared_ptr< Linker::Writable > | data = nullptr |
Storage for data segment. | |
std::map< uint32_t, Relocation > | relocations |
Relocations, not used for Human68k. | |
system_type | system |
The system which will load the executable. | |
bool | option_no_relocation = true |
Makes sure no relocations are placed into the output file. | |
std::shared_ptr< Linker::Segment > | bss_segment |
Segment to collect bss. | |
std::shared_ptr< Linker::Segment > | stack_segment |
Segment to collect stack (Concurrent DOS 68K only) | |
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 executable format for the Motorola 68000 port of CP/M.
This format was also adopted on the following systems:
Represents the magic number at the beginning of the executable file.
Different systems have different relocation formats and expectations as to what segments should be present.
|
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 |
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 |
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.
Reimplemented from Linker::LinkerManager.
|
overridevirtual |
Processes the module object and initializes format fields.
Reimplemented from Linker::OutputFormat.
|
overridevirtual |
Loads file into memory.
Implements Linker::Format.
|
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.