Lines Matching refs:elf

15 #include <elf.h>
711 static const char *sym_name(struct elf_info *elf, Elf_Sym *sym)
714 return elf->strtab + sym->st_name;
774 static void check_section(const char *modname, struct elf_info *elf,
777 const char *sec = sech_name(elf, sechdr);
1054 static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
1056 const char *name = elf->strtab + sym->st_name;
1064 static Elf_Sym *find_nearest_sym(struct elf_info *elf, Elf_Addr addr,
1071 bool is_arm = (elf->hdr->e_machine == EM_ARM);
1073 for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1074 if (get_secindex(elf, sym) != secndx)
1076 if (!is_valid_name(elf, sym))
1106 static Elf_Sym *find_fromsym(struct elf_info *elf, Elf_Addr addr,
1109 return find_nearest_sym(elf, addr, secndx, false, ~0);
1112 static Elf_Sym *find_tosym(struct elf_info *elf, Elf_Addr addr, Elf_Sym *sym)
1115 if (is_valid_name(elf, sym))
1122 return find_nearest_sym(elf, addr, get_secindex(elf, sym), true, 20);
1125 static bool is_executable_section(struct elf_info *elf, unsigned int secndx)
1127 if (secndx >= elf->num_sections)
1130 return (elf->sechdrs[secndx].sh_flags & SHF_EXECINSTR) != 0;
1133 static void default_mismatch_handler(const char *modname, struct elf_info *elf,
1143 from = find_fromsym(elf, faddr, fsecndx);
1144 fromsym = sym_name(elf, from);
1146 tsym = find_tosym(elf, taddr, tsym);
1147 tosym = sym_name(elf, tsym);
1166 else if (is_executable_section(elf, get_secindex(elf, tsym)))
1181 static void check_export_symbol(struct module *mod, struct elf_info *elf,
1191 label = find_fromsym(elf, faddr, elf->export_symbol_secndx);
1192 label_name = sym_name(elf, label);
1207 name = sym_name(elf, sym);
1214 data = sym_get_data(elf, label); /* license */
1238 if (elf->hdr->e_ident[EI_CLASS] == ELFCLASS64 &&
1239 elf->hdr->e_machine == EM_PARISC &&
1251 static void check_section_mismatch(struct module *mod, struct elf_info *elf,
1256 const char *tosec = sec_name(elf, get_secindex(elf, sym));
1259 if (module_enabled && elf->export_symbol_secndx == fsecndx) {
1260 check_export_symbol(mod, elf, faddr, tosec, sym);
1268 default_mismatch_handler(mod->name, elf, mismatch, sym,
1442 static void get_rel_type_and_sym(struct elf_info *elf, uint64_t r_info,
1453 bool is_64bit = (elf->hdr->e_ident[EI_CLASS] == ELFCLASS64);
1455 if (elf->hdr->e_machine == EM_MIPS && is_64bit) {
1477 static void section_rela(struct module *mod, struct elf_info *elf,
1482 const char *fromsec = sec_name(elf, fsecndx);
1483 Elf_Rela *start = (void *)elf->hdr + sechdr->sh_offset;
1496 get_rel_type_and_sym(elf, rela->r_info, &r_type, &r_sym);
1498 tsym = elf->symtab_start + r_sym;
1501 switch (elf->hdr->e_machine) {
1514 check_section_mismatch(mod, elf, tsym,
1519 static void section_rel(struct module *mod, struct elf_info *elf,
1524 const char *fromsec = sec_name(elf, fsecndx);
1525 Elf_Rel *start = (void *)elf->hdr + sechdr->sh_offset;
1539 get_rel_type_and_sym(elf, rel->r_info, &r_type, &r_sym);
1541 loc = sym_get_data_by_offset(elf, fsecndx, r_offset);
1542 tsym = elf->symtab_start + r_sym;
1544 switch (elf->hdr->e_machine) {
1558 check_section_mismatch(mod, elf, tsym,
1575 static void check_sec_ref(struct module *mod, struct elf_info *elf)
1578 Elf_Shdr *sechdrs = elf->sechdrs;
1581 for (i = 0; i < elf->num_sections; i++) {
1582 check_section(mod->name, elf, &elf->sechdrs[i]);
1585 section_rela(mod, elf, &elf->sechdrs[i]);
1587 section_rel(mod, elf, &elf->sechdrs[i]);