//-------------------------------------------------------------------------------------------------- static int section_by_index(int d, size_t const index, Elf_Shdr **section) { Elf_Ehdr *header = NULL; Elf_Shdr *sections = NULL; *section = NULL; if ( read_header(d, &header) || read_section_table(d, header, §ions) ) return errno; if (index < header->e_shnum) { *section = (Elf_Shdr *)malloc(sizeof(Elf_Shdr)); if (NULL == *section) { free(header); free(sections); return errno; } memcpy(*section, sections + index, sizeof(Elf_Shdr)); } else return EINVAL; free(header); free(sections); return 0; }
//-------------------------------------------------------------------------------------------------- static int section_by_name(int d, char const *section_name, Elf_Shdr **section) { Elf_Ehdr *header = NULL; Elf_Shdr *sections = NULL; char const *strings = NULL; size_t i; *section = NULL; if ( read_header(d, &header) || read_section_table(d, header, §ions) || read_string_table(d, §ions[header->e_shstrndx], &strings) ) return errno; for (i = 0; i < header->e_shnum; ++i) if (!strcmp(section_name, &strings[sections[i].sh_name])) { *section = (Elf_Shdr *)malloc(sizeof(Elf_Shdr)); if (NULL == *section) { free(header); free(sections); free((void *)strings); return errno; } memcpy(*section, sections + i, sizeof(Elf_Shdr)); break; } free(header); free(sections); free((void *)strings); return 0; }
//-------------------------------------------------------------------------------------------------- static int section_by_type(int d, size_t const section_type, Elf_Shdr **section) { Elf_Ehdr *header = NULL; Elf_Shdr *sections = NULL; size_t i; *section = NULL; if ( read_header(d, &header) || read_section_table(d, header, §ions) ) return errno; for (i = 0; i < header->e_shnum; ++i) if (section_type == sections[i].sh_type) { *section = (Elf_Shdr *)malloc(sizeof(Elf_Shdr)); if (NULL == *section) { free(header); free(sections); return errno; } memcpy(*section, sections + i, sizeof(Elf_Shdr)); break; } free(header); free(sections); return 0; }