MCPcopy Create free account
hub / github.com/danoon2/Boxedwine / getMemSizeOfElf

Method getMemSizeOfElf

source/kernel/loader/loader.cpp:159–191  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

157}
158
159int 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
193U32 getPELoadAddress(struct FsOpenNode* openNode, U32* section, U32* numberOfSections, U32* sizeOfSection) {
194 static U8 buffer[1024];

Callers

nothing calls this directly

Calls 4

isValidElfFunction · 0.85
getFilePointerMethod · 0.45
seekMethod · 0.45
readNativeMethod · 0.45

Tested by

no test coverage detected