Lines Matching defs:e
527 * Multiple symbols can share a demangled name (e.g., static functions in
561 static struct symbol *find_twin(struct elfs *e, struct symbol *sym1)
572 for_each_sym_by_demangled_name(e->orig, sym1->demangled_name, sym2) {
598 for_each_sym_by_demangled_name(e->patched, sym1->demangled_name, sym2) {
711 * correlated by find_twin() (e.g., unique by name), the suffix map records
775 static struct symbol *find_twin_positional(struct elfs *e, struct symbol *sym1)
781 for_each_sym_by_demangled_name(e->orig, sym1->demangled_name, sym2) {
793 for_each_sym_by_demangled_name(e->patched, sym1->demangled_name, sym2) {
820 static int correlate_symbols(struct elfs *e)
826 for_each_sym(e->orig, sym1)
828 for_each_sym(e->patched, sym2)
832 file1_sym = first_file_symbol(e->orig);
833 file2_sym = first_file_symbol(e->patched);
835 for (; ; file1_sym = next_file_symbol(e->orig, file1_sym),
836 file2_sym = next_file_symbol(e->patched, file2_sym)) {
870 for_each_sym(e->orig, sym1) {
873 sym2 = find_twin(e, sym1);
881 if (update_suffix_map(e->orig))
884 for_each_sym(e->orig, sym1) {
887 sym2 = find_twin_suffixed(e->patched, sym1);
896 for_each_sym(e->orig, sym1) {
899 sym2 = find_twin_positional(e, sym1);
906 for_each_sym(e->orig, sym1) {
915 static int clone_sym_relocs(struct elfs *e, struct symbol *patched_sym);
1006 static struct symbol *clone_symbol(struct elfs *e, struct symbol *patched_sym,
1020 clone_symbol(e, pfx, true);
1023 if (!__clone_symbol(e->out, patched_sym, data_too))
1026 if (data_too && clone_sym_relocs(e, patched_sym))
1054 static int mark_changed_functions(struct elfs *e)
1060 for_each_sym(e->orig, orig_sym) {
1081 for_each_sym(e->patched, patched_sym) {
1093 for_each_sym(e->patched, patched_sym) {
1101 static int clone_included_functions(struct elfs *e)
1105 for_each_sym(e->patched, patched_sym) {
1107 if (!clone_symbol(e, patched_sym, true))
1130 static const char *__find_modname(struct elfs *e)
1135 sec = find_section_by_name(e->orig, ".modinfo");
1145 name = strdup(e->orig->name);
1155 static const char *find_modname(struct elfs *e)
1159 if (e->modname)
1160 return e->modname;
1162 modname = __find_modname(e);
1163 e->modname = modname;
1318 * Check if the original module already has a dependency on dep_mod, i.e. it
1321 static bool has_module_dep(struct elfs *e, const char *dep_mod)
1325 for_each_sym(e->orig, sym) {
1342 static int clone_reloc_klp(struct elfs *e, struct reloc *patched_reloc,
1365 !has_module_dep(e, export->mod)) {
1390 sym = elf_create_symbol(e->out, tombstone_name, NULL,
1399 if (!elf_create_reloc(e->out, sec, offset, sym, addend, reloc_type(patched_reloc)))
1411 sym_modname = find_modname(e);
1416 sympos = klp_find_sympos(e->orig, patched_sym->twin);
1426 klp_sym = find_symbol_by_name(e->out, sym_name);
1431 klp_sym = elf_create_symbol(e->out, sym_name, NULL,
1454 sec_objname = find_modname(e);
1464 klp_relocs = find_section_by_name(e->out, sec_name);
1466 klp_relocs = elf_create_section(e->out, sec_name, 0,
1476 if (!elf_add_data(e->out, klp_relocs, &klp_reloc, sizeof(klp_reloc)))
1480 if (!sec->sym && !elf_create_section_symbol(e->out, sec))
1483 if (!elf_create_reloc(e->out, klp_relocs,
1489 if (!elf_create_reloc(e->out, klp_relocs,
1509 static int clone_reloc(struct elfs *e, struct reloc *patched_reloc,
1523 if (clone_reloc_klp(e, patched_reloc, sec, offset, export))
1541 out_sym = clone_symbol(e, patched_sym, patched_sym->included || !export);
1555 addend = elf_add_string(e->out, out_sym->sec, str);
1560 if (!elf_create_reloc(e->out, sec, offset, out_sym, addend,
1568 static int clone_sym_relocs(struct elfs *e, struct symbol *patched_sym)
1618 ret = convert_reloc_sym(e->patched, patched_reloc);
1630 if (clone_reloc(e, patched_reloc, out_sym->sec, offset))
1846 static int validate_special_section_klp_reloc(struct elfs *e, struct symbol *sym)
1858 sym_for_each_reloc(e->patched, sym, reloc) {
1862 if (convert_reloc_sym(e->patched, reloc))
1884 sym_modname = find_modname(e);
1930 static int clone_special_section(struct elfs *e, struct section *patched_sec)
1944 if (!should_keep_special_sym(e->patched, patched_sym))
1947 ret = validate_special_section_klp_reloc(e, patched_sym);
1953 if (!clone_symbol(e, patched_sym, true))
1961 static int clone_special_sections(struct elfs *e)
1965 for_each_sec(e->patched, sec) {
1971 if (clone_special_section(e, sec))
1981 if (clone_special_section(e, annotate_insn))
1993 static int create_klp_sections(struct elfs *e)
2005 obj_sec = elf_create_section_pair(e->out, KLP_OBJECTS_SEC, obj_size, 0, 0);
2009 funcs_sec = elf_create_section_pair(e->out, KLP_FUNCS_SEC, func_size, 0, 0);
2013 funcs_sym = elf_create_section_symbol(e->out, funcs_sec);
2017 str_sec = elf_create_section(e->out, KLP_STRINGS_SEC, 0, 0,
2023 if (elf_add_string(e->out, str_sec, "") == -1)
2026 str_sym = elf_create_section_symbol(e->out, str_sec);
2031 obj_data = elf_add_data(e->out, obj_sec, NULL, obj_size);
2035 modname = find_modname(e);
2041 addend = elf_add_string(e->out, str_sec, modname);
2045 if (!elf_create_reloc(e->out, obj_sec,
2052 if (!elf_create_reloc(e->out, obj_sec, offsetof(struct klp_object_ext, funcs),
2056 for_each_sym(e->out, sym) {
2066 func_data = elf_add_data(e->out, funcs_sec, NULL, func_size);
2071 addend = elf_add_string(e->out, str_sec, sym->clone->twin->name);
2075 if (!elf_create_reloc(e->out, funcs_sec,
2081 if (!elf_create_reloc(e->out, funcs_sec,
2088 sympos = klp_find_sympos(e->orig, sym->clone->twin);
2110 sym = find_symbol_by_name(e->out, sym_name);
2114 reloc = find_reloc_by_dest(e->out, sym->sec, sym->offset);
2116 if (!elf_create_reloc(e->out, obj_sec,
2126 sym = find_symbol_by_name(e->out, sym_name);
2130 reloc = find_reloc_by_dest(e->out, sym->sec, sym->offset);
2132 if (!elf_create_reloc(e->out, obj_sec,
2142 sym = find_symbol_by_name(e->out, sym_name);
2146 reloc = find_reloc_by_dest(e->out, sym->sec, sym->offset);
2148 if (!elf_create_reloc(e->out, obj_sec,
2158 sym = find_symbol_by_name(e->out, sym_name);
2162 reloc = find_reloc_by_dest(e->out, sym->sec, sym->offset);
2164 if (!elf_create_reloc(e->out, obj_sec,
2178 static int copy_import_ns(struct elfs *e)
2183 patched_sec = find_section_by_name(e->patched, ".modinfo");
2200 out_sec = find_section_by_name(e->out, ".modinfo");
2202 out_sec = elf_create_section(e->out, ".modinfo", 0,
2212 if (!elf_add_data(e->out, out_sec, import_ns, strlen(import_ns) + 1))
2221 struct elfs e = {0};
2235 e.orig = elf_open_read(argv[0], O_RDONLY);
2236 e.patched = elf_open_read(argv[1], O_RDONLY);
2237 e.out = NULL;
2239 if (!e.orig || !e.patched)
2242 if (klp_sympos_init(e.orig))
2248 if (read_sym_checksums(e.orig))
2251 if (read_sym_checksums(e.patched))
2254 if (correlate_symbols(&e))
2257 ret = mark_changed_functions(&e);
2263 e.out = elf_create_file(&e.orig->ehdr, argv[2]);
2264 if (!e.out)
2275 if (create_fake_symbols(e.patched))
2278 if (clone_included_functions(&e))
2281 if (clone_special_sections(&e))
2284 if (create_klp_sections(&e))
2287 if (copy_import_ns(&e))
2290 if (elf_write(e.out))
2293 return elf_close(e.out);