Lines Matching refs:elf
711 static const char *sym_name(struct elf_info *elf, Elf_Sym *sym) in sym_name() argument
714 return elf->strtab + sym->st_name; in sym_name()
774 static void check_section(const char *modname, struct elf_info *elf, in check_section() argument
777 const char *sec = sech_name(elf, sechdr); in check_section()
1062 static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym) in is_valid_name() argument
1064 const char *name = elf->strtab + sym->st_name; in is_valid_name()
1072 static Elf_Sym *find_nearest_sym(struct elf_info *elf, Elf_Addr addr, in find_nearest_sym() argument
1079 bool is_arm = (elf->hdr->e_machine == EM_ARM); in find_nearest_sym()
1081 for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) { in find_nearest_sym()
1082 if (get_secindex(elf, sym) != secndx) in find_nearest_sym()
1084 if (!is_valid_name(elf, sym)) in find_nearest_sym()
1114 static Elf_Sym *find_fromsym(struct elf_info *elf, Elf_Addr addr, in find_fromsym() argument
1117 return find_nearest_sym(elf, addr, secndx, false, ~0); in find_fromsym()
1120 static Elf_Sym *find_tosym(struct elf_info *elf, Elf_Addr addr, Elf_Sym *sym) in find_tosym() argument
1123 if (is_valid_name(elf, sym)) in find_tosym()
1130 return find_nearest_sym(elf, addr, get_secindex(elf, sym), true, 20); in find_tosym()
1133 static bool is_executable_section(struct elf_info *elf, unsigned int secndx) in is_executable_section() argument
1135 if (secndx >= elf->num_sections) in is_executable_section()
1138 return (elf->sechdrs[secndx].sh_flags & SHF_EXECINSTR) != 0; in is_executable_section()
1141 static void default_mismatch_handler(const char *modname, struct elf_info *elf, in default_mismatch_handler() argument
1151 from = find_fromsym(elf, faddr, fsecndx); in default_mismatch_handler()
1152 fromsym = sym_name(elf, from); in default_mismatch_handler()
1154 tsym = find_tosym(elf, taddr, tsym); in default_mismatch_handler()
1155 tosym = sym_name(elf, tsym); in default_mismatch_handler()
1174 else if (is_executable_section(elf, get_secindex(elf, tsym))) in default_mismatch_handler()
1189 static void check_export_symbol(struct module *mod, struct elf_info *elf, in check_export_symbol() argument
1199 label = find_fromsym(elf, faddr, elf->export_symbol_secndx); in check_export_symbol()
1200 label_name = sym_name(elf, label); in check_export_symbol()
1215 name = sym_name(elf, sym); in check_export_symbol()
1222 data = sym_get_data(elf, label); /* license */ in check_export_symbol()
1246 if (elf->hdr->e_ident[EI_CLASS] == ELFCLASS64 && in check_export_symbol()
1247 elf->hdr->e_machine == EM_PARISC && in check_export_symbol()
1259 static void check_section_mismatch(struct module *mod, struct elf_info *elf, in check_section_mismatch() argument
1264 const char *tosec = sec_name(elf, get_secindex(elf, sym)); in check_section_mismatch()
1267 if (module_enabled && elf->export_symbol_secndx == fsecndx) { in check_section_mismatch()
1268 check_export_symbol(mod, elf, faddr, tosec, sym); in check_section_mismatch()
1276 default_mismatch_handler(mod->name, elf, mismatch, sym, in check_section_mismatch()
1450 static void get_rel_type_and_sym(struct elf_info *elf, uint64_t r_info, in get_rel_type_and_sym() argument
1461 bool is_64bit = (elf->hdr->e_ident[EI_CLASS] == ELFCLASS64); in get_rel_type_and_sym()
1463 if (elf->hdr->e_machine == EM_MIPS && is_64bit) { in get_rel_type_and_sym()
1485 static void section_rela(struct module *mod, struct elf_info *elf, in section_rela() argument
1490 const char *fromsec = sec_name(elf, fsecndx); in section_rela()
1491 Elf_Rela *start = (void *)elf->hdr + sechdr->sh_offset; in section_rela()
1503 get_rel_type_and_sym(elf, rela->r_info, &r_type, &r_sym); in section_rela()
1507 switch (elf->hdr->e_machine) { in section_rela()
1520 check_section_mismatch(mod, elf, elf->symtab_start + r_sym, in section_rela()
1525 static void section_rel(struct module *mod, struct elf_info *elf, in section_rel() argument
1530 const char *fromsec = sec_name(elf, fsecndx); in section_rel()
1531 Elf_Rel *start = (void *)elf->hdr + sechdr->sh_offset; in section_rel()
1545 get_rel_type_and_sym(elf, rel->r_info, &r_type, &r_sym); in section_rel()
1547 loc = sym_get_data_by_offset(elf, fsecndx, r_offset); in section_rel()
1548 tsym = elf->symtab_start + r_sym; in section_rel()
1550 switch (elf->hdr->e_machine) { in section_rel()
1564 check_section_mismatch(mod, elf, tsym, in section_rel()
1581 static void check_sec_ref(struct module *mod, struct elf_info *elf) in check_sec_ref() argument
1584 Elf_Shdr *sechdrs = elf->sechdrs; in check_sec_ref()
1587 for (i = 0; i < elf->num_sections; i++) { in check_sec_ref()
1588 check_section(mod->name, elf, &elf->sechdrs[i]); in check_sec_ref()
1591 section_rela(mod, elf, &elf->sechdrs[i]); in check_sec_ref()
1593 section_rel(mod, elf, &elf->sechdrs[i]); in check_sec_ref()