static void load_elf_by_id(struct cmd_file_t *cmd_file, const char *id) { struct cmd_source_t *src = db_find_source_by_id(cmd_file, id); if(src == NULL) bug("undefined reference to source '%s'\n", id); /* avoid reloading */ if(src->type == CMD_SRC_ELF && src->loaded) return; if(src->type != CMD_SRC_UNK) bug("source '%s' seen both as elf and binary file\n", id); /* resolve potential extern file */ resolve_extern(src); /* load it */ src->type = CMD_SRC_ELF; FILE *fd = fopen(src->filename, "rb"); if(fd == NULL) bug("cannot open '%s' (id '%s')\n", src->filename, id); if(g_debug) printf("Loading ELF file '%s'...\n", src->filename); elf_init(&src->elf); src->loaded = elf_read_file(&src->elf, elf_read, elf_printf, fd); fclose(fd); if(!src->loaded) bug("error loading elf file '%s' (id '%s')\n", src->filename, id); elf_translate_addresses(&src->elf); }
static int load_elf(struct sb1_file_t *sb, const char *filename, int act) { struct elf_params_t elf; FILE *fd = fopen(filename, "rb"); if(fd == NULL) bug("cannot open '%s'\n", filename); if(g_debug) printf("Loading elf file '%s'...\n", filename); elf_init(&elf); bool loaded = elf_read_file(&elf, elf_std_read, generic_std_printf, fd); fclose(fd); if(!loaded) bug("error loading elf file '%s'\n", filename); elf_sort_by_address(&elf); struct elf_section_t *esec = elf.first_section; while(esec) { if(esec->type == EST_LOAD) sb1_add_load(sb, esec->section, esec->size, esec->addr); else if(esec->type == EST_FILL) sb1_add_fill(sb, esec->pattern, esec->size, esec->addr); esec = esec->next; } int ret = 0; if(act == SB1_INST_JUMP || act == SB1_INST_CALL) { if(!elf.has_start_addr) bug("Cannot jump/call: '%s' has no start address!\n", filename); if(act == SB1_INST_JUMP) ret = sb1_add_jump(sb, elf.start_addr, g_jump_arg); else ret = sb1_add_call(sb, elf.start_addr, g_jump_arg); } elf_release(&elf); return ret; }