MCPcopy Create free account
hub / github.com/TactilityProject/Tactility / esp_elf_load_segment

Function esp_elf_load_segment

Libraries/elf_loader/src/esp_elf.c:235–321  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

233 */
234
235static int esp_elf_load_segment(esp_elf_t *elf, const uint8_t *pbuf)
236{
237 uint32_t size;
238 bool first_segment = false;
239 Elf32_Addr vaddr_s = 0;
240 Elf32_Addr vaddr_e = 0;
241
242 const elf32_hdr_t *ehdr = (const elf32_hdr_t *)pbuf;
243 const elf32_phdr_t *phdr = (const elf32_phdr_t *)(pbuf + ehdr->phoff);
244
245 for (int i = 0; i < ehdr->phnum; i++) {
246 if (phdr[i].type != PT_LOAD) {
247 continue;
248 }
249
250 if (phdr[i].memsz < phdr[i].filesz) {
251 ESP_LOGE(TAG, "Invalid segment[%d], memsz: %d, filesz: %d",
252 i, phdr[i].memsz, phdr[i].filesz);
253 return -EINVAL;
254 }
255
256 if (first_segment == true) {
257 vaddr_s = phdr[i].vaddr;
258 vaddr_e = phdr[i].vaddr + phdr[i].memsz;
259 first_segment = true;
260 if (vaddr_e < vaddr_s) {
261 ESP_LOGE(TAG, "Invalid segment[%d], vaddr: 0x%x, memsz: %d",
262 i, phdr[i].vaddr, phdr[i].memsz);
263 return -EINVAL;
264 }
265 } else {
266 if (phdr[i].vaddr < vaddr_e) {
267 ESP_LOGE(TAG, "Invalid segment[%d], should not overlap, vaddr: 0x%x, vaddr_e: 0x%x\n",
268 i, phdr[i].vaddr, vaddr_e);
269 return -EINVAL;
270 }
271
272 if (phdr[i].vaddr > vaddr_e + ADDR_OFFSET) {
273 ESP_LOGI(TAG, "Too much padding before segment[%d], padding: %d",
274 i, phdr[i].vaddr - vaddr_e);
275 }
276
277 vaddr_e = phdr[i].vaddr + phdr[i].memsz;
278 if (vaddr_e < phdr[i].vaddr) {
279 ESP_LOGE(TAG, "Invalid segment[%d], address overflow, vaddr: 0x%x, vaddr_e: 0x%x\n",
280 i, phdr[i].vaddr, vaddr_e);
281 return -EINVAL;
282 }
283 }
284
285 ESP_LOGD(TAG, "LOAD segment[%d], vaddr: 0x%x, memsize: 0x%08x",
286 i, phdr[i].vaddr, phdr[i].memsz);
287 }
288
289 size = vaddr_e - vaddr_s;
290 if (size == 0) {
291 return -EINVAL;
292 }

Callers 1

esp_elf_relocateFunction · 0.85

Calls 1

esp_elf_mallocFunction · 0.85

Tested by

no test coverage detected