RetroLinker
Linker for several 8-bit, 16-bit and 32-bit formats
Loading...
Searching...
No Matches
format.h
1#ifndef FORMAT_H
2#define FORMAT_H
3
4#include <map>
5#include <optional>
6#include <string>
7#include "../common.h"
8#include "image.h"
9
10namespace Dumper
11{
12 class Dumper;
13}
14
15namespace Linker
16{
17 class Module;
18 class ModuleCollector;
19 class OptionCollector;
20 template <typename T>
21 class OptionDescription;
22 class Reader;
23 class Writer;
24
28 class Format : public virtual Contents
29 {
30 public:
34 offset_t file_offset;
35
36 Format(offset_t file_offset = 0)
38 {
39 }
40
41 virtual ~Format() = default;
45 virtual void Clear();
49 virtual void ReadFile(const std::shared_ptr<Reader>& rd) = 0;
53 offset_t WriteFile(const std::shared_ptr<Writer>& wr) const override = 0;
57 virtual void Dump(Dumper::Dumper& dump) const;
61 virtual void SetFileOffset(offset_t new_offset);
62 offset_t ImageSize() const override;
63 };
64
68 class OutputFormat : public virtual Format
69 {
70 public:
74 virtual bool AddSupplementaryOutputFormat(std::string subformat);
78 virtual std::vector<OptionDescription<void>> GetMemoryModelNames();
82 virtual std::vector<OptionDescription<void> *> GetLinkerScriptParameterNames();
86 virtual std::vector<OptionDescription<void>> GetSpecialSymbolNames();
90 virtual std::shared_ptr<OptionCollector> GetOptions();
94 virtual void SetOptions(std::map<std::string, std::string>& options);
95
99 std::optional<std::string> FetchOption(std::map<std::string, std::string>& options, std::string name);
100
104 std::string FetchOption(std::map<std::string, std::string>& options, std::string name, std::string default_value);
105
109 std::optional<offset_t> FetchIntegerOption(std::map<std::string, std::string>& options, std::string name);
110
114 virtual void SetModel(std::string model);
118 virtual void SetLinkScript(std::string script_file, std::map<std::string, std::string>& options);
122 virtual void ProcessModule(Module& object);
127 virtual void CalculateValues();
131 virtual void GenerateFile(std::string filename, Module& module);
138 virtual std::string GetDefaultExtension(Module& module, std::string filename) const;
144 virtual std::string GetDefaultExtension(Module& module) const;
145 /* x86 only */
157 virtual bool FormatSupportsSegmentation() const;
163 virtual bool FormatIs16bit() const;
171 virtual bool FormatIsProtectedMode() const;
178 virtual bool FormatIsLinear() const;
179 /* Macintosh only */
187 virtual bool FormatSupportsTransitionVectors() const;
188 /* general */
195 virtual bool FormatSupportsResources() const;
199 virtual bool FormatSupportsLibraries() const; /* imports/exports, fileformat level support, not system support */
205 virtual bool FormatSupportsEntryTable() const;
206 virtual unsigned FormatAdditionalSectionFlags(std::string section_name) const;
207
211 virtual void AllocateSymbols(Module& module) const;
212 };
213
217 class InputFormat : public virtual Format, public std::enable_shared_from_this<InputFormat>
218 {
219 public:
224 virtual void SetupOptions(std::shared_ptr<OutputFormat> format);
228 virtual void ProduceModule(ModuleCollector& linker, const std::shared_ptr<Reader>& rd, std::string file_name);
232 virtual void ProduceModule(Module& module, const std::shared_ptr<Reader>& rd);
236 virtual void GenerateModule(ModuleCollector& linker, std::string file_name, bool is_library = false) const;
240 virtual void GenerateModule(Module& module) const;
241 public:
242 /* x86 only */
254 virtual bool FormatProvidesSegmentation() const;
255 /* w65 only */
259 virtual bool FormatRequiresDataStreamFix() const;
260 /* Macintosh only */
268 virtual bool FormatProvidesTransitionVectors() const;
269 /* general */
276 virtual bool FormatProvidesResources() const;
280 virtual bool FormatProvidesLibraries() const;
286 virtual bool FormatProvidesEntryTable() const;
287 };
288}
289
290#endif /* FORMAT_H */
An abstract interface that separates structure and presentation of the data inside a file.
Definition dumper.h:1009
Represents abstract data contents whose data can be written to a file.
Definition image.h:17
A class to encode a general file format.
Definition format.h:29
virtual void Dump(Dumper::Dumper &dump) const
Display file contents in a nice manner.
Definition format.cc:11
offset_t WriteFile(const std::shared_ptr< Writer > &wr) const override=0
Stores data in memory to file.
offset_t file_offset
The offset of the first byte used by this format in the file it is stored in.
Definition format.h:34
offset_t ImageSize() const override
Retrieves the offset of the byte after the last one belonging to this format from the first one.
Definition format.cc:25
virtual void ReadFile(const std::shared_ptr< Reader > &rd)=0
Loads file into memory.
virtual void SetFileOffset(offset_t new_offset)
Attempts to alter the offset to the first byte of the format from the beginning of the file.
Definition format.cc:20
virtual void Clear()
Resets all fields to their default values, deallocate memory.
Definition format.cc:16
A class that provides a general interface to loading a module.
Definition format.h:218
virtual bool FormatRequiresDataStreamFix() const
Whether the generated file might contain bugs that require fixing.
Definition format.cc:246
virtual void SetupOptions(std::shared_ptr< OutputFormat > format)
Initializes the reader for linking purposes.
Definition format.cc:210
virtual bool FormatProvidesEntryTable() const
Whether the format supports a structure containing addresses of methods.
Definition format.cc:266
virtual bool FormatProvidesLibraries() const
Whether the format enables importing/exporting libraries.
Definition format.cc:261
virtual void GenerateModule(ModuleCollector &linker, std::string file_name, bool is_library=false) const
Loads the information into a module object.
Definition format.cc:226
virtual bool FormatProvidesResources() const
Whether the format supports resources.
Definition format.cc:256
virtual bool FormatProvidesSegmentation() const
Whether the format enables multiple x86 segments.
Definition format.cc:241
virtual bool FormatProvidesTransitionVectors() const
Whether the format supports generating transition vectors.
Definition format.cc:251
virtual void ProduceModule(ModuleCollector &linker, const std::shared_ptr< Reader > &rd, std::string file_name)
Reads a file and loads the information into a module object.
Definition format.cc:214
Helper class that collects object files and libraries, and includes library objects for required symb...
Definition module_collector.h:25
Encodes an object module file as a collection of sections, symbols and relocations.
Definition module.h:24
A class that provides a general interface to setting up generation for a format.
Definition format.h:69
virtual bool FormatSupportsSegmentation() const
Whether the format supports multiple segments.
Definition format.cc:151
virtual void AllocateSymbols(Module &module) const
Instructs the module to allocate any unallocated local symbols.
Definition format.cc:205
virtual void GenerateFile(std::string filename, Module &module)
The main function that handles processing, calculating and generating the final image.
Definition format.cc:129
virtual void ProcessModule(Module &object)
Processes the module object and initializes format fields.
Definition format.cc:121
virtual bool FormatSupportsLibraries() const
Whether the format supports libraries.
Definition format.cc:190
virtual std::string GetDefaultExtension(Module &module, std::string filename) const
Appends a default extension to the filename.
virtual std::vector< OptionDescription< void > * > GetLinkerScriptParameterNames()
Returns a list of the parameters used in the linker scripts, used for documentation.
Definition format.cc:40
virtual std::vector< OptionDescription< void > > GetMemoryModelNames()
Returns a list of the supported memory models, used for documentation.
Definition format.cc:35
virtual std::shared_ptr< OptionCollector > GetOptions()
Returns object containing a sequence of option fields provided with the -S command line flag.
Definition format.cc:57
virtual bool FormatIsLinear() const
Whether the address space is linear or segmented.
Definition format.cc:168
virtual bool FormatSupportsTransitionVectors() const
Whether the format supports generating transition vectors.
Definition format.cc:173
virtual bool FormatSupportsEntryTable() const
Whether the format supports a structure containing addresses of methods.
Definition format.cc:195
virtual void SetLinkScript(std::string script_file, std::map< std::string, std::string > &options)
Selects a script file to use for linking.
Definition format.cc:116
virtual std::string GetDefaultExtension(Module &module) const
Provides a default filename for the output file.
virtual bool FormatIs16bit() const
Whether the format is 16-bit or not.
Definition format.cc:156
virtual std::vector< OptionDescription< void > > GetSpecialSymbolNames()
Returns a list of special symbol names recognized by the format, used for documentation.
Definition format.cc:51
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.
Definition format.cc:92
virtual void SetOptions(std::map< std::string, std::string > &options)
Passes command line parameters as settings over to format object.
Definition format.cc:62
std::optional< std::string > FetchOption(std::map< std::string, std::string > &options, std::string name)
Convenience method to look up option by name.
Definition format.cc:66
virtual void SetModel(std::string model)
Sets the way memory is organized, typically modifying a built-in script.
Definition format.cc:108
virtual bool FormatIsProtectedMode() const
Whether the format is in protected mode or not (x86 only)
Definition format.cc:161
virtual void CalculateValues()
Intermediate step between processing module and generating output file to set up headers and manageme...
Definition format.cc:125
virtual bool AddSupplementaryOutputFormat(std::string subformat)
If the output format actually drives multiple output formats (resource file, apple double,...
Definition format.cc:30
virtual bool FormatSupportsResources() const
Whether the format supports resources.
Definition format.cc:185