struct lookup_table *lookup_open(char *symtab_path, char *symvers_path, char *hint, struct sym_compare_type *locals) { struct lookup_table *table; table = malloc(sizeof(*table)); if (!table) ERROR("malloc table"); memset(table, 0, sizeof(*table)); symtab_read(table, symtab_path); symvers_read(table, symvers_path); find_local_syms(table, hint, locals); return table; }
int parse_elf(const struct buffer *pinput, struct parsed_elf *pelf, int flags) { struct xdr *xdr = &xdr_le; int bit64 = 0; struct buffer input; Elf64_Ehdr *ehdr; /* Zero out the parsed elf structure. */ memset(pelf, 0, sizeof(*pelf)); if (!iself(buffer_get(pinput))) { ERROR("The stage file is not in ELF format!\n"); return -1; } buffer_clone(&input, pinput); ehdr = &pelf->ehdr; elf_eident(&input, ehdr); bit64 = ehdr->e_ident[EI_CLASS] == ELFCLASS64; /* Assume LE unless we are sure otherwise. * We're not going to take on the task of * fully validating the ELF file. That way * lies madness. */ if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) xdr = &xdr_be; elf_ehdr(&input, ehdr, xdr, bit64); /* Relocation processing requires section header parsing. */ if (flags & ELF_PARSE_RELOC) flags |= ELF_PARSE_SHDR; /* String table processing requires section header parsing. */ if (flags & ELF_PARSE_STRTAB) flags |= ELF_PARSE_SHDR; /* Symbole table processing requires section header parsing. */ if (flags & ELF_PARSE_SYMTAB) flags |= ELF_PARSE_SHDR; if ((flags & ELF_PARSE_PHDR) && phdr_read(pinput, pelf, xdr, bit64)) goto fail; if ((flags & ELF_PARSE_SHDR) && shdr_read(pinput, pelf, xdr, bit64)) goto fail; if ((flags & ELF_PARSE_RELOC) && reloc_read(pinput, pelf, xdr, bit64)) goto fail; if ((flags & ELF_PARSE_STRTAB) && strtab_read(pinput, pelf)) goto fail; if ((flags & ELF_PARSE_SYMTAB) && symtab_read(pinput, pelf, xdr, bit64)) goto fail; return 0; fail: parsed_elf_destroy(pelf); return -1; }