int load_elf(const char *elf_file) { /* Place elf file in memory */ elf_info.loc = read_elf(elf_file); if(!elf_info.loc){ return ELF_READ_ERR; } printf("Base Address: %#02X\n",elf_info.loc); return 0; }
void breakpoints_init(Process *proc) { struct library_symbol *sym; debug(DEBUG_FUNCTION, "breakpoints_init(pid=%d)", proc->pid); if (proc->breakpoints) { /* let's remove that struct */ dict_apply_to_all(proc->breakpoints, free_bp_cb, NULL); dict_clear(proc->breakpoints); proc->breakpoints = NULL; } proc->breakpoints = dict_init(dict_key2hash_int, dict_key_cmp_int); if (options.libcalls && proc->filename) { /* FIXME: memory leak when called by exec(): */ proc->list_of_symbols = read_elf(proc); if (opt_e) { struct library_symbol **tmp1 = &(proc->list_of_symbols); while (*tmp1) { struct opt_e_t *tmp2 = opt_e; int keep = !opt_e_enable; while (tmp2) { if (!strcmp((*tmp1)->name, tmp2->name)) { keep = opt_e_enable; } tmp2 = tmp2->next; } if (!keep) { *tmp1 = (*tmp1)->next; } else { tmp1 = &((*tmp1)->next); } } } } else { proc->list_of_symbols = NULL; } for (sym = proc->list_of_symbols; sym; sym = sym->next) { /* proc->pid==0 delays enabling. */ insert_breakpoint(proc, sym2addr(proc, sym), sym); } proc->callstack_depth = 0; proc->breakpoints_enabled = -1; }
int main(int argc, char *argv[]) { struct _memory memory; char *filename=NULL; char *uart="/dev/ttyUSB0"; int prog_type=PROG_UNDEF; int command=COMMAND_UNDEF; int param1=0,param2=0; int i; printf("\nnaken_prog - by Michael Kohn\n"); printf(" Web: http://www.mikekohn.net/\n"); printf(" Email: [email protected]\n\n"); printf("Version: "VERSION"\n\n"); if (argc<2) { printf("Usage: naken_util [options]\n"); printf(" CPU options:\n"); printf(" -lpc\n"); printf(" Command:\n"); printf(" -info\n"); printf(" -write <outfile>\n"); printf(" -read <address> <count> <infile>\n"); printf(" -execute <address>\n"); printf("\n"); exit(0); } memset(&memory, 0, sizeof(memory)); for (i=1; i<argc; i++) { if (strcmp(argv[i], "-lpc")==0) { prog_type=PROG_LPC; } else if (strcmp(argv[i], "-info")==0) { command=COMMAND_INFO; } else if (strcmp(argv[i], "-read")==0) { command=COMMAND_READ; if (i+2>=argc) { printf("Error: -read command takes 2 arguments\n"); exit(1); } param1=atoi(argv[++i]); param2=atoi(argv[++i]); } else if (strcmp(argv[i], "-write")==0) { command=COMMAND_WRITE; } else if (strcmp(argv[i], "-run")==0) { command=COMMAND_RUN; param1=atoi(argv[++i]); } else { filename=argv[i]; } } if (prog_type==PROG_UNDEF) { printf("Error: No chip type selected.\n"); exit(0); } if (command==COMMAND_INFO) { if (prog_type==PROG_LPC) { lpc_info(uart); } } else if (command==COMMAND_READ) { if (filename==NULL) { printf("No output filename. Exiting...\n"); exit(1); } memory_init(&memory, 0xffffffff, 1); lpc_memory_read(uart, &memory, param1, param2); // FIXME - make filename selectable FILE *out=fopen(filename, "wb"); write_hex(&memory, out); fclose(out); memory_free(&memory); } else if (command==COMMAND_WRITE) { unsigned char cpu_type; if (filename==NULL) { printf("No hexfile loaded. Exiting...\n"); exit(1); } memory_init(&memory, 0xffffffff, 1); if (read_elf(filename, &memory, &cpu_type, NULL)>=0) { printf("Loaded ELF %s from 0x%04x to 0x%04x\n", filename, memory.low_address, memory.high_address); } else if (read_hex(filename, &memory)>=0) { printf("Loaded hexfile %s from 0x%04x to 0x%04x\n", filename, memory.low_address, memory.high_address); } else { printf("Could not load hexfile\n"); memory_free(&memory); exit(1); } lpc_memory_write(uart, &memory); memory_free(&memory); } else if (command==COMMAND_RUN) { if (prog_type==PROG_LPC) { lpc_run(uart, param1); } } return 0; }