diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c index 1967bd804..f2eb69258 100644 --- a/kpatch-build/create-diff-object.c +++ b/kpatch-build/create-diff-object.c @@ -1544,6 +1544,10 @@ static void kpatch_replace_sections_syms(struct kpatch_elf *kelf) target_off = rela_target_offset(kelf, relasec, rela); + if (target_off >= (long)rela->sym->sec->sh.sh_size) + continue; + + found = false; /* * Attempt to replace references to unbundled sections * with their symbols. @@ -1558,9 +1562,9 @@ static void kpatch_replace_sections_syms(struct kpatch_elf *kelf) start = sym->sym.st_value; end = sym->sym.st_value + sym->sym.st_size; - if (is_text_section(relasec->base) && + if (rela->type == R_X86_64_32S && + is_text_section(relasec->base) && !is_text_section(sym->sec) && - rela->type == R_X86_64_32S && rela->addend == (long)sym->sec->sh.sh_size && end == (long)sym->sec->sh.sh_size) { @@ -2705,8 +2709,9 @@ static void kpatch_include_debug_sections(struct kpatch_elf *kelf) if (!is_rela_section(sec) || !is_debug_section(sec)) continue; list_for_each_entry_safe(rela, saferela, &sec->relas, list) - if (!rela->sym->sec->include) + if (!rela->sym->include || !rela->sym->sec->include) { list_del(&rela->list); + } } } diff --git a/kpatch-build/kpatch-elf.c b/kpatch-build/kpatch-elf.c index c7d12ec93..b81d1f40e 100644 --- a/kpatch-build/kpatch-elf.c +++ b/kpatch-build/kpatch-elf.c @@ -946,6 +946,7 @@ void kpatch_write_output_elf(struct kpatch_elf *kelf, Elf *elf, char *outfile, memset(&ehout, 0, sizeof(ehout)); ehout.e_ident[EI_DATA] = eh.e_ident[EI_DATA]; ehout.e_machine = eh.e_machine; + ehout.e_flags = eh.e_flags; ehout.e_type = eh.e_type; ehout.e_version = EV_CURRENT;