[RFC PATCH v2 7/7] livepatch/klp-build: add validation for user-supplied OOT objects
From: Joe Lawrence <joe.lawrence@redhat.com>
Date: 2026-08-26 19:50:20
Subsystem:
live patching, the rest · Maintainers:
Josh Poimboeuf, Jiri Kosina, Miroslav Benes, Petr Mladek, Linus Torvalds
With the --orig-dir and --patched-dir options, the user performs the respective original and patched builds manually. Therefore it is important to sanity check the supplied objects to the best of our ability before entering the diff/extraction pipeline. Add check_oot_object() and check_oot_objects() to verify: - Each orig/ object has a matching patched/ counterpart - At least one .text.<func> section is present, implying -ffunction-sections compiler flag was used - Matching compiler versions Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com> --- scripts/livepatch/klp-build | 47 ++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-)
diff --git a/scripts/livepatch/klp-build b/scripts/livepatch/klp-build
index e118f133e923..fc5d968fe235 100755
--- a/scripts/livepatch/klp-build
+++ b/scripts/livepatch/klp-build@@ -982,17 +982,58 @@ build_patch_module() { } +check_oot_object() { + local file="$1" + + readelf -S "$file" 2>/dev/null | command grep -q '\.text\.' || + die "$file: no .text.<func> sections found; was -ffunction-sections used?" +} + +check_oot_objects() { + local orig_dir="$1" + local patched_dir="$2" + local -a files + local rel + + command -v readelf &>/dev/null || + die "readelf not found (required for OOT object validation)" + + find "$orig_dir" -type f -name "*.o" -printf '%P\n' | mapfile -t files + [[ ${#files[@]} -gt 0 ]] || die "no .o files found in $orig_dir" + + for rel in "${files[@]}"; do + [[ -f "$patched_dir/$rel" ]] || + die "$rel found in orig dir but missing from patched dir" + + check_oot_object "$orig_dir/$rel" + check_oot_object "$patched_dir/$rel" + + local orig_cc patched_cc + orig_cc="$(readelf -p .comment "$orig_dir/$rel" 2>/dev/null | sed -n 's/.*\] *//p' | head -1)" + patched_cc="$(readelf -p .comment "$patched_dir/$rel" 2>/dev/null | sed -n 's/.*\] *//p' | head -1)" + if [[ -n "$orig_cc" && -n "$patched_cc" && "$orig_cc" != "$patched_cc" ]]; then + warn "$rel: compiler mismatch between orig and patched" + warn " orig: $orig_cc" + warn " patched: $patched_cc" + fi + done + + find "$patched_dir" -type f -name "*.o" -printf '%P\n' | while read -r rel; do + [[ -f "$orig_dir/$rel" ]] || + warn "$rel found in patched dir but missing from orig dir" + done +} + setup_oot() { local files=() local rel + check_oot_objects "$USER_ORIG_DIR" "$USER_PATCHED_DIR" + mkdir -p "$ORIG_DIR" "$PATCHED_DIR" find "$USER_ORIG_DIR" -type f -name "*.o" -printf '%P\n' | mapfile -t files - [[ ${#files[@]} -gt 0 ]] || die "no .o files found in $USER_ORIG_DIR" for rel in "${files[@]}"; do - [[ -f "$USER_PATCHED_DIR/$rel" ]] || - die "$rel found in orig dir but missing from patched dir" mkdir -p "$ORIG_DIR/$(dirname "$rel")" mkdir -p "$PATCHED_DIR/$(dirname "$rel")" cp -f "$USER_ORIG_DIR/$rel" "$ORIG_DIR/$rel"
--
2.55.0