@@ -41,7 +41,7 @@ SCRIPTDIR="$(readlink -f "$(dirname "$(type -p "$0")")")"
4141ARCH=" $( uname -m) "
4242CPUS=" $( getconf _NPROCESSORS_ONLN) "
4343CACHEDIR=" ${CACHEDIR:- $HOME / .kpatch} "
44- SRCDIR =" $CACHEDIR /src"
44+ KERNEL_SRCDIR =" $CACHEDIR /src"
4545RPMTOPDIR=" $CACHEDIR /buildroot"
4646VERSIONFILE=" $CACHEDIR /version"
4747TEMPDIR=" $CACHEDIR /tmp"
@@ -138,27 +138,27 @@ remove_patches() {
138138 for (( ; APPLIED_PATCHES> 0 ; APPLIED_PATCHES-- )) ; do
139139 idx=$(( APPLIED_PATCHES - 1 ))
140140 patch=" ${PATCH_LIST[$idx]} "
141- patch -p1 -R -d " $SRCDIR " < " $patch " & > /dev/null
141+ patch -p1 -R -d " $BUILDDIR " < " $patch " & > /dev/null
142142 done
143143
144- # If $SRCDIR was a git repo, make sure git actually sees that
144+ # If $BUILDDIR was a git repo, make sure git actually sees that
145145 # we've reverted our patch(es).
146- [[ -d " $SRCDIR /.git" ]] && (cd " $SRCDIR " && git update-index -q --refresh)
146+ [[ -d " $BUILDDIR /.git" ]] && (cd " $BUILDDIR " && git update-index -q --refresh)
147147}
148148
149149cleanup () {
150- rm -f " $SRCDIR /.scmversion"
150+ rm -f " $BUILDDIR /.scmversion"
151151
152152 remove_patches
153153
154154 # restore original vmlinux if it was overwritten by sourcedir build
155- [[ -e " $TEMPDIR /vmlinux" ]] && mv -f " $TEMPDIR /vmlinux" " $SRCDIR /"
155+ [[ -e " $TEMPDIR /vmlinux" ]] && mv -f " $TEMPDIR /vmlinux" " $KERNEL_SRCDIR /"
156156
157157 # restore original link-vmlinux.sh if we updated it for the build
158- [[ -e " $TEMPDIR /link-vmlinux.sh" ]] && mv -f " $TEMPDIR /link-vmlinux.sh" " $SRCDIR /scripts"
158+ [[ -e " $TEMPDIR /link-vmlinux.sh" ]] && mv -f " $TEMPDIR /link-vmlinux.sh" " $KERNEL_SRCDIR /scripts"
159159
160160 # restore original Makefile.modfinal if we updated it for the build
161- [[ -e " $TEMPDIR /Makefile.modfinal" ]] && mv -f " $TEMPDIR /Makefile.modfinal" " $SRCDIR /scripts"
161+ [[ -e " $TEMPDIR /Makefile.modfinal" ]] && mv -f " $TEMPDIR /Makefile.modfinal" " $KERNEL_SRCDIR /scripts"
162162
163163 [[ " $DEBUG " -eq 0 ]] && rm -rf " $TEMPDIR "
164164 rm -rf " $RPMTOPDIR "
@@ -538,15 +538,16 @@ usage() {
538538 echo " -d, --debug Enable 'xtrace' and keep scratch files" >&2
539539 echo " in <CACHEDIR>/tmp" >&2
540540 echo " (can be specified multiple times)" >&2
541- echo " -e, -- oot-module Enable patching out-of-tree module," >&2
541+ echo " -- oot-module Enable patching out-of-tree module," >&2
542542 echo " specify current version of module" >&2
543+ echo " --oot-module-src Specify out-of-tree module source directory" >&2
543544 echo " -R, --non-replace Disable replace patch (replace is on by default)" >&2
544545 echo " --skip-cleanup Skip post-build cleanup" >&2
545546 echo " --skip-compiler-check Skip compiler version matching check" >&2
546547 echo " (not recommended)" >&2
547548}
548549
549- options=" $( getopt -o ha:r:s:c:v:j:t:n:o:de:R -l " help,archversion:,sourcerpm:,sourcedir:,config:,vmlinux:,jobs:,target:,name:,output:,oot-module:,debug,skip-gcc-check,skip-compiler-check,skip-cleanup,non-replace" -- " $@ " ) " || die " getopt failed"
550+ options=" $( getopt -o ha:r:s:c:v:j:t:n:o:dR -l " help,archversion:,sourcerpm:,sourcedir:,config:,vmlinux:,jobs:,target:,name:,output:,oot-module:,oot-module-src :,debug,skip-gcc-check,skip-compiler-check,skip-cleanup,non-replace" -- " $@ " ) " || die " getopt failed"
550551
551552eval set -- " $options "
552553
@@ -604,11 +605,16 @@ while [[ $# -gt 0 ]]; do
604605 echo " DEBUG mode enabled"
605606 fi
606607 ;;
607- -e|- -oot-module)
608+ --oot-module)
608609 [[ ! -f " $2 " ]] && die " out-of-tree module '$2 ' not found"
609610 OOT_MODULE=" $( readlink -f " $2 " ) "
610611 shift
611612 ;;
613+ --oot-module-src)
614+ [[ ! -d " $2 " ]] && die " out-of-tree module source dir '$2 ' not found"
615+ OOT_MODULE_SRCDIR=" $( readlink -f " $2 " ) "
616+ shift
617+ ;;
612618 -R|--non-replace)
613619 KLP_REPLACE=0
614620 ;;
@@ -657,8 +663,8 @@ if [[ -n "$SRCRPM" ]]; then
657663 ARCHVERSION=" ${ARCHVERSION# alt-} "
658664fi
659665
660- if [[ -n " $OOT_MODULE " ]] && [[ -z " $USERSRCDIR " ]]; then
661- warn " --oot-module requires --sourcedir "
666+ if [[ -n " $OOT_MODULE " ]] && [[ -z " $OOT_MODULE_SRCDIR " ]]; then
667+ warn " --oot-module requires --oot-module-src "
662668 exit 1
663669fi
664670
@@ -672,21 +678,30 @@ if [[ -n "$USERSRCDIR" ]]; then
672678 warn " --archversion is incompatible with --sourcedir"
673679 exit 1
674680 fi
675- SRCDIR =" $USERSRCDIR "
681+ KERNEL_SRCDIR =" $USERSRCDIR "
676682
677- if [[ -z " $OOT_MODULE " ]]; then
678- [[ -z " $VMLINUX " ]] && VMLINUX=" $SRCDIR " /vmlinux
679- [[ ! -e " $VMLINUX " ]] && die " can't find vmlinux"
683+ [[ -z " $VMLINUX " ]] && VMLINUX=" $KERNEL_SRCDIR " /vmlinux
684+ [[ ! -e " $VMLINUX " ]] && die " can't find vmlinux"
680685
681- # Extract the target kernel version from vmlinux in this case.
682- ARCHVERSION=" $( strings " $VMLINUX " | grep -m 1 -e " ^Linux version" | awk ' { print($3); }' ) "
683- else
684- ARCHVERSION=" $( modinfo -F vermagic " $OOT_MODULE " | awk ' {print $1}' ) "
685- fi
686+ # Extract the target kernel version from vmlinux in this case.
687+ ARCHVERSION=" $( strings " $VMLINUX " | grep -m 1 -e " ^Linux version" | awk ' { print($3); }' ) "
688+ fi
689+
690+ if [[ -n " $OOT_MODULE " ]]; then
691+ ARCHVERSION=" $( modinfo -F vermagic " $OOT_MODULE " | awk ' {print $1}' ) "
686692fi
687693
688694[[ -z " $ARCHVERSION " ]] && ARCHVERSION=" $( uname -r) "
689695
696+ if [[ -n " $OOT_MODULE " ]]; then
697+ if [[ -z " $USERSRCDIR " ]]; then
698+ KERNEL_SRCDIR=" /lib/modules/$ARCHVERSION /build/"
699+ fi
700+ BUILDDIR=" $OOT_MODULE_SRCDIR "
701+ else
702+ BUILDDIR=" $KERNEL_SRCDIR "
703+ fi
704+
690705[[ " $SKIPCLEANUP " -eq 0 ]] && trap cleanup EXIT INT TERM HUP
691706
692707KVER=" ${ARCHVERSION%% -* } "
@@ -728,18 +743,16 @@ if [[ -n "$USERSRCDIR" ]]; then
728743 echo " Using source directory at $USERSRCDIR "
729744
730745 # save original vmlinux before it gets overwritten by sourcedir build
731- if [[ -z " $OOT_MODULE " ]] && [[ " $ VMLINUX" -ef " $SRCDIR " /vmlinux ]]; then
746+ if [[ " $ VMLINUX" -ef " $KERNEL_SRCDIR " /vmlinux ]]; then
732747 cp -f " $VMLINUX " " $TEMPDIR /vmlinux" || die
733748 VMLINUX=" $TEMPDIR /vmlinux"
734749 fi
735-
736- # For external modules, use the running kernel's config
737- if [[ -n " $OOT_MODULE " ]] && [[ -z " $CONFIGFILE " ]]; then
750+ elif [[ -n " $OOT_MODULE " ]]; then
751+ if [[ -z " ${CONFIGFILE} " ]]; then
738752 CONFIGFILE=" /boot/config-${ARCHVERSION} "
739753 fi
740-
741- elif [[ -e " $SRCDIR " /.config ]] && [[ -e " $VERSIONFILE " ]] && [[ " $( cat " $VERSIONFILE " ) " = " $ARCHVERSION " ]]; then
742- echo " Using cache at $SRCDIR "
754+ elif [[ -e " $KERNEL_SRCDIR " /.config ]] && [[ -e " $VERSIONFILE " ]] && [[ " $( cat " $VERSIONFILE " ) " = " $ARCHVERSION " ]]; then
755+ echo " Using cache at $KERNEL_SRCDIR "
743756
744757else
745758 if [[ " $DISTRO " = fedora ]] || [[ " $DISTRO " = rhel ]] || [[ " $DISTRO " = ol ]] || [[ " $DISTRO " = centos ]]; then
@@ -765,19 +778,19 @@ else
765778 rpmbuild -D " _topdir $RPMTOPDIR " -bp --nodeps " --target=$( uname -m) " " $RPMTOPDIR " /SPECS/kernel$ALT .spec 2>&1 | logger ||
766779 die " rpmbuild -bp failed. you may need to run 'yum-builddep kernel' first."
767780
768- mv " $RPMTOPDIR " /BUILD/kernel-* /linux-* " $SRCDIR " 2>&1 | logger || die
781+ mv " $RPMTOPDIR " /BUILD/kernel-* /linux-* " $KERNEL_SRCDIR " 2>&1 | logger || die
769782 rm -rf " $RPMTOPDIR "
770- rm -rf " $SRCDIR /.git"
783+ rm -rf " $KERNEL_SRCDIR /.git"
771784
772785 if [[ " $ARCHVERSION " == * -* ]]; then
773- sed -i " s/^EXTRAVERSION.*/EXTRAVERSION = -${ARCHVERSION##* -} /" " $SRCDIR /Makefile" || die
786+ sed -i " s/^EXTRAVERSION.*/EXTRAVERSION = -${ARCHVERSION##* -} /" " $KERNEL_SRCDIR /Makefile" || die
774787 fi
775788
776789 echo " $ARCHVERSION " > " $VERSIONFILE " || die
777790
778- [[ -z " $CONFIGFILE " ]] && CONFIGFILE=" $SRCDIR /configs/kernel$ALT -$KVER -$ARCH .config"
791+ [[ -z " $CONFIGFILE " ]] && CONFIGFILE=" $KERNEL_SRCDIR /configs/kernel$ALT -$KVER -$ARCH .config"
779792
780- (cd " $SRCDIR " && make mrproper 2>&1 | logger) || die
793+ (cd " $KERNEL_SRCDIR " && make mrproper 2>&1 | logger) || die
781794
782795 elif [[ " $DISTRO " = ubuntu ]] || [[ " $DISTRO " = debian ]]; then
783796
@@ -806,33 +819,32 @@ else
806819 echo " Downloading and unpacking the kernel source for $ARCHVERSION "
807820 # Download source deb pkg
808821 (dget -u " $url /${pkgname} /${dscname} " 2>&1 ) | logger || die " dget: Could not fetch/unpack $url /${pkgname} /${dscname} "
809- mv " ${pkgname} -$KVER " " $SRCDIR " || die
822+ mv " ${pkgname} -$KVER " " $KERNEL_SRCDIR " || die
810823 [[ -z " $CONFIGFILE " ]] && CONFIGFILE=" /boot/config-${ARCHVERSION} "
811824 if [[ " $ARCHVERSION " == * -* ]]; then
812- echo " -${ARCHVERSION#* -} " > " $SRCDIR /localversion" || die
825+ echo " -${ARCHVERSION#* -} " > " $KERNEL_SRCDIR /localversion" || die
813826 fi
814827 # for some reason the Ubuntu kernel versions don't follow the
815828 # upstream SUBLEVEL; they are always at SUBLEVEL 0
816- sed -i " s/^SUBLEVEL.*/${sublevel} /" " $SRCDIR /Makefile" || die
829+ sed -i " s/^SUBLEVEL.*/${sublevel} /" " $KERNEL_SRCDIR /Makefile" || die
817830 echo " $ARCHVERSION " > " $VERSIONFILE " || die
818831
819832 else
820833 die " Unsupported distribution"
821834 fi
822835fi
823836
824- [[ -z " $CONFIGFILE " ]] && CONFIGFILE=" $SRCDIR " /.config
837+ [[ -z " $CONFIGFILE " ]] && CONFIGFILE=" $KERNEL_SRCDIR " /.config
825838[[ ! -e " $CONFIGFILE " ]] && die " can't find config file"
826- if [[ ! " $CONFIGFILE " -ef " $SRCDIR " /.config ]] ; then
827- cp -f " $CONFIGFILE " " $SRCDIR /.config" || die
839+ if [[ -z " $OOT_MODULE " && ! " $CONFIGFILE " -ef " $KERNEL_SRCDIR " /.config ]] ; then
840+ cp -f " $CONFIGFILE " " $KERNEL_SRCDIR /.config" || die
828841fi
829842
830843# kernel option checking
831844grep -q " CONFIG_DEBUG_INFO=y" " $CONFIGFILE " || die " kernel doesn't have 'CONFIG_DEBUG_INFO' enabled"
832845
833846# Build variables - Set some defaults, then adjust features
834847# according to .config and kernel version
835- KBUILD_EXTRA_SYMBOLS=" "
836848KPATCH_LDFLAGS=" "
837849USE_KLP=0
838850USE_KLP_ARCH=0
@@ -887,12 +899,12 @@ grep -q "CONFIG_GCC_PLUGIN_RANDSTRUCT=y" "$CONFIGFILE" && die "kernel option 'CO
887899# link-vmlinux.sh and Makefile.modfinal since kpatch doesn't care about
888900# that anyway.
889901if grep -q " CONFIG_DEBUG_INFO_BTF=y" " $CONFIGFILE " ; then
890- cp -f " $SRCDIR /scripts/link-vmlinux.sh" " $TEMPDIR /link-vmlinux.sh" || die
891- sed -i ' s/CONFIG_DEBUG_INFO_BTF/DISABLED_FOR_KPATCH_BUILD/g' " $SRCDIR " /scripts/link-vmlinux.sh || die
902+ cp -f " $KERNEL_SRCDIR /scripts/link-vmlinux.sh" " $TEMPDIR /link-vmlinux.sh" || die
903+ sed -i ' s/CONFIG_DEBUG_INFO_BTF/DISABLED_FOR_KPATCH_BUILD/g' " $KERNEL_SRCDIR " /scripts/link-vmlinux.sh || die
892904
893- if [[ -e " $SRCDIR /scripts/Makefile.modfinal" ]]; then
894- cp -f " $SRCDIR /scripts/Makefile.modfinal" " $TEMPDIR /Makefile.modfinal" || die
895- sed -i ' s/CONFIG_DEBUG_INFO_BTF_MODULES/DISABLED_FOR_KPATCH_BUILD/g' " $SRCDIR " /scripts/Makefile.modfinal || die
905+ if [[ -e " $KERNEL_SRCDIR /scripts/Makefile.modfinal" ]]; then
906+ cp -f " $KERNEL_SRCDIR /scripts/Makefile.modfinal" " $TEMPDIR /Makefile.modfinal" || die
907+ sed -i ' s/CONFIG_DEBUG_INFO_BTF_MODULES/DISABLED_FOR_KPATCH_BUILD/g' " $KERNEL_SRCDIR " /scripts/Makefile.modfinal || die
896908 fi
897909fi
898910
@@ -914,7 +926,7 @@ if [[ "$SKIPCOMPILERCHECK" -eq 0 ]]; then
914926fi
915927
916928echo " Testing patch file(s)"
917- cd " $SRCDIR " || die
929+ cd " $BUILDDIR " || die
918930verify_patch_files
919931apply_patches
920932remove_patches
962974make " ${MAKEVARS[@]} " " -j$CPUS " $TARGETS 2>&1 | logger || die
963975
964976# Save original module symvers
965- cp -f " $SRCDIR /Module.symvers" " $TEMPDIR /Module.symvers" || die
977+ cp -f " $BUILDDIR /Module.symvers" " $TEMPDIR /Module.symvers" || die
966978
967979echo " Building patched source"
968980apply_patches
969981mkdir -p " $TEMPDIR /orig" " $TEMPDIR /patched"
970982export KPATCH_GCC_TEMPDIR=" $TEMPDIR "
971- export KPATCH_GCC_SRCDIR=" $SRCDIR "
983+ export KPATCH_GCC_SRCDIR=" $BUILDDIR "
972984save_env
973985# $TARGETS used as list, no quotes.
974986# shellcheck disable=SC2086
@@ -985,7 +997,7 @@ if [[ ! -e "$TEMPDIR/changed_objs" ]]; then
985997 die " no changed objects found"
986998fi
987999
988- [[ -n " $OOT_MODULE " ]] || grep -q vmlinux " $SRCDIR /Module.symvers" || die " truncated $SRCDIR /Module.symvers file"
1000+ grep -q vmlinux " $KERNEL_SRCDIR /Module.symvers" || die " truncated $KERNEL_SRCDIR /Module.symvers file"
9891001
9901002if [[ " $CONFIG_MODVERSIONS " -eq 1 ]]; then
9911003 while read -ra sym_line; do
@@ -995,9 +1007,9 @@ if [[ "$CONFIG_MODVERSIONS" -eq 1 ]]; then
9951007
9961008 sym=${sym_line[1]}
9971009
998- read -ra patched_sym_line <<< " $(grep " \s $sym \s " " $SRCDIR /Module.symvers" )"
1010+ read -ra patched_sym_line <<< " $(grep " \s $sym \s " " $BUILDDIR /Module.symvers" )"
9991011 if [[ ${# patched_sym_line[@]} -lt 4 ]]; then
1000- die " Malformed symbol entry for ${sym} in ${SRCDIR } /Module.symvers file"
1012+ die " Malformed symbol entry for ${sym} in ${BUILDDIR } /Module.symvers file"
10011013 fi
10021014
10031015 # Assume that both original and patched symvers have the same format.
10151027for i in $( cat " $TEMPDIR /changed_objs" )
10161028do
10171029 mkdir -p " $TEMPDIR /patched/$( dirname " $i " ) " || die
1018- cp -f " $SRCDIR /$i " " $TEMPDIR /patched/$i " || die
1030+ cp -f " $BUILDDIR /$i " " $TEMPDIR /patched/$i " || die
10191031done
10201032
10211033echo " Extracting new and modified ELF sections"
@@ -1050,9 +1062,8 @@ ERROR=0
10501062
10511063# Prepare OOT module symvers file
10521064if [[ -n " $OOT_MODULE " ]]; then
1053- BUILDDIR=" /lib/modules/$ARCHVERSION /build/"
1054- cp -f " $SRCDIR /Module.symvers" " $TEMPDIR /Module.symvers" || die
1055- awk ' { print $1 "\t" $2 "\t" $3 "\t" $4}' " ${BUILDDIR} /Module.symvers" >> " $TEMPDIR /Module.symvers"
1065+ cp -f " $OOT_MODULE_SRCDIR /Module.symvers" " $TEMPDIR /Module.symvers" || die
1066+ awk ' { print $1 "\t" $2 "\t" $3 "\t" $4}' " ${KERNEL_SRCDIR} /Module.symvers" >> " $TEMPDIR /Module.symvers"
10561067fi
10571068
10581069for i in $FILES ; do
@@ -1065,15 +1076,15 @@ for i in $FILES; do
10651076 [[ " $i " = usr/initramfs_data.o ]] && continue
10661077
10671078 mkdir -p " output/$( dirname " $i " ) "
1068- cd " $SRCDIR " || die
1079+ cd " $BUILDDIR " || die
10691080 find_kobj " $i "
10701081 cd " $TEMPDIR " || die
10711082 if [[ -e " orig/$i " ]]; then
10721083 if [[ " $( basename " $KOBJFILE " ) " = vmlinux ]]; then
10731084 KOBJFILE_NAME=vmlinux
10741085 KOBJFILE_PATH=" $VMLINUX "
10751086 SYMTAB=" ${TEMPDIR} /${KOBJFILE_NAME} .symtab"
1076- SYMVERS_FILE=" $SRCDIR /Module.symvers"
1087+ SYMVERS_FILE=" $BUILDDIR /Module.symvers"
10771088 elif [[ " $( basename " $KOBJFILE " ) " = " $( basename " $OOT_MODULE " ) " ]]; then
10781089 KOBJFILE_NAME=" $( basename --suffix=.ko " $OOT_MODULE " ) "
10791090 KOBJFILE_PATH=" $OOT_MODULE "
@@ -1084,7 +1095,7 @@ for i in $FILES; do
10841095 KOBJFILE_NAME=" ${KOBJFILE_NAME// -/ _} "
10851096 KOBJFILE_PATH=" ${TEMPDIR} /module/$KOBJFILE "
10861097 SYMTAB=" ${KOBJFILE_PATH} .symtab"
1087- SYMVERS_FILE=" $SRCDIR /Module.symvers"
1098+ SYMVERS_FILE=" $BUILDDIR /Module.symvers"
10881099 fi
10891100
10901101 readelf -s --wide " $KOBJFILE_PATH " > " $SYMTAB "
@@ -1138,7 +1149,7 @@ if [[ -z "$USERSRCDIR" ]] && [[ "$DISTRO" = ubuntu ]]; then
11381149 # UBUNTU: add UTS_UBUNTU_RELEASE_ABI to utsrelease.h after regenerating it
11391150 UBUNTU_ABI=" ${ARCHVERSION#* -} "
11401151 UBUNTU_ABI=" ${UBUNTU_ABI% -* } "
1141- echo " #define UTS_UBUNTU_RELEASE_ABI $UBUNTU_ABI " >> " $SRCDIR " /include/generated/utsrelease.h
1152+ echo " #define UTS_UBUNTU_RELEASE_ABI $UBUNTU_ABI " >> " $KERNEL_SRCDIR " /include/generated/utsrelease.h
11421153fi
11431154
11441155cd " $TEMPDIR /output" || die
@@ -1161,18 +1172,13 @@ else
11611172fi
11621173
11631174cd " $TEMPDIR /patch" || die
1164- if [[ -z " $OOT_MODULE " ]]; then
1165- KPATCH_BUILD=" $SRCDIR "
1166- else
1167- KPATCH_BUILD=" /lib/modules/$ARCHVERSION /build"
1168- fi
11691175
11701176# We no longer need kpatch-cc
11711177for (( idx= 0 ; idx< ${# MAKEVARS[@]} ; idx++ )) ; do
11721178 MAKEVARS[$idx ]=${MAKEVARS[$idx]/ ${KPATCH_CC_PREFIX} / }
11731179done
11741180
1175- export KPATCH_BUILD=" $KPATCH_BUILD " KPATCH_NAME=" $MODNAME " \
1181+ export KPATCH_BUILD=" $BUILDDIR " KPATCH_NAME=" $MODNAME " \
11761182KBUILD_EXTRA_SYMBOLS=" $KBUILD_EXTRA_SYMBOLS " \
11771183KPATCH_LDFLAGS=" $KPATCH_LDFLAGS "
11781184save_env
0 commit comments