/** * elf_read_shdrs - read the section headers from the buffer * * This function assumes that the section header table was checked for sanity. * Use elf_is_ehdr_sane() if it wasn't. */ static int elf_read_shdrs(const char *buf, size_t len, struct elf_info *elf_info) { size_t shdr_size, i; /* * e_shnum is at most 65536 so calculating * the size of the section header cannot overflow. */ shdr_size = sizeof(struct elf_shdr) * elf_info->ehdr->e_shnum; elf_info->sechdrs = kzalloc(shdr_size, GFP_KERNEL); if (!elf_info->sechdrs) return -ENOMEM; for (i = 0; i < elf_info->ehdr->e_shnum; i++) { int ret; ret = elf_read_shdr(buf, len, elf_info, i); if (ret) { kfree(elf_info->sechdrs); elf_info->sechdrs = NULL; return ret; } } return 0; }
struct elf_file_t *elf_open(char *path) { struct elf_file_t *elf; /* Create structure */ elf = calloc(1, sizeof(struct elf_file_t)); if (!elf) fatal("elf_open: out of memory\n"); /// printf("\n length = %d\n",strlen(path)); /// printf("\n tryng to open %s\n",path); /* Open file */ elf->f = fopen(path, "rb"); /// printf("\n error no is %d",errno); if (!elf->f) fatal("%s: cannot open executable file", path); if (strlen(path) >= sizeof(elf->path)) fatal("%s: executable file path too long", path); strcpy(elf->path, path); /* Get file size */ fseek(elf->f, 0, SEEK_END); elf->size = ftell(elf->f); fseek(elf->f, 0, SEEK_SET); /* Read header, section headers, and program headers. */ elf_debug("\n%s: reading ELF file\n", path); elf_read_ehdr(elf); elf_read_shdr(elf); elf_read_phdr(elf); /* Return elf file structure */ return elf; }
static void remove_shnames(u64 shdr_offset, u16 n_shdr, u64 shstrtab_offset, u32 strtab_size) { u16 i; u32 size; struct elf_shdr s; if (arch64) size = 0x40; else size = 0x28; for (i = 0; i < n_shdr; i++) { elf_read_shdr(arch64, elf + shdr_offset + i * size, &s); s.sh_name = 0; if (s.sh_type == 3) { s.sh_offset = shstrtab_offset; s.sh_size = strtab_size; } elf_write_shdr(arch64, elf + shdr_offset + i * size, &s); } }