Skip to content

Commit 34622a2

Browse files
committed
kpatch-build: add cross-compilation support
This patch introduces ability to pick a CROSS_COMPILE environment variable which can be used for specifying toolchain prefix for all gcc utils (gcc, ld, objcopy etc). DISTRO checks are disabled if VMLINUX and USERSRCDIR are specified.
1 parent 71fe6c5 commit 34622a2

File tree

1 file changed

+22
-15
lines changed

1 file changed

+22
-15
lines changed

kpatch-build/kpatch-build

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ find_core_symvers() {
267267
}
268268

269269
gcc_version_from_file() {
270-
readelf -p .comment "$1" | grep -m 1 -o 'GCC:.*'
270+
"$CROSS_COMPILE"readelf -p .comment "$1" | grep -m 1 -o 'GCC:.*'
271271
}
272272

273273
gcc_version_check() {
@@ -278,7 +278,7 @@ gcc_version_check() {
278278
# gcc --version varies between distributions therefore extract version
279279
# by compiling a test file and compare it to vmlinux's version.
280280
echo 'void main(void) {}' > "$c"
281-
out="$(gcc -c -pg -ffunction-sections -o "$o" "$c" 2>&1)"
281+
out="$("${CROSS_COMPILE}"gcc -c -pg -ffunction-sections -o "$o" "$c" 2>&1)"
282282
gccver="$(gcc_version_from_file "$o")"
283283
kgccver="$(gcc_version_from_file "$target")"
284284

@@ -288,7 +288,7 @@ gcc_version_check() {
288288
return 1
289289
fi
290290

291-
out="$(gcc -c -gz=none -o "$o" "$c" 2>&1)"
291+
out="$("$CROSS_COMPILE"gcc -c -gz=none -o "$o" "$c" 2>&1)"
292292
if [[ -z "$out" ]]; then
293293
DEBUG_KCFLAGS="-gz=none"
294294
fi
@@ -360,7 +360,7 @@ find_special_section_data() {
360360
local SPECIAL_VARS
361361
# If $AWK_OPTIONS are blank gawk would treat "" as a blank script
362362
# shellcheck disable=SC2086
363-
SPECIAL_VARS="$(readelf -wi "$VMLINUX" |
363+
SPECIAL_VARS="$("$CROSS_COMPILE"readelf -wi "$VMLINUX" |
364364
gawk --non-decimal-data $AWK_OPTIONS '
365365
BEGIN { a = b = e = f = i = j = o = p = s = 0 }
366366
@@ -656,6 +656,8 @@ mkdir -p "$TEMPDIR" || die "Couldn't create $TEMPDIR"
656656
rm -rf "${TEMPDIR:?}"/*
657657
rm -f "$LOGFILE"
658658

659+
660+
659661
if [[ -n "$USERSRCDIR" ]]; then
660662
if [[ -n "$ARCHVERSION" ]]; then
661663
warn "--archversion is incompatible with --sourcedir"
@@ -698,8 +700,12 @@ fi
698700

699701
# Don't check external file.
700702
# shellcheck disable=SC1090
701-
[[ -f "$RELEASE_FILE" ]] && source "$RELEASE_FILE"
702-
DISTRO="$ID"
703+
if [[ -z "$USERSRCDIR" ]] && [[ -f "$RELEASE_FILE" ]]; then
704+
source "$RELEASE_FILE"
705+
DISTRO="$ID"
706+
fi
707+
708+
703709
if [[ "$DISTRO" = fedora ]] || [[ "$DISTRO" = rhel ]] || [[ "$DISTRO" = ol ]] || [[ "$DISTRO" = centos ]] || [[ "$DISTRO" = openEuler ]]; then
704710
[[ -z "$VMLINUX" ]] && VMLINUX="/usr/lib/debug/lib/modules/$ARCHVERSION/vmlinux"
705711
[[ -e "$VMLINUX" ]] || die "kernel-debuginfo-$ARCHVERSION not installed"
@@ -929,17 +935,17 @@ unset KPATCH_GCC_TEMPDIR
929935
KPATCH_CC_PREFIX="$TOOLSDIR/kpatch-cc "
930936
declare -a MAKEVARS
931937
if [[ -n "$CONFIG_CC_IS_CLANG" ]]; then
932-
MAKEVARS+=("CC=${KPATCH_CC_PREFIX}clang")
938+
MAKEVARS+=("CC=${KPATCH_CC_PREFIX}${CROSS_COMPILE}clang")
933939
MAKEVARS+=("HOSTCC=clang")
934940
else
935-
MAKEVARS+=("CC=${KPATCH_CC_PREFIX}gcc")
941+
MAKEVARS+=("CC=${KPATCH_CC_PREFIX}${CROSS_COMPILE}gcc")
936942
fi
937943

938944
if [[ -n "$CONFIG_LD_IS_LLD" ]]; then
939-
MAKEVARS+=("LD=${KPATCH_CC_PREFIX}ld.lld")
945+
MAKEVARS+=("LD=${KPATCH_CC_PREFIX}${CROSS_COMPILE}ld.lld")
940946
MAKEVARS+=("HOSTLD=ld.lld")
941947
else
942-
MAKEVARS+=("LD=${KPATCH_CC_PREFIX}ld")
948+
MAKEVARS+=("LD=${KPATCH_CC_PREFIX}${CROSS_COMPILE}ld")
943949
fi
944950

945951

@@ -1072,7 +1078,7 @@ for i in $FILES; do
10721078
SYMVERS_FILE="$BUILDDIR/Module.symvers"
10731079
fi
10741080

1075-
readelf -s --wide "$KOBJFILE_PATH" > "$SYMTAB"
1081+
"$CROSS_COMPILE"readelf -s --wide "$KOBJFILE_PATH" > "$SYMTAB"
10761082
if [[ "$ARCH" = "ppc64le" ]]; then
10771083
sed -ri 's/\s+\[<localentry>: 8\]//' "$SYMTAB"
10781084
fi
@@ -1129,7 +1135,7 @@ fi
11291135
cd "$TEMPDIR/output" || die
11301136
# $KPATCH_LDFLAGS and result of find used as list, no quotes.
11311137
# shellcheck disable=SC2086,SC2046
1132-
ld -r $KPATCH_LDFLAGS -o ../patch/tmp_output.o $(find . -name "*.o") 2>&1 | logger || die
1138+
"$CROSS_COMPILE"ld -r $KPATCH_LDFLAGS -o ../patch/tmp_output.o $(find . -name "*.o") 2>&1 | logger || die
11331139

11341140
if [[ "$USE_KLP" -eq 1 ]]; then
11351141
cp -f "$TEMPDIR"/patch/tmp_output.o "$TEMPDIR"/patch/output.o || die
@@ -1138,7 +1144,7 @@ if [[ "$USE_KLP" -eq 1 ]]; then
11381144
else
11391145
# Add .kpatch.checksum for kpatch script
11401146
md5sum ../patch/tmp_output.o | awk '{printf "%s\0", $1}' > checksum.tmp || die
1141-
objcopy --add-section .kpatch.checksum=checksum.tmp --set-section-flags .kpatch.checksum=alloc,load,contents,readonly ../patch/tmp_output.o || die
1147+
"$CROSS_COMPILE"objcopy --add-section .kpatch.checksum=checksum.tmp --set-section-flags .kpatch.checksum=alloc,load,contents,readonly ../patch/tmp_output.o || die
11421148
rm -f checksum.tmp
11431149
"$TOOLSDIR"/create-kpatch-module "$TEMPDIR"/patch/tmp_output.o "$TEMPDIR"/patch/output.o 2>&1 | logger 1
11441150
check_pipe_status create-kpatch-module
@@ -1154,7 +1160,8 @@ done
11541160

11551161
export KPATCH_BUILD="$KERNEL_SRCDIR" KPATCH_NAME="$MODNAME" \
11561162
KBUILD_EXTRA_SYMBOLS="$KBUILD_EXTRA_SYMBOLS" \
1157-
KPATCH_LDFLAGS="$KPATCH_LDFLAGS"
1163+
KPATCH_LDFLAGS="$KPATCH_LDFLAGS" \
1164+
CROSS_COMPILE="$CROSS_COMPILE"
11581165
save_env
11591166

11601167
make "${MAKEVARS[@]}" 2>&1 | logger || die
@@ -1192,7 +1199,7 @@ if [[ -n "$CONFIG_MODVERSIONS" ]]; then
11921199
fi
11931200
fi
11941201

1195-
readelf --wide --symbols "$TEMPDIR/patch/$MODNAME.ko" 2>/dev/null | \
1202+
"$CROSS_COMPILE"readelf --wide --symbols "$TEMPDIR/patch/$MODNAME.ko" 2>/dev/null | \
11961203
sed -r 's/\s+\[<localentry>: 8\]//' | \
11971204
awk '($4=="FUNC" || $4=="OBJECT") && ($5=="GLOBAL" || $5=="WEAK") && $7!="UND" {print $NF}' \
11981205
>"${TEMPDIR}"/new_symbols

0 commit comments

Comments
 (0)