mirror of
https://github.com/dynup/kpatch
synced 2025-04-25 20:48:01 +00:00
commit
270d783947
@ -37,7 +37,6 @@
|
||||
BASE="$PWD"
|
||||
SCRIPTDIR="$(readlink -f "$(dirname "$(type -p "$0")")")"
|
||||
ARCH="$(uname -m)"
|
||||
ARCHVERSION="$(uname -r)"
|
||||
CPUS="$(getconf _NPROCESSORS_ONLN)"
|
||||
CACHEDIR="${CACHEDIR:-$HOME/.kpatch}"
|
||||
SRCDIR="$CACHEDIR/src"
|
||||
@ -174,6 +173,7 @@ find_core_symvers() {
|
||||
gcc_version_from_file() {
|
||||
readelf -p .comment "$1" | grep -o 'GCC:.*'
|
||||
}
|
||||
|
||||
gcc_version_check() {
|
||||
local c="$TEMPDIR/test.c" o="$TEMPDIR/test.o"
|
||||
local out gccver kgccver
|
||||
@ -355,12 +355,14 @@ usage() {
|
||||
echo "usage: $(basename "$0") [options] <patch1 ... patchN>" >&2
|
||||
echo " patchN Input patchfile(s)" >&2
|
||||
echo " -h, --help Show this help message" >&2
|
||||
echo " -a, --archversion Specify the kernel arch version" >&2
|
||||
echo " -r, --sourcerpm Specify kernel source RPM" >&2
|
||||
echo " -s, --sourcedir Specify kernel source directory" >&2
|
||||
echo " -c, --config Specify kernel config file" >&2
|
||||
echo " -v, --vmlinux Specify original vmlinux" >&2
|
||||
echo " -j, --jobs Specify the number of make jobs" >&2
|
||||
echo " -t, --target Specify custom kernel build targets" >&2
|
||||
echo " -n, --name Specify the name of the kpatch module" >&2
|
||||
echo " -o, --output Specify output folder" >&2
|
||||
echo " -d, --debug Keep scratch files in /tmp" >&2
|
||||
echo " --skip-cleanup Skip post-build cleanup" >&2
|
||||
@ -368,7 +370,7 @@ usage() {
|
||||
echo " (not recommended)" >&2
|
||||
}
|
||||
|
||||
options="$(getopt -o hr:s:c:v:j:t:n:o:d -l "help,sourcerpm:,sourcedir:,config:,vmlinux:,jobs:,target:,name:,output:,debug,skip-gcc-check,skip-cleanup" -- "$@")" || die "getopt failed"
|
||||
options="$(getopt -o ha:r:s:c:v:j:t:n:o:d -l "help,archversion:,sourcerpm:,sourcedir:,config:,vmlinux:,jobs:,target:,name:,output:,debug,skip-gcc-check,skip-cleanup" -- "$@")" || die "getopt failed"
|
||||
|
||||
eval set -- "$options"
|
||||
|
||||
@ -378,13 +380,14 @@ while [[ $# -gt 0 ]]; do
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
-a|--archversion)
|
||||
ARCHVERSION="$2"
|
||||
shift
|
||||
;;
|
||||
-r|--sourcerpm)
|
||||
[[ ! -f "$2" ]] && die "source rpm '$2' not found"
|
||||
SRCRPM="$(readlink -f "$2")"
|
||||
shift
|
||||
rpmname="$(basename "$SRCRPM")"
|
||||
ARCHVERSION="${rpmname%.src.rpm}.$(uname -m)"
|
||||
ARCHVERSION="${ARCHVERSION#kernel-}"
|
||||
;;
|
||||
-s|--sourcedir)
|
||||
[[ ! -d "$2" ]] && die "source dir '$2' not found"
|
||||
@ -447,21 +450,42 @@ if [[ ${#PATCH_LIST[@]} -eq 0 ]]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -n "$ARCHVERSION" ]] && [[ -n "$VMLINUX" ]]; then
|
||||
warn "--archversion is incompatible with --vmlinux"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -n "$SRCRPM" ]]; then
|
||||
if [[ -n "$ARCHVERSION" ]]; then
|
||||
warn "--archversion is incompatible with --sourcerpm"
|
||||
exit 1
|
||||
fi
|
||||
rpmname="$(basename "$SRCRPM")"
|
||||
ARCHVERSION="${rpmname%.src.rpm}.$(uname -m)"
|
||||
ARCHVERSION="${ARCHVERSION#kernel-}"
|
||||
fi
|
||||
|
||||
# ensure cachedir and tempdir are setup properly and cleaned
|
||||
mkdir -p "$TEMPDIR" || die "Couldn't create $TEMPDIR"
|
||||
rm -rf "${TEMPDIR:?}"/*
|
||||
rm -f "$LOGFILE"
|
||||
|
||||
if [[ -n "$USERSRCDIR" ]]; then
|
||||
if [[ -n "$ARCHVERSION" ]]; then
|
||||
warn "--archversion is incompatible with --sourcedir"
|
||||
exit 1
|
||||
fi
|
||||
SRCDIR="$USERSRCDIR"
|
||||
|
||||
[[ -z "$VMLINUX" ]] && VMLINUX="$SRCDIR"/vmlinux
|
||||
[[ ! -e "$VMLINUX" ]] && die "can't find vmlinux"
|
||||
|
||||
# Extract the target kernel version from vmlinux in this case.
|
||||
ARCHVERSION="$(strings "$VMLINUX" | grep -e "^Linux version" | awk '{ print($3); }')"
|
||||
ARCHVERSION="$(strings "$VMLINUX" | grep -m 1 -e "^Linux version" | awk '{ print($3); }')"
|
||||
fi
|
||||
|
||||
[[ -z "$ARCHVERSION" ]] && ARCHVERSION="$(uname -r)"
|
||||
|
||||
[[ "$SKIPCLEANUP" -eq 0 ]] && trap cleanup EXIT INT TERM HUP
|
||||
|
||||
KVER="${ARCHVERSION%%-*}"
|
||||
@ -662,8 +686,8 @@ CROSS_COMPILE="$TOOLSDIR/kpatch-gcc " \
|
||||
KBUILD_MODPOST_WARN=1 \
|
||||
make "-j$CPUS" $TARGETS >> "$LOGFILE" 2>&1 || die
|
||||
[[ "${PIPESTATUS[0]}" -eq 0 ]] || die
|
||||
grep -q "undefined reference" "$LOGFILE" | grep -qv kpatch_shadow && die
|
||||
grep -q "undefined!" "$LOGFILE" |grep -qv kpatch_shadow && die
|
||||
grep "undefined reference" "$LOGFILE" | grep -qv kpatch_shadow && die
|
||||
grep "undefined!" "$LOGFILE" | grep -qv kpatch_shadow && die
|
||||
|
||||
if [[ ! -e "$TEMPDIR/changed_objs" ]]; then
|
||||
die "no changed objects found"
|
||||
@ -763,8 +787,6 @@ if "$KPATCH_MODULE"; then
|
||||
fi
|
||||
|
||||
echo "Building patch module: $MODNAME.ko"
|
||||
cd "$SRCDIR" || die
|
||||
make prepare >> "$LOGFILE" 2>&1 || die
|
||||
|
||||
if [[ ! -z "$UBUNTU_KERNEL" ]]; then
|
||||
# UBUNTU: add UTS_UBUNTU_RELEASE_ABI to utsrelease.h after regenerating it
|
||||
|
Loading…
Reference in New Issue
Block a user