| 157 | } |
| 158 | |
| 159 | int ElfLoader::getMemSizeOfElf(FsOpenNode* openNode) { |
| 160 | U8 buffer[sizeof(struct k_Elf32_Ehdr)] = { 0 }; |
| 161 | struct k_Elf32_Ehdr* hdr = (struct k_Elf32_Ehdr*)buffer; |
| 162 | U64 pos = openNode->getFilePointer(); |
| 163 | U32 address = 0xFFFFFFFF; |
| 164 | int sections = 0; |
| 165 | |
| 166 | openNode->seek(0); |
| 167 | U32 len = openNode->readNative(buffer, sizeof(buffer)); |
| 168 | if (len != sizeof(buffer)) { |
| 169 | return 0; |
| 170 | } |
| 171 | if (!isValidElf(hdr)) { |
| 172 | openNode->seek(pos); |
| 173 | return 0; |
| 174 | } |
| 175 | |
| 176 | len = 0; |
| 177 | openNode->seek(hdr->e_phoff); |
| 178 | for (int i = 0; i<hdr->e_phnum; i++) { |
| 179 | struct k_Elf32_Phdr phdr; |
| 180 | openNode->readNative((U8*)&phdr, sizeof(struct k_Elf32_Phdr)); |
| 181 | if (phdr.p_type == PT_LOAD) { |
| 182 | if (phdr.p_paddr<address) |
| 183 | address = phdr.p_paddr; |
| 184 | if (len<phdr.p_paddr + phdr.p_memsz) |
| 185 | len = phdr.p_paddr + phdr.p_memsz; |
| 186 | sections++; |
| 187 | } |
| 188 | } |
| 189 | openNode->seek(pos); |
| 190 | return len - address + 4096*sections; // 4096 for alignment |
| 191 | } |
| 192 | #if 0 |
| 193 | U32 getPELoadAddress(struct FsOpenNode* openNode, U32* section, U32* numberOfSections, U32* sizeOfSection) { |
| 194 | static U8 buffer[1024]; |
nothing calls this directly
no test coverage detected