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);
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;
132 offset_t
WriteFile(std::ostream& out, offset_t bytes, offset_t offset = 0)
const override
134 offset_t table_bytes =
WriteTable(out, bytes, offset);
135 return table_bytes +
Section::WriteFile(out, bytes - table_bytes, offset + table_bytes);
140 offset_t table_bytes =
WriteTable(wr, bytes, offset);
141 return table_bytes +
Buffer::WriteFile(wr, bytes - table_bytes, offset + table_bytes);
152 template <
typename Int>
156 static constexpr offset_t EntrySize =
sizeof(Int);
158 static void ReadFile(std::istream& in,
Word& word, ::EndianType endian_type)
160 Reader rd(endian_type, &in);
164 static void ReadFile(
Reader& rd,
Word& word, ::EndianType endian_type = ::UndefinedEndian)
170 static void WriteFile(std::ostream& out,
const Word& word, ::EndianType endian_type, offset_t bytes = EntrySize, offset_t offset = 0)
172 Writer wr(endian_type, &out);
173 WriteFile(wr, word, endian_type, bytes, offset);
176 static void WriteFile(
Writer& wr,
const Word& word, ::EndianType endian_type = ::UndefinedEndian, offset_t bytes = EntrySize, offset_t offset = 0)
180 assert(bytes == EntrySize);
194 std::optional<Target> target;
206 bool operator ==(
const GOTEntry& other)
const
208 return target == other.target;
offset_t WriteFile(Writer &wr, offset_t count, offset_t offset=0) const override
Writes data of non-zero filled sections.
Definition buffer.cc:43
An entry in the Global Offset Table.
Definition table_section.h:192
A generated Global Offset Table.
Definition table_section.h:214
A helper class, encapsulating functionality needed to import binary data.
Definition reader.h:16
uint64_t ReadUnsigned(size_t bytes, EndianType endiantype)
Read an unsigned word.
Definition reader.cc:86
A section of data as read from an object file.
Definition section.h:24
virtual void Reset()
Clear the section.
Definition section.cc:369
virtual offset_t WriteFile(std::ostream &out, offset_t bytes, offset_t offset=0) const
Writes data into file.
Definition section.cc:355
virtual void ReadFile(std::istream &in)
Overwrites section data with contents of input stream.
Definition section.cc:343
std::string name
Name of the section.
Definition section.h:29
@ Readable
The data in the section can be read at runtime.
Definition section.h:43
@ ZeroFilled
Section is filled with zeros.
Definition section.h:69
section_flags flags
The type of the section.
Definition section.h:105
An automatically generated section that stores a table of equally sized entries.
Definition table_section.h:19
offset_t WriteFile(std::ostream &out, offset_t bytes, offset_t offset=0) const override
Writes data into file.
Definition table_section.h:132
void Reset() override
Clear the section.
Definition table_section.h:144
std::vector< TableEntryType > entries
List of entries to be stored in the table.
Definition table_section.h:24
offset_t WriteFile(Writer &wr, offset_t bytes, offset_t offset=0) const override
Writes data of non-zero filled sections.
Definition table_section.h:138
offset_t WriteTable(OutputType &out, offset_t bytes, offset_t offset) const
Generic function to handle writing entries.
Definition table_section.h:69
::EndianType endian_type
Endianness of table entries.
Definition table_section.h:22
void ReadFile(Reader &rd) override
Overwrites section data with contents of input stream.
Definition table_section.h:58
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
A helper class, encapsulating functionality needed to export binary data.
Definition writer.h:15
void WriteWord(size_t bytes, uint64_t value, EndianType endiantype)
Read a word.
Definition writer.cc:66
Generic template to be used as table entries.
Definition table_section.h:154
Int value
The value to be stored.
Definition table_section.h:186