Lines Matching full:elf
15 #include <elf.h>
429 /* Is this a valid ELF file? */
434 /* Not an ELF file - silently ignore it */
449 /* Fix endianness in ELF header */
702 static const char *sym_name(struct elf_info *elf, Elf_Sym *sym)
704 return sym ? elf->strtab + sym->st_name : "";
762 static void check_section(const char *modname, struct elf_info *elf,
765 const char *sec = sech_name(elf, sechdr);
977 static Elf_Sym *find_fromsym(struct elf_info *elf, Elf_Addr addr,
980 return symsearch_find_nearest(elf, addr, secndx, false, ~0);
983 static Elf_Sym *find_tosym(struct elf_info *elf, Elf_Addr addr, Elf_Sym *sym)
988 if (is_valid_name(elf, sym))
995 new_sym = symsearch_find_nearest(elf, addr, get_secindex(elf, sym),
1000 static bool is_executable_section(struct elf_info *elf, unsigned int secndx)
1002 if (secndx >= elf->num_sections)
1005 return (elf->sechdrs[secndx].sh_flags & SHF_EXECINSTR) != 0;
1008 static void default_mismatch_handler(const char *modname, struct elf_info *elf,
1019 from = find_fromsym(elf, faddr, fsecndx);
1020 fromsym = sym_name(elf, from);
1022 tsym = find_tosym(elf, taddr, tsym);
1023 tosym = sym_name(elf, tsym);
1051 else if (is_executable_section(elf, get_secindex(elf, tsym)))
1066 static void check_export_symbol(struct module *mod, struct elf_info *elf,
1076 label = find_fromsym(elf, faddr, elf->export_symbol_secndx);
1077 label_name = sym_name(elf, label);
1092 name = sym_name(elf, sym);
1099 data = sym_get_data(elf, label); /* license */
1123 if (elf->hdr->e_ident[EI_CLASS] == ELFCLASS64 &&
1124 elf->hdr->e_machine == EM_PARISC &&
1136 static void check_section_mismatch(struct module *mod, struct elf_info *elf,
1141 const char *tosec = sec_name(elf, get_secindex(elf, sym));
1144 if (module_enabled && elf->export_symbol_secndx == fsecndx) {
1145 check_export_symbol(mod, elf, faddr, tosec, sym);
1153 default_mismatch_handler(mod->name, elf, mismatch, sym,
1301 static void get_rel_type_and_sym(struct elf_info *elf, uint64_t r_info,
1312 bool is_64bit = (elf->hdr->e_ident[EI_CLASS] == ELFCLASS64);
1314 if (elf->hdr->e_machine == EM_MIPS && is_64bit) {
1331 static void section_rela(struct module *mod, struct elf_info *elf,
1343 get_rel_type_and_sym(elf, rela->r_info, &r_type, &r_sym);
1345 tsym = elf->symtab_start + r_sym;
1348 switch (elf->hdr->e_machine) {
1368 check_section_mismatch(mod, elf, tsym,
1373 static void section_rel(struct module *mod, struct elf_info *elf,
1386 get_rel_type_and_sym(elf, rel->r_info, &r_type, &r_sym);
1388 loc = sym_get_data_by_offset(elf, fsecndx, r_offset);
1389 tsym = elf->symtab_start + r_sym;
1391 switch (elf->hdr->e_machine) {
1405 check_section_mismatch(mod, elf, tsym,
1422 static void check_sec_ref(struct module *mod, struct elf_info *elf)
1427 for (i = 0; i < elf->num_sections; i++) {
1428 Elf_Shdr *sechdr = &elf->sechdrs[i];
1430 check_section(mod->name, elf, sechdr);
1435 const char *secname = sec_name(elf, secndx);
1442 start = sym_get_data_by_offset(elf, i, 0);
1446 section_rela(mod, elf, secndx, secname,
1449 section_rel(mod, elf, secndx, secname,