RetroLinker
Linker for several 8-bit, 16-bit and 32-bit formats
Loading...
Searching...
No Matches
segment.h
1#ifndef SEGMENT_H
2#define SEGMENT_H
3
4#include <iostream>
5#include <memory>
6#include <string>
7#include <vector>
8#include "../common.h"
9#include "image.h"
10
11namespace Linker
12{
13 class Section;
14 class Writer;
15
24 class Segment : public ActualImage
25 {
26 public:
30 std::string name;
34 std::vector<std::shared_ptr<Section>> sections;
38 offset_t base_address;
42 offset_t align = 1;
49 offset_t data_size = 0;
56 offset_t zero_fill = 0;
60 offset_t optional_extra = 0;
61
62 Segment(std::string name, offset_t base_address = 0)
64 {
65 }
66
70 bool IsMissing();
74 void Fill();
78 void RealignEnd(offset_t align);
84 void Append(std::shared_ptr<Section> section);
88 offset_t WriteFile(std::ostream& out, offset_t size, offset_t offset = 0) const;
92 offset_t WriteFile(std::ostream& out) const;
96 offset_t WriteFile(Writer& wr, offset_t count, offset_t offset = 0) const override;
100 offset_t WriteFile(Writer& wr) const override;
101
102 size_t ReadData(size_t bytes, offset_t offset, void * buffer) const override;
103
107 offset_t TotalSize();
114 offset_t ImageSize() const override;
118 offset_t GetStartAddress();
122 offset_t GetEndAddress();
128 void SetEndAddress(offset_t address);
132 void AlignEndAddress(offset_t align);
133 protected:
134 void ShiftAddress(int64_t amount);
135 public:
139 void SetStartAddress(offset_t address);
140 protected:
141 std::shared_ptr<Segment> shared_from_this();
142 };
143
144 std::ostream& operator<<(std::ostream& out, const Segment& segment);
145}
146
147#endif /* SEGMENT_H */
Definition image.h:43
A class representing a sequence of sections that must be written to the output file as a group.
Definition segment.h:25
std::string name
The name of the segment.
Definition segment.h:30
void Append(std::shared_ptr< Section > section)
Appends section to segment.
Definition segment.cc:41
offset_t zero_fill
Extra zero filled space following filled data.
Definition segment.h:56
offset_t GetEndAddress()
Returns end address (GetStartAddress() + TotalSize())
Definition segment.cc:179
void AlignEndAddress(offset_t align)
Aligns the end of the segment.
Definition segment.cc:211
offset_t base_address
Address where segment starts.
Definition segment.h:38
size_t ReadData(size_t bytes, offset_t offset, void *buffer) const override
Attempts to fill a buffer with data.
Definition segment.cc:134
offset_t WriteFile(std::ostream &out, offset_t size, offset_t offset=0) const
Writes data of non-zero filled sections.
Definition segment.cc:87
std::vector< std::shared_ptr< Section > > sections
Sequence of sections belonging to the segment.
Definition segment.h:34
void RealignEnd(offset_t align)
Aligns end of segment by increasing size of last section.
Definition segment.cc:27
void Fill()
Fills zero filled sections with zero data, making them non-zero filled in the sense that they have to...
Definition segment.cc:13
offset_t data_size
Cached value of the non-filled data for the entire segment.
Definition segment.h:49
offset_t optional_extra
Optional extra space after zero filled data.
Definition segment.h:60
offset_t ImageSize() const override
Retrieves size of all data in segment, as present in the binary image.
Definition segment.cc:162
void SetStartAddress(offset_t address)
Forcibly resets starting address of segment.
Definition segment.cc:234
offset_t TotalSize()
Retrieves total size of segment.
Definition segment.cc:157
bool IsMissing()
Segment that contains neither non zero filled, nor zero filled, nor optional extra data.
Definition segment.cc:8
void SetEndAddress(offset_t address)
Increases final section to end on specified address.
Definition segment.cc:184
offset_t GetStartAddress()
Returns starting address (base_address)
Definition segment.cc:174
offset_t align
Alignment requirements of segment.
Definition segment.h:42
A helper class, encapsulating functionality needed to export binary data.
Definition writer.h:15