Skip to content

Commit

Permalink
Merge pull request #1393 from joe-lawrence/ld-orphan-error
Browse files Browse the repository at this point in the history
Fix builds with CONFIG_ERROR
  • Loading branch information
joe-lawrence authored May 15, 2024
2 parents b75d4c4 + 69e71f8 commit bb93ac9
Showing 1 changed file with 41 additions and 10 deletions.
51 changes: 41 additions & 10 deletions kpatch-build/kpatch-build
Original file line number Diff line number Diff line change
Expand Up @@ -181,14 +181,37 @@ remove_patches() {
[[ -d "$BUILDDIR/.git" ]] && (cd "$BUILDDIR" && git update-index -q --refresh)
}

# List of kernel tree files that kpatch-build backed up to
# $KERNEL_BACKUPDIR before modification
declare -a BACKUP_KERNEL_FILES
KERNEL_BACKUPDIR="$TEMPDIR/kernel-backup"

# Save a kernel file (i.e. "scripts/Makefile.modfinal")
backup_kernel_file() {
local kernel_path="$1"

if [[ ! -e "$KERNEL_SRCDIR/$kernel_path" ]]; then
die "Kernel path not found: $KERNEL_SRCDIR/$kernel_path"
fi

mkdir --parents "$KERNEL_BACKUPDIR/$(dirname "$kernel_path")" || die
cp --force "$KERNEL_SRCDIR/$kernel_path" "$KERNEL_BACKUPDIR/$kernel_path" || die

BACKUP_KERNEL_FILES+=("$kernel_path")
}

# Restore all kernel files backed up by backup_kernel_file()
restore_kernel_files() {
for kernel_path in "${BACKUP_KERNEL_FILES[@]}"; do
if ! mv --force "$KERNEL_BACKUPDIR/$kernel_path" "$KERNEL_SRCDIR/$kernel_path"; then
warn "Couldn't restore kernel path: $kernel_path"
fi
done
}

cleanup() {
remove_patches

# restore any files that were modified for the build
[[ -e "$TEMPDIR/vmlinux" ]] && mv -f "$TEMPDIR/vmlinux" "$KERNEL_SRCDIR/"
[[ -e "$TEMPDIR/link-vmlinux.sh" ]] && mv -f "$TEMPDIR/link-vmlinux.sh" "$KERNEL_SRCDIR/scripts"
[[ -e "$TEMPDIR/Makefile.modfinal" ]] && mv -f "$TEMPDIR/Makefile.modfinal" "$KERNEL_SRCDIR/scripts"
[[ -e "$TEMPDIR/setlocalversion" ]] && mv -f "$TEMPDIR/setlocalversion" "$KERNEL_SRCDIR/scripts"
restore_kernel_files

[[ "$DEBUG" -eq 0 ]] && rm -rf "$TEMPDIR"
rm -rf "$RPMTOPDIR"
Expand Down Expand Up @@ -932,7 +955,7 @@ if [[ -n "$USERSRCDIR" ]]; then

# save original vmlinux before it gets overwritten by sourcedir build
if [[ "$VMLINUX" -ef "$KERNEL_SRCDIR"/vmlinux ]]; then
cp -f "$VMLINUX" "$TEMPDIR/vmlinux" || die
backup_kernel_file "vmlinux"
VMLINUX="$TEMPDIR/vmlinux"
fi
elif [[ -n "$OOT_MODULE" ]]; then
Expand Down Expand Up @@ -1102,7 +1125,7 @@ fi
# changes to the source.
if [[ -n "$USERSRCDIR" && -e "$KERNEL_SRCDIR/.git" ]]; then
cd "$KERNEL_SRCDIR" || die
cp -f scripts/setlocalversion "$TEMPDIR" || die
backup_kernel_file "scripts/setlocalversion"
LOCALVERSION="$(make kernelversion)"
LOCALVERSION="$(KERNELVERSION="$LOCALVERSION" ./scripts/setlocalversion)"
[[ -n "$LOCALVERSION" ]] || die "setlocalversion failed"
Expand Down Expand Up @@ -1165,15 +1188,23 @@ fi
# link-vmlinux.sh and Makefile.modfinal since kpatch doesn't care about
# that anyway.
if [[ -n "$CONFIG_DEBUG_INFO_BTF" ]]; then
cp -f "$KERNEL_SRCDIR/scripts/link-vmlinux.sh" "$TEMPDIR/link-vmlinux.sh" || die
backup_kernel_file "scripts/link-vmlinux.sh"
sed -i 's/CONFIG_DEBUG_INFO_BTF/DISABLED_FOR_KPATCH_BUILD/g' "$KERNEL_SRCDIR"/scripts/link-vmlinux.sh || die

if [[ -e "$KERNEL_SRCDIR/scripts/Makefile.modfinal" ]]; then
cp -f "$KERNEL_SRCDIR/scripts/Makefile.modfinal" "$TEMPDIR/Makefile.modfinal" || die
backup_kernel_file "scripts/Makefile.modfinal"
sed -i 's/CONFIG_DEBUG_INFO_BTF_MODULES/DISABLED_FOR_KPATCH_BUILD/g' "$KERNEL_SRCDIR"/scripts/Makefile.modfinal || die
fi
fi

# CONFIG_LD_ORPHAN_WARN_LEVEL="error" will fail kernel builds with
# --ffunction-sections with lots of "ld: error: unplaced orphan section"
# errors. Temporarily demote to "warn"ings in the kernel Makefile.
if [[ "$CONFIG_LD_ORPHAN_WARN_LEVEL" == "error" ]]; then
backup_kernel_file "Makefile"
sed -i 's/--orphan-handling=[$](CONFIG_LD_ORPHAN_WARN_LEVEL)/--orphan-handling="warn"/g' "$KERNEL_SRCDIR/Makefile" || die
fi

if [[ -n "$CONFIG_CC_IS_CLANG" ]]; then
echo "WARNING: Clang support is experimental"
fi
Expand Down

0 comments on commit bb93ac9

Please sign in to comment.