summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMunehisa Kamata <kamatam@amazon.com>2024-02-23 00:05:13 -0800
committerSteve Sakoman <steve@sakoman.com>2024-03-13 03:59:26 -1000
commit5d567f14e98dbdd2bec3233dc17943295b034ad8 (patch)
treed5cbfc589b34f9080e8f69a7468d9a2a4a42d734
parented74dbe0c745ccb6d4a71b49462ccfc397100cab (diff)
downloadpoky-5d567f14e98dbdd2bec3233dc17943295b034ad8.tar.gz
kernel.bbclass: Set pkg-config variables for building modules
The pkg-config workaround has been applied for kernel image building, but not for module building. So pkg-config variables are different between do_compile and do_compile_kernelmodules tasks. It may unnecessary trigger rebuilding of a few host tools at the later task. Especially when CONFIG_DEBUG_INFO_BTF is enabled in the kernel, it may even trigger rebuilding vmlinux at do_compile_kernelmodules due to the rebuilt host tools such as certs/extract-cert or objtool (on x86). This eventually creates an inconsistent set of kernel binaries. Here is the repro steps: - Check out nanbield on x86 - The unexpected rebuild happens on kirkstone or possibly earlier - Ensure that pahole is available (e.g. via meta-oe) - Set KERNEL_DEBUG to "True" to properly set up PAHOLE e.g. $ export KERNEL_DEBUG="True" $ export BB_ENV_PASSTHROUGH_ADDITIONS="${BB_ENV_PASSTHROUGH_ADDITIONS} KERNEL_DEBUG" - Enable CONFIG_DEBUG_INFO_BTF=y e.g. $ bitbake -c menuconfig virtual/kernel -> Kernel hacking -> Compile-time checks and compiler options -> Generate BTF typeinfo - Build the kernel e.g. $ bitbake virtual/kernel The BTF information in the resulting bzImage and kernel modules are inconsistent, because the module's BTF information is generated using the "second" vmlinux that doesn't have the identical BTF to the "first" vmlinux. These modules can't be loaded at runtime due to the BTF mismatch. This also leads to a build-id mismatch between the installed bzImage and vmlinux since the bzImage is created from the first vmlinux, but the installed vmlinux is the second one. $ eu-readelf -n tmp/work/qemux86_64-poky-linux/linux-yocto/6.5.13+git/image/boot/{bzImage*,vmlinux*} | grep "Build ID" Build ID: 4a0d62ee7fef0244950f0f604253729875bea493 Build ID: fb99b3d91399dbe42bf67ddee59e0f5a0c7f74d9 To avoid the unexpected rebuilding that results in such inconsistency, set the same pkg-config variables when building kernel and modules. For kernel 5.19 and above, simply set the HOSTPKG_CONFIG in the make command line. (From OE-Core rev: d88e0fa7c5e6c8252f8f775996f512a37fea4818) Signed-off-by: Munehisa Kamata <kamatam@amazon.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> (cherry picked from commit cd2072e5d953af981339427028e19083257e6a92) Signed-off-by: Steve Sakoman <steve@sakoman.com>
-rw-r--r--meta/classes-recipe/kernel.bbclass12
1 files changed, 9 insertions, 3 deletions
diff --git a/meta/classes-recipe/kernel.bbclass b/meta/classes-recipe/kernel.bbclass
index 16b85dbca4..2ff2dff9e2 100644
--- a/meta/classes-recipe/kernel.bbclass
+++ b/meta/classes-recipe/kernel.bbclass
@@ -239,6 +239,8 @@ KERNEL_EXTRA_ARGS ?= ""
239EXTRA_OEMAKE += ' CC="${KERNEL_CC}" LD="${KERNEL_LD}" OBJCOPY="${KERNEL_OBJCOPY}" STRIP="${KERNEL_STRIP}"' 239EXTRA_OEMAKE += ' CC="${KERNEL_CC}" LD="${KERNEL_LD}" OBJCOPY="${KERNEL_OBJCOPY}" STRIP="${KERNEL_STRIP}"'
240EXTRA_OEMAKE += ' HOSTCC="${BUILD_CC}" HOSTCFLAGS="${BUILD_CFLAGS}" HOSTLDFLAGS="${BUILD_LDFLAGS}" HOSTCPP="${BUILD_CPP}"' 240EXTRA_OEMAKE += ' HOSTCC="${BUILD_CC}" HOSTCFLAGS="${BUILD_CFLAGS}" HOSTLDFLAGS="${BUILD_LDFLAGS}" HOSTCPP="${BUILD_CPP}"'
241EXTRA_OEMAKE += ' HOSTCXX="${BUILD_CXX}" HOSTCXXFLAGS="${BUILD_CXXFLAGS}"' 241EXTRA_OEMAKE += ' HOSTCXX="${BUILD_CXX}" HOSTCXXFLAGS="${BUILD_CXXFLAGS}"'
242# Only for newer kernels (5.19+), native pkg-config variables are set for older kernels when building kernel and modules
243EXTRA_OEMAKE += ' HOSTPKG_CONFIG="pkg-config-native"'
242 244
243KERNEL_ALT_IMAGETYPE ??= "" 245KERNEL_ALT_IMAGETYPE ??= ""
244 246
@@ -356,9 +358,6 @@ kernel_do_compile() {
356 export PKG_CONFIG_LIBDIR="$PKG_CONFIG_DIR" 358 export PKG_CONFIG_LIBDIR="$PKG_CONFIG_DIR"
357 export PKG_CONFIG_SYSROOT_DIR="" 359 export PKG_CONFIG_SYSROOT_DIR=""
358 360
359 # for newer kernels (5.19+) there's a dedicated variable
360 export HOSTPKG_CONFIG="pkg-config-native"
361
362 if [ "${KERNEL_DEBUG_TIMESTAMPS}" != "1" ]; then 361 if [ "${KERNEL_DEBUG_TIMESTAMPS}" != "1" ]; then
363 # kernel sources do not use do_unpack, so SOURCE_DATE_EPOCH may not 362 # kernel sources do not use do_unpack, so SOURCE_DATE_EPOCH may not
364 # be set.... 363 # be set....
@@ -408,6 +407,13 @@ addtask transform_kernel after do_compile before do_install
408 407
409do_compile_kernelmodules() { 408do_compile_kernelmodules() {
410 unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS MACHINE 409 unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS MACHINE
410
411 # setup native pkg-config variables (kconfig scripts call pkg-config directly, cannot generically be overriden to pkg-config-native)
412 export PKG_CONFIG_DIR="${STAGING_DIR_NATIVE}${libdir_native}/pkgconfig"
413 export PKG_CONFIG_PATH="$PKG_CONFIG_DIR:${STAGING_DATADIR_NATIVE}/pkgconfig"
414 export PKG_CONFIG_LIBDIR="$PKG_CONFIG_DIR"
415 export PKG_CONFIG_SYSROOT_DIR=""
416
411 if [ "${KERNEL_DEBUG_TIMESTAMPS}" != "1" ]; then 417 if [ "${KERNEL_DEBUG_TIMESTAMPS}" != "1" ]; then
412 # kernel sources do not use do_unpack, so SOURCE_DATE_EPOCH may not 418 # kernel sources do not use do_unpack, so SOURCE_DATE_EPOCH may not
413 # be set.... 419 # be set....