Lines Matching refs:info
318 static void *sym_get_data_by_offset(const struct elf_info *info, in sym_get_data_by_offset() argument
321 Elf_Shdr *sechdr = &info->sechdrs[secindex]; in sym_get_data_by_offset()
323 return (void *)info->hdr + sechdr->sh_offset + offset; in sym_get_data_by_offset()
326 void *sym_get_data(const struct elf_info *info, const Elf_Sym *sym) in sym_get_data() argument
328 return sym_get_data_by_offset(info, get_secindex(info, sym), in sym_get_data()
332 static const char *sech_name(const struct elf_info *info, Elf_Shdr *sechdr) in sech_name() argument
334 return sym_get_data_by_offset(info, info->secindex_strings, in sech_name()
338 static const char *sec_name(const struct elf_info *info, unsigned int secindex) in sec_name() argument
345 if (secindex >= info->num_sections) in sec_name()
348 return sech_name(info, &info->sechdrs[secindex]); in sec_name()
405 static int parse_elf(struct elf_info *info, const char *filename) in parse_elf() argument
414 hdr = grab_file(filename, &info->size); in parse_elf()
424 info->hdr = hdr; in parse_elf()
425 if (info->size < sizeof(*hdr)) { in parse_elf()
464 info->sechdrs = sechdrs; in parse_elf()
471 if (hdr->e_shoff > info->size) in parse_elf()
473 (unsigned long)hdr->e_shoff, filename, info->size); in parse_elf()
480 info->num_sections = TO_NATIVE(sechdrs[0].sh_size); in parse_elf()
483 info->num_sections = hdr->e_shnum; in parse_elf()
486 info->secindex_strings = TO_NATIVE(sechdrs[0].sh_link); in parse_elf()
489 info->secindex_strings = hdr->e_shstrndx; in parse_elf()
493 for (i = 0; i < info->num_sections; i++) { in parse_elf()
506 secstrings = (void *)hdr + sechdrs[info->secindex_strings].sh_offset; in parse_elf()
507 for (i = 1; i < info->num_sections; i++) { in parse_elf()
511 if (!nobits && sechdrs[i].sh_offset > info->size) in parse_elf()
520 info->modinfo = (void *)hdr + sechdrs[i].sh_offset; in parse_elf()
521 info->modinfo_len = sechdrs[i].sh_size; in parse_elf()
523 info->export_symbol_secndx = i; in parse_elf()
525 info->no_trim_symbol = (void *)hdr + sechdrs[i].sh_offset; in parse_elf()
526 info->no_trim_symbol_len = sechdrs[i].sh_size; in parse_elf()
532 info->symtab_start = (void *)hdr + in parse_elf()
534 info->symtab_stop = (void *)hdr + in parse_elf()
537 info->strtab = (void *)hdr + in parse_elf()
544 info->symtab_shndx_start = (void *)hdr + in parse_elf()
546 info->symtab_shndx_stop = (void *)hdr + in parse_elf()
550 if (!info->symtab_start) in parse_elf()
554 for (sym = info->symtab_start; sym < info->symtab_stop; sym++) { in parse_elf()
568 for (p = info->symtab_shndx_start; p < info->symtab_shndx_stop; in parse_elf()
573 symsearch_init(info); in parse_elf()
578 static void parse_elf_finish(struct elf_info *info) in parse_elf_finish() argument
580 symsearch_finish(info); in parse_elf_finish()
581 release_file(info->hdr, info->size); in parse_elf_finish()
584 static int ignore_undef_symbol(struct elf_info *info, const char *symname) in ignore_undef_symbol() argument
592 if (info->hdr->e_machine == EM_PPC) in ignore_undef_symbol()
601 if (info->hdr->e_machine == EM_PPC64) in ignore_undef_symbol()
613 static void handle_symbol(struct module *mod, struct elf_info *info, in handle_symbol() argument
628 if (ignore_undef_symbol(info, symname)) in handle_symbol()
630 if (info->hdr->e_machine == EM_SPARC || in handle_symbol()
631 info->hdr->e_machine == EM_SPARCV9) { in handle_symbol()
676 static char *get_next_modinfo(struct elf_info *info, const char *tag, in get_next_modinfo() argument
681 char *modinfo = info->modinfo; in get_next_modinfo()
682 unsigned long size = info->modinfo_len; in get_next_modinfo()
696 static char *get_modinfo(struct elf_info *info, const char *tag) in get_modinfo() argument
699 return get_next_modinfo(info, tag, NULL); in get_modinfo()
1566 struct elf_info info = { }; in read_symbols() local
1569 if (!parse_elf(&info, modname)) in read_symbols()
1581 if (info.no_trim_symbol_len) { in read_symbols()
1582 mod->no_trim_symbol = xmalloc(info.no_trim_symbol_len); in read_symbols()
1583 memcpy(mod->no_trim_symbol, info.no_trim_symbol, in read_symbols()
1584 info.no_trim_symbol_len); in read_symbols()
1585 mod->no_trim_symbol_len = info.no_trim_symbol_len; in read_symbols()
1589 license = get_modinfo(&info, "license"); in read_symbols()
1597 license = get_next_modinfo(&info, "license", license); in read_symbols()
1600 for (namespace = get_modinfo(&info, "import_ns"); in read_symbols()
1602 namespace = get_next_modinfo(&info, "import_ns", namespace)) { in read_symbols()
1610 if (!get_modinfo(&info, "description")) in read_symbols()
1614 for (sym = info.symtab_start; sym < info.symtab_stop; sym++) { in read_symbols()
1615 symname = remove_dot(info.strtab + sym->st_name); in read_symbols()
1617 handle_symbol(mod, &info, sym, symname); in read_symbols()
1618 handle_moddevtable(mod, &info, sym, symname); in read_symbols()
1621 check_sec_ref(mod, &info); in read_symbols()
1624 version = get_modinfo(&info, "version"); in read_symbols()
1630 parse_elf_finish(&info); in read_symbols()