/* Load an ELF file */ int load_elf(const char *elf) { int ret = 0; do { g_elfdata = load_file(elf); if(g_elfdata == NULL) { break; } if(!validate_header(g_elfdata)) { break; } if(!load_sections(g_elfdata)) { break; } if(!process_relocs()) { break; } reindex_sections(); ret = 1; } while(0); return ret; }
int bflt_fload(FILE* fp, void **mem_ptr, size_t *mem_size, int (**entry_address_ptr)(int,char*[])) { void * mem = NULL; struct flat_hdr header; info("Begin loading"); if (!fp) error_goto_error("Recieved bad file pointer"); if (read_header(fp, &header) != 0) error_goto_error("Could not parse header"); if (check_header(&header) != 0) error_goto_error("Bad header"); size_t binary_size = header.bss_end - header.entry; info("Attempting to alloc %u bytes",binary_size); mem = malloc(binary_size); if (!mem) error_goto_error("Failed to alloc binary memory"); if (copy_segments(fp, &header, mem, binary_size) != 0) error_goto_error("Failed to copy segments"); if (process_relocs(fp, &header, mem) != 0) error_goto_error("Failed to relocate"); /* only attempt to process GOT if the flags tell us a GOT exists AND if the Ndless startup file is not already doing so */ if (header.flags & FLAT_FLAG_GOTPIC && memcmp(mem, "PRG\0", 4) != 0) { if (process_got(&header, mem) != 0) error_goto_error("Failed to process got"); }else{ info("No need to process got - skipping"); } *mem_ptr = mem; *mem_size = binary_size; if (memcmp(mem, "PRG\0", 4) == 0) { info("Detected as ndless program packaged in a bFLT file"); *entry_address_ptr = (int (*)(int,char*[]))((char*)mem + 4); }else{ info("Detected as ordinary bFLT executable"); *entry_address_ptr = (int (*)(int,char*[]))mem; } info("Successfully loaded bFLT executable to memory"); return 0; error: if (mem) free(mem); *mem_ptr = NULL; *entry_address_ptr = NULL; *mem_size = 0; error_return("Caught error - exiting"); }