create-diff-object: fix kpatch_replace_sections_syms() for non-text

It doesn't make sense to disassemble a data section.  That just happened
to work by accident.  PC-relative offsets only need adjusting when
associated with an instruction.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
This commit is contained in:
Josh Poimboeuf 2022-05-11 14:34:44 -07:00
parent 61e46094b5
commit 79f45d1b0a
1 changed files with 7 additions and 6 deletions

View File

@ -1575,17 +1575,18 @@ static void kpatch_replace_sections_syms(struct kpatch_elf *kelf)
add_off = 0; add_off = 0;
break; break;
case X86_64: case X86_64:
if (rela->type == R_X86_64_PC32 || if (!is_text_section(relasec->base) ||
rela->type == R_X86_64_PLT32) { rela->type == R_X86_64_64 ||
rela->type == R_X86_64_32S)
add_off = 0;
else if (rela->type == R_X86_64_PC32 ||
rela->type == R_X86_64_PLT32) {
struct insn insn; struct insn insn;
rela_insn(relasec, rela, &insn); rela_insn(relasec, rela, &insn);
add_off = (unsigned int)((long)insn.next_byte - add_off = (unsigned int)((long)insn.next_byte -
(long)relasec->base->data->d_buf - (long)relasec->base->data->d_buf -
rela->offset); rela->offset);
} else if (rela->type == R_X86_64_64 || } else
rela->type == R_X86_64_32S)
add_off = 0;
else
continue; continue;
break; break;
default: default: