Exemple #1
0
/**
 * 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;
}
Exemple #2
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;
}
Exemple #3
0
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);
	}
}