mirror of
https://github.com/dynup/kpatch
synced 2024-12-13 00:44:34 +00:00
07433e98c0
To support building out-of-tree kernel modules, the source tree prefix
is attempted to be stripped from change object file paths to make them
relative. However, if the path is already relative, the change can
strip a substring instead, resulting in build errors.
Ensure just the prefix is stripped instead of any substring.
Fixes: #1282
Fixes: 51a8fad34f
("Add support for building out-of-tree modules")
92 lines
2.0 KiB
Bash
Executable File
92 lines
2.0 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
if [[ ${KPATCH_GCC_DEBUG:-0} -ne 0 ]]; then
|
|
set -o xtrace
|
|
fi
|
|
|
|
TOOLCHAINCMD="$1"
|
|
shift
|
|
|
|
if [[ -z "$KPATCH_GCC_TEMPDIR" ]]; then
|
|
exec "$TOOLCHAINCMD" "$@"
|
|
fi
|
|
|
|
declare -a args=("$@")
|
|
|
|
if [[ "$TOOLCHAINCMD" =~ ^(.*-)?gcc$ || "$TOOLCHAINCMD" =~ ^(.*-)?clang$ ]] ; then
|
|
while [ "$#" -gt 0 ]; do
|
|
if [ "$1" = "-o" ]; then
|
|
obj="$2"
|
|
|
|
# skip copying the temporary .o files created by
|
|
# recordmcount.pl
|
|
[[ "$obj" = */.tmp_mc_*.o ]] && break;
|
|
|
|
[[ "$obj" = */.tmp_*.o ]] && obj="${obj/.tmp_/}"
|
|
relobj=${obj##$KPATCH_GCC_SRCDIR/}
|
|
case "$relobj" in
|
|
*.mod.o|\
|
|
*built-in.o|\
|
|
*built-in.a|\
|
|
vmlinux.o|\
|
|
.tmp_kallsyms1.o|\
|
|
.tmp_kallsyms2.o|\
|
|
init/version.o|\
|
|
arch/x86/boot/version.o|\
|
|
arch/x86/boot/compressed/eboot.o|\
|
|
arch/x86/boot/header.o|\
|
|
arch/x86/boot/compressed/efi_stub_64.o|\
|
|
arch/x86/boot/compressed/piggy.o|\
|
|
kernel/system_certificates.o|\
|
|
arch/x86/vdso/*|\
|
|
arch/x86/entry/vdso/*|\
|
|
drivers/firmware/efi/libstub/*|\
|
|
arch/powerpc/kernel/prom_init.o|\
|
|
arch/powerpc/kernel/vdso64/*|\
|
|
arch/s390/boot/*|\
|
|
arch/s390/purgatory/*|\
|
|
arch/s390/kernel/vdso64/*|\
|
|
lib/*|\
|
|
.*.o|\
|
|
*/.lib_exports.o)
|
|
break
|
|
;;
|
|
*.o)
|
|
mkdir -p "$KPATCH_GCC_TEMPDIR/orig/$(dirname "$relobj")"
|
|
[[ -e "$obj" ]] && cp -f "$obj" "$KPATCH_GCC_TEMPDIR/orig/$relobj"
|
|
echo "$relobj" >> "$KPATCH_GCC_TEMPDIR/changed_objs"
|
|
break
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
fi
|
|
shift
|
|
done
|
|
elif [[ "$TOOLCHAINCMD" =~ ^(.*-)?ld || "$TOOLCHAINCMD" =~ ^(.*-)?ld.lld ]] ; then
|
|
while [ "$#" -gt 0 ]; do
|
|
if [ "$1" = "-o" ]; then
|
|
obj="$2"
|
|
relobj=${obj//$KPATCH_GCC_SRCDIR\//}
|
|
case "$obj" in
|
|
*.ko)
|
|
mkdir -p "$KPATCH_GCC_TEMPDIR/module/$(dirname "$relobj")"
|
|
cp -f "$obj" "$KPATCH_GCC_TEMPDIR/module/$relobj"
|
|
break
|
|
;;
|
|
.tmp_vmlinux*|vmlinux)
|
|
args+=(--warn-unresolved-symbols)
|
|
break
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
fi
|
|
shift
|
|
done
|
|
fi
|
|
|
|
exec "$TOOLCHAINCMD" "${args[@]}"
|