17 template <
typename TableEntryType>
38 offset_t Size()
const override
40 return entries.size() * TableEntryType::EntrySize + data.size();
43 offset_t SetZeroFilled(
bool is_zero_filled)
override
45 assert(!is_zero_filled);
58 void ReadFile(
const std::shared_ptr<Reader>& rd)
override
68 template <
typename OutputType>
69 offset_t
WriteTable(OutputType& out, offset_t bytes, offset_t offset)
const
71 if(offset / TableEntryType::EntrySize >=
entries.size())
74 bytes = std::min(bytes,
entries.size() * TableEntryType::EntrySize - offset);
76 offset_t output_byte_count = 0;
77 offset_t offset_in_entry = offset % TableEntryType::EntrySize;
78 if(offset_in_entry != 0)
80 if(offset + bytes >= TableEntryType::EntrySize)
83 TableEntryType::WriteFile(out,
entries[offset / TableEntryType::EntrySize],
85 TableEntryType::EntrySize,
87 output_byte_count += TableEntryType::EntrySize - offset_in_entry;
88 offset += TableEntryType::EntrySize - offset_in_entry;
93 TableEntryType::WriteFile(out,
entries[offset / TableEntryType::EntrySize],
95 bytes - offset_in_entry,
97 output_byte_count += bytes;
104 offset_t entry_index = offset / TableEntryType::EntrySize;
105 entry_index <
entries.size() && entry_index < (offset + bytes) / TableEntryType::EntrySize;
110 output_byte_count += TableEntryType::EntrySize;
113 if(offset / TableEntryType::EntrySize <
entries.size())
115 offset_t bytes_in_entry = bytes % TableEntryType::EntrySize;
116 if(bytes_in_entry != 0)
119 TableEntryType::WriteFile(out,
entries[offset / TableEntryType::EntrySize],
123 output_byte_count += bytes;
127 return output_byte_count;
133 offset_t
WriteFile(std::ostream& out, offset_t bytes, offset_t offset = 0)
const override
135 offset_t table_bytes =
WriteTable(out, bytes, offset);
136 return table_bytes +
Section::WriteFile(out, bytes - table_bytes, offset + table_bytes);
139 offset_t
WriteFile(
const std::shared_ptr<Writer>& wr, offset_t bytes, offset_t offset = 0)
const override
141 offset_t table_bytes =
WriteTable(wr, bytes, offset);
142 return table_bytes +
Buffer::WriteFile(wr, bytes - table_bytes, offset + table_bytes);
145 size_t ReadData(
size_t bytes, offset_t offset,
void * buffer)
const override
147 Linker::FatalError(
"Fatal error: ReadData not implemented");
158 template <
typename Int>
162 static constexpr offset_t EntrySize =
sizeof(Int);
164 static void ReadFile(std::istream& in,
Word& word, ::EndianType endian_type)
166 auto rd = std::make_shared<StreamReader>(endian_type, in);
170 static void ReadFile(
const std::shared_ptr<Reader>& rd,
Word& word, ::EndianType endian_type = ::UndefinedEndian)
173 word.
value = rd->ReadUnsigned(EntrySize);
176 static void WriteFile(std::ostream& out,
const Word& word, ::EndianType endian_type, offset_t bytes = EntrySize, offset_t offset = 0)
178 auto wr = std::make_shared<StreamWriter>(endian_type, &out);
179 WriteFile(wr, word, endian_type, bytes, offset);
182 static void WriteFile(
const std::shared_ptr<Writer>& wr,
const Word& word, ::EndianType endian_type = ::UndefinedEndian, offset_t bytes = EntrySize, offset_t offset = 0)
186 assert(bytes == EntrySize);
188 wr->WriteWord(EntrySize, word.
value);
200 std::optional<Target> target;
212 bool operator ==(
const GOTEntry& other)
const
214 return target == other.target;
offset_t WriteFile(const std::shared_ptr< Writer > &wr, offset_t count, offset_t offset=0) const override
Writes data of non-zero filled sections.
Definition buffer.cc:108
virtual offset_t WriteFile(const std::shared_ptr< Writer > &wr) const =0
Writes data of non-zero filled sections.
An entry in the Global Offset Table.
Definition table_section.h:198
A generated Global Offset Table.
Definition table_section.h:220
A section of data as read from an object file.
Definition section.h:28
virtual void Reset()
Clear the section.
Definition section.cc:363
virtual offset_t WriteFile(std::ostream &out, offset_t bytes, offset_t offset=0) const
Writes data into file.
Definition section.cc:349
virtual void ReadFile(std::istream &in)
Overwrites section data with contents of input stream.
Definition section.cc:337
std::string name
Name of the section.
Definition section.h:33
@ Readable
The data in the section can be read at runtime.
Definition section.h:47
@ ZeroFilled
Section is filled with zeros.
Definition section.h:73
section_flags flags
The type of the section.
Definition section.h:109
An automatically generated section that stores a table of equally sized entries.
Definition table_section.h:19
void ReadFile(const std::shared_ptr< Reader > &rd) override
Overwrites section data with contents of reader.
Definition table_section.h:58
offset_t WriteFile(std::ostream &out, offset_t bytes, offset_t offset=0) const override
Writes data into file.
Definition table_section.h:133
void Reset() override
Clear the section.
Definition table_section.h:150
std::vector< TableEntryType > entries
List of entries to be stored in the table.
Definition table_section.h:24
offset_t WriteTable(OutputType &out, offset_t bytes, offset_t offset) const
Generic function to handle writing entries.
Definition table_section.h:69
offset_t WriteFile(const std::shared_ptr< Writer > &wr, offset_t bytes, offset_t offset=0) const override
Writes data of non-zero filled sections.
Definition table_section.h:139
::EndianType endian_type
Endianness of table entries.
Definition table_section.h:22
size_t ReadData(size_t bytes, offset_t offset, void *buffer) const override
Attempts to fill a buffer with data.
Definition table_section.h:145
void ReadFile(std::istream &in) override
Overwrites section data with contents of input stream.
Definition table_section.h:49
Represents a possible target or reference frame of a relocation.
Definition target.h:24
Generic template to be used as table entries.
Definition table_section.h:160
Int value
The value to be stored.
Definition table_section.h:192