69 class SegmentIterator {
71 using iterator_category = std::input_iterator_tag;
73 using difference_type =
decltype(
static_cast<int *
>(
nullptr) -
static_cast<int *
>(
nullptr));
77 SegmentIterator(std::istream *file, std::streamoff pos, std::size_t index, std::size_t count)
78 : stream_(file), pos_(pos), index_(index), count_(count), phdr_() {
79 if (index_ < count_) {
80 stream_->seekg(pos_ + index_ *
static_cast<std::streamoff
>(
sizeof(
Elf32_Phdr)),
82 stream_->read(
reinterpret_cast<char *
>(&phdr_),
sizeof(
Elf32_Phdr));
86 reference operator*()
const {
return phdr_; }
87 pointer operator->()
const {
return &phdr_; }
89 SegmentIterator &operator++() {
90 if (++index_ < count_) {
91 stream_->seekg(pos_ + index_ *
static_cast<std::streamoff
>(
sizeof(
Elf32_Phdr)),
93 stream_->read(
reinterpret_cast<char *
>(&phdr_),
sizeof(
Elf32_Phdr));
98 SegmentIterator operator++(
int) {
99 SegmentIterator tmp(*
this);
104 bool operator==(
const SegmentIterator &other)
const {
return index_ == other.index_; }
105 bool operator!=(
const SegmentIterator &other)
const {
return index_ != other.index_; }
108 std::istream *stream_;
118 stream.read(
reinterpret_cast<char *
>(&ehdr),
sizeof(ehdr));
125 if (ehdr.e_ident[0] != 0x7f || ehdr.e_ident[1] !=
'E' || ehdr.e_ident[2] !=
'L' ||
126 ehdr.e_ident[3] !=
'F') {
132 if (ehdr.e_ident[4] != 1) {
138 return Ok(ElfReader(stream, ehdr.e_phoff, ehdr.e_phnum, ehdr.e_entry));
146 u32 GetEntryPoint()
const {
return entry_point_; }
148 Result<void> GetSegmentData(
const Elf32_Phdr &phdr, u8 *buffer, u32 buffer_size, u32 buffer_vadr,
150 if (buffer_size < phdr.p_filesz) {
154 stream_.seekg(phdr.p_offset, std::ios::beg);
155 stream_.read(
reinterpret_cast<char *
>(buffer) + (segment_vadr - buffer_vadr), buffer_size);
156 if (!stream_.good()) {
163 ElfReader() : stream_(null_stream), phoff_(0), phnum_(0), entry_point_(0) {};
165 ElfReader(std::istream &stream, std::streamoff phoff, std::size_t phnum, u32 entry_point)
166 : stream_(stream), phoff_(phoff), phnum_(phnum), entry_point_(entry_point) {}
169 std::istream &stream_;
170 std::streamoff phoff_;