/* flat_decode */ static int _flat_decode(AsmFormatPlugin * format, int raw) { AsmFormatPluginHelper * helper = format->helper; off_t offset; if((offset = helper->seek(helper->format, 0, SEEK_END)) >= 0 && helper->set_section(helper->format, 0, 0, ".text", 0, offset, 0) != NULL) return 0; return -1; }
static int _elf_decode32(AsmFormatPlugin * format, int raw) { AsmFormatPluginHelper * helper = format->helper; Elf32_Ehdr ehdr; Elf32_Shdr * shdr = NULL; Elf32_Addr base = 0x0; char * shstrtab = NULL; size_t shstrtab_cnt = 0; size_t i; #ifdef DEBUG fprintf(stderr, "DEBUG: %s() \"%s\"\n", __func__, helper->get_filename(helper->format)); #endif if(helper->seek(helper->format, 0, SEEK_SET) != 0 || helper->read(helper->format, &ehdr, sizeof(ehdr)) != sizeof(ehdr)) return -1; if(ehdr.e_ident[EI_DATA] != elf_arch_native->endian) _swap_32_ehdr(&ehdr); if(_decode32_shdr(format, &ehdr, &shdr) != 0) return -1; if(_decode32_addr(format, &ehdr, &base) != 0 || _decode32_strtab(format, shdr, ehdr.e_shnum, ehdr.e_shstrndx, &shstrtab, &shstrtab_cnt) != 0) { free(shdr); return -1; } for(i = 0; i < ehdr.e_shnum; i++) if(shdr[i].sh_type == SHT_SYMTAB) { /* XXX ignore errors? */ _decode32_symtab(format, &ehdr, shdr, ehdr.e_shnum, i); break; } for(i = 0; i < ehdr.e_shnum; i++) { if(shdr[i].sh_name >= shstrtab_cnt) continue; if((raw || (shdr[i].sh_type == SHT_PROGBITS && shdr[i].sh_flags & SHF_EXECINSTR)) && helper->set_section(helper->format, i, &shstrtab[shdr[i].sh_name], shdr[i].sh_offset, shdr[i].sh_size, base + shdr[i].sh_offset) < 0) break; } free(shstrtab); free(shdr); return (i == ehdr.e_shnum) ? 0 : -1; }
static int _decode_map_code(AsmFormatPlugin * format, size_t id, off_t offset, size_t size) { AsmFormatPluginHelper * helper = format->helper; #ifdef DEBUG fprintf(stderr, "DEBUG: %s(%lu, %ld, %lu)\n", __func__, id, offset, size); #endif return (helper->set_section(helper->format, id, 0, ".text", offset, size, 0) != NULL) ? 0 : -1; }