3333# - Builds the patched kernel/module and monitors changed objects
3434# - Builds the patched objects with gcc flags -f[function|data]-sections
3535# - Runs kpatch tools to create and link the patch kernel module
36- VERSION=0.9.10
36+ VERSION=0.9.11
3737
3838set -o pipefail
3939
4040BASE=" $PWD "
4141SCRIPTDIR=" $( readlink -f " $( dirname " $( type -p " $0 " ) " ) " ) "
4242ARCH=" $( uname -m) "
43+ TARGET_ARCH=" ${TARGET_ARCH:- $ARCH } "
4344CPUS=" $( getconf _NPROCESSORS_ONLN) "
4445CACHEDIR=" ${CACHEDIR:- $HOME / .kpatch} "
4546KERNEL_SRCDIR=" $CACHEDIR /src"
@@ -82,7 +83,8 @@ declare -rA SUPPORTED_RPM_DISTROS=(
8283 [" photon" ]=" Photon OS"
8384 [" rhel" ]=" RHEL"
8485 [" almalinux" ]=" AlmaLinux"
85- [" amzn" ]=" Amazon Linux" )
86+ [" amzn" ]=" Amazon Linux"
87+ [" rocky" ]=" Rocky" )
8688
8789
8890warn () {
@@ -406,7 +408,7 @@ find_special_section_data() {
406408 check[e]=true # exception_table_entry
407409
408410 # Arch-specific features
409- case " $ARCH " in
411+ case " $TARGET_ARCH " in
410412 " x86_64" )
411413 check[a]=true # alt_instr
412414 kernel_version_gte 5.10.0 && check[s]=true # static_call_site
@@ -741,6 +743,15 @@ print_supported_distro(){
741743 fi
742744}
743745
746+ # Used in "make ARCH=xxx" when making the kernel.
747+ # Match "aarch64" to "arm64", while keep everything else the same.
748+ kernel_make_arch () {
749+ if [[ " $1 " == " aarch64" ]]; then
750+ echo " arm64"
751+ else
752+ echo " $1 "
753+ fi
754+ }
744755
745756usage () {
746757 echo " usage: $( basename " $0 " ) [options] <patch1 ... patchN>" >&2
@@ -874,16 +885,28 @@ if [[ ${#PATCH_LIST[@]} -eq 0 ]]; then
874885fi
875886
876887trace_on
888+ # Don't check external file.
889+ # shellcheck disable=SC1090
890+ if [[ -z " $USERSRCDIR " ]] && [[ -f " $RELEASE_FILE " ]]; then
891+ source " $RELEASE_FILE "
892+ DISTRO=" $ID "
893+ fi
894+
877895
878896if [[ -n " $SRCRPM " ]]; then
879897 if [[ -n " $ARCHVERSION " ]]; then
880898 warn " --archversion is incompatible with --sourcerpm"
881899 exit 1
882900 fi
883901 rpmname=" $( basename " $SRCRPM " ) "
884- ARCHVERSION=" ${rpmname% .src.rpm} .$( uname -m) "
902+ if [[ " $DISTRO " = photon ]]; then
903+ ARCHVERSION=" ${rpmname% .src.rpm} "
904+ else
905+ ARCHVERSION=" ${rpmname% .src.rpm} .$( uname -m) "
906+ fi
885907 ARCHVERSION=" ${ARCHVERSION# kernel-} "
886908 ARCHVERSION=" ${ARCHVERSION# alt-} "
909+ ARCHVERSION=" ${ARCHVERSION# linux-} "
887910fi
888911
889912if [[ -n " $OOT_MODULE " ]] && [[ -z " $OOT_MODULE_SRCDIR " ]]; then
933956
934957[[ " $SKIPCLEANUP " -eq 0 ]] && trap cleanup EXIT INT TERM HUP
935958
936- # Don't check external file.
937- # shellcheck disable=SC1090
938- if [[ -z " $USERSRCDIR " ]] && [[ -f " $RELEASE_FILE " ]]; then
939- source " $RELEASE_FILE "
940- DISTRO=" $ID "
941- fi
942-
943959KVER=" ${ARCHVERSION%% -* } "
944960if [[ " $ARCHVERSION " =~ - ]]; then
945961 # handle flavor extension on Photon ex) -rt, -esx
@@ -951,12 +967,12 @@ if [[ "$ARCHVERSION" =~ - ]]; then
951967 KREL=" ${KREL% -* } "
952968 KREL=" ${KREL#* -} "
953969
954- PH_TAG=" ${ ARCHVERSION##* .} "
955- PH_FLAVOR= " ${PH_TAG ##* -} "
956- PH_TAG =" ${PH_TAG %% - * } "
957-
958- # if no flavor, these will be the same
959- [[ " $PH_FLAVOR " = " $PH_TAG " ]] && PH_FLAVOR= " "
970+ PH_TAG=$( echo " $ ARCHVERSION" | grep -oE ' ph[0-9]+ ' )
971+ if [[ " $ARCHVERSION " =~ (^ | [- \. ])(rt | esx | aws)($ | [- \. ]) ]] ; then
972+ PH_FLAVOR =" ${BASH_REMATCH[2] } "
973+ else
974+ PH_FLAVOR= " "
975+ fi
960976 else
961977 KREL=" ${ARCHVERSION##* -} "
962978 fi
@@ -1034,11 +1050,9 @@ else
10341050 if [ -z " $SRCRPM " ]; then
10351051 SRCRPM=" $TEMPDIR /kernel$ALT -$KVER -$KREL .src.rpm"
10361052 fi
1037-
10381053 fi
10391054
10401055 echo " Unpacking kernel source"
1041-
10421056 if [[ " $DISTRO " = photon ]]; then
10431057 [[ -n " $PH_FLAVOR " ]] && SPECNAME=" linux-$PH_FLAVOR .spec" || SPECNAME=" linux.spec"
10441058 else
@@ -1049,7 +1063,7 @@ else
10491063
10501064 # Define dist tag to handle rpmbuild of the linux src rpm in Photon
10511065 if [[ " $DISTRO " = photon ]] && [ " $( rpm -E %dist) " = " %dist" ]; then
1052- sed -i " 1s/^/ %define dist .$PH_TAG / " " $RPMTOPDIR " /SPECS/" $SPECNAME "
1066+ sed -i " 1s|^| %define dist .$PH_TAG \n\n| " " $RPMTOPDIR " /SPECS/" $SPECNAME "
10531067 fi
10541068
10551069 rpmbuild -D " _topdir $RPMTOPDIR " -bp --nodeps " --target=$( uname -m) " " $RPMTOPDIR " /SPECS/" $SPECNAME " 2>&1 | logger || die " rpmbuild -bp failed. you may need to run 'yum-builddep kernel' first."
@@ -1061,19 +1075,6 @@ else
10611075 elif [[ " $DISTRO " = opencloudos ]]; then
10621076 mv " $RPMTOPDIR " /BUILD/kernel-* /kernel-* " $KERNEL_SRCDIR " 2>&1 | logger || die
10631077 elif [[ " $DISTRO " = photon ]]; then
1064- # Photon has some files that are copied over during the build section of the spec file (instead of prep)
1065- # These change occasionally, so check they exist before copying
1066- ls " $RPMTOPDIR " /BUILD/fips* canister* & > /dev/null && ( cp -rT " $RPMTOPDIR " /BUILD/fips* canister* " $RPMTOPDIR " /BUILD/linux-" $KVER " /crypto | logger || die )
1067- [[ -f " $RPMTOPDIR " /SOURCES/fips_canister-kallsyms ]] && ( cp " $RPMTOPDIR " /SOURCES/fips_canister-kallsyms rpmbuild/BUILD/linux-" $KVER " /crypto | logger || die )
1068-
1069- if [[ -z " $CONFIGFILE " ]]; then
1070- # Photon has multiple config files per src rpm sometimes, and naming is not consistent.
1071- # So do our best to find the right one by parsing the spec file
1072- SRC_CFG=$( rpmspec -P -D " _topdir $RPMTOPDIR " " $RPMTOPDIR " /SPECS/" $SPECNAME " | awk ' /^cp .*\/SOURCES\/config.* \.config$/{print $2}' )
1073- [[ -z " $SRC_CFG " ]] && die " Failed to locate kernel config file"
1074- SRC_CFG=" ${SRC_CFG##*/ } "
1075- cp " $RPMTOPDIR " /SOURCES/" $SRC_CFG " " $RPMTOPDIR " /BUILD/linux-" $KVER " | logger || die
1076- fi
10771078 mv " $RPMTOPDIR " /BUILD/linux-" $KVER " " $KERNEL_SRCDIR " 2>&1 | logger || die
10781079 else
10791080 mv " $RPMTOPDIR " /BUILD/kernel-* /linux-* " $KERNEL_SRCDIR " 2>&1 | logger || die
@@ -1091,20 +1092,14 @@ else
10911092 if [[ " $DISTRO " = openEuler ]] || [[ " $DISTRO " = opencloudos ]]; then
10921093 [[ -z " $CONFIGFILE " ]] && CONFIGFILE=" /boot/config-${ARCHVERSION} "
10931094 elif [[ " $DISTRO " = photon ]]; then
1094- [[ -z " $CONFIGFILE " ]] && CONFIGFILE=" $KERNEL_SRCDIR /$SRC_CFG "
1095-
1096- # modify config file here to get the right vermagic, as Photon does not always listen to localversion file
1097- if [[ -z " $PH_FLAVOR " ]]; then
1098- sed -i s/^CONFIG_LOCALVERSION=\" .* \" /CONFIG_LOCALVERSION=\" -" $KREL " ." $PH_TAG " \" /g " $CONFIGFILE " || die
1099- else
1100- sed -i s/^CONFIG_LOCALVERSION=\" .* \" /CONFIG_LOCALVERSION=\" -" $KREL " ." $PH_TAG " -" $PH_FLAVOR " \" /g " $CONFIGFILE " || die
1101- fi
1102-
1095+ [[ -z " $CONFIGFILE " ]] && CONFIGFILE=" $KERNEL_SRCDIR " /.config
11031096 else
11041097 [[ -z " $CONFIGFILE " ]] && CONFIGFILE=" $KERNEL_SRCDIR /configs/kernel$ALT -$KVER -$ARCH .config"
11051098 fi
1099+ if [[ ! " $DISTRO " = photon ]]; then
1100+ (cd " $KERNEL_SRCDIR " && make mrproper 2>&1 | logger) || die
1101+ fi
11061102
1107- (cd " $KERNEL_SRCDIR " && make mrproper 2>&1 | logger) || die
11081103
11091104 elif is_supported_deb_distro " $DISTRO " ; then
11101105
@@ -1330,6 +1325,11 @@ else
13301325 MAKEVARS+=(" LD=${KPATCH_CC_PREFIX}${LD} " )
13311326fi
13321327
1328+ if [[ " $ARCH " != " $TARGET_ARCH " ]]; then
1329+ KARCH=$( kernel_make_arch " $TARGET_ARCH " )
1330+ MAKEVARS+=(" ARCH=$KARCH " )
1331+ fi
1332+
13331333
13341334# $TARGETS used as list, no quotes.
13351335# shellcheck disable=SC2086
@@ -1520,7 +1520,12 @@ fi
15201520cd " $TEMPDIR /output" || die
15211521# $KPATCH_LDFLAGS and result of find used as list, no quotes.
15221522# shellcheck disable=SC2086,SC2046
1523- " $LD " -r $KPATCH_LDFLAGS -o ../patch/tmp_output.o $( find . -name " *.o" ) 2>&1 | logger || die
1523+ if [[ " $ARCH " != " $TARGET_ARCH " ]]; then
1524+ # if cross compiling, use LLD to link
1525+ " $LLD " -r $KPATCH_LDFLAGS -o ../patch/tmp_output.o $( find . -name " *.o" ) 2>&1 | logger || die
1526+ else
1527+ " $LD " -r $KPATCH_LDFLAGS -o ../patch/tmp_output.o $( find . -name " *.o" ) 2>&1 | logger || die
1528+ fi
15241529
15251530if [[ " $USE_KLP " -eq 1 ]]; then
15261531 cp -f " $TEMPDIR " /patch/tmp_output.o " $TEMPDIR " /patch/output.o || die
0 commit comments