| 95 | } |
| 96 | |
| 97 | std::optional<std::span<const u8>> ElfFile::get_virtual(u32 address, u32 size) const |
| 98 | { |
| 99 | u32 end_address = address + size; |
| 100 | |
| 101 | if(end_address >= address) { |
| 102 | for(const ElfProgramHeader& segment : segments) { |
| 103 | if(address >= segment.vaddr && end_address <= segment.vaddr + segment.filesz) { |
| 104 | size_t begin_offset = segment.offset + (address - segment.vaddr); |
| 105 | size_t end_offset = begin_offset + size; |
| 106 | if(begin_offset <= image.size() && end_offset <= image.size()) { |
| 107 | return std::span<const u8>(image.data() + begin_offset, image.data() + end_offset); |
| 108 | } |
| 109 | } |
| 110 | } |
| 111 | } |
| 112 | |
| 113 | return std::nullopt; |
| 114 | } |
| 115 | |
| 116 | bool ElfFile::copy_virtual(u8* dest, u32 address, u32 size) const |
| 117 | { |
no test coverage detected