klp-build: Fix checksum comparison for changed offsets

The klp-build -f/--show-first-changed feature uses diff to compare
checksum log lines between original and patched objects.  However, diff
compares entire lines, including the offset field.  When a function is
at a different section offset, the offset field differs even though the
instruction checksum is identical, causing the wrong instruction to be
printed.

Only compare the checksum field when looking for the first changed
instruction.  Also print both the original and patched offsets when they
differ.

Fixes: 78be9facfb ("livepatch/klp-build: Add --show-first-changed option to show function divergence")
Acked-by: Song Liu <song@kernel.org>
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
This commit is contained in:
Josh Poimboeuf
2026-04-10 21:49:56 -07:00
parent cc39ccce7d
commit ba77fe5578

View File

@@ -727,13 +727,29 @@ diff_checksums() {
)
for func in ${funcs[$file]}; do
diff <( grep0 -E "^DEBUG: .*checksum: $func " "$orig_log" | sed "s|$ORIG_DIR/||") \
<( grep0 -E "^DEBUG: .*checksum: $func " "$patched_log" | sed "s|$PATCHED_DIR/||") \
| gawk '/^< DEBUG: / {
gsub(/:/, "")
printf "%s: %s: %s\n", $3, $5, $6
exit
}' || true
local -a orig patched
paste <(grep0 -E "^DEBUG: .*checksum: $func " "$orig_log") \
<(grep0 -E "^DEBUG: .*checksum: $func " "$patched_log") |
while IFS= read -r line; do
read -ra orig <<< "${line%%$'\t'*}"
read -ra patched <<< "${line#*$'\t'}"
if [[ ${#patched[@]} -eq 0 ]]; then
printf "%s: %s: %s (removed)\n" "${orig[1]%:}" "${orig[3]}" "${orig[-2]}"
break
elif [[ ${#orig[@]} -eq 0 ]]; then
printf "%s: %s: %s (added)\n" "${patched[1]%:}" "${patched[3]}" "${patched[-2]}"
break
fi
[[ "${orig[-1]}" == "${patched[-1]}" ]] && continue
printf "%s: %s: %s" "${orig[1]%:}" "${orig[3]}" "${orig[-2]}"
[[ "${orig[-2]}" != "${patched[-2]}" ]] && \
printf " (patched: %s)" "${patched[-2]}"
printf "\n"
break
done || true
done
done
}