diff options
author | Munehisa Kamata <kamatam@amazon.com> | 2024-02-23 00:05:13 -0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2024-02-24 16:10:23 +0000 |
commit | 79191f8590a90fb95a753ecb37f07c1630029fae (patch) | |
tree | 250ffdf60d2d8f47643ca56ec53c1400c87c2b72 /meta | |
parent | 47c5f1f1c504fe7d41efd0326cf040f564008b1e (diff) | |
download | poky-79191f8590a90fb95a753ecb37f07c1630029fae.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: cd2072e5d953af981339427028e19083257e6a92)
Signed-off-by: Munehisa Kamata <kamatam@amazon.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r-- | meta/classes-recipe/kernel.bbclass | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/meta/classes-recipe/kernel.bbclass b/meta/classes-recipe/kernel.bbclass index a76aaee5ba..db4461e551 100644 --- a/meta/classes-recipe/kernel.bbclass +++ b/meta/classes-recipe/kernel.bbclass | |||
@@ -239,6 +239,8 @@ KERNEL_EXTRA_ARGS ?= "" | |||
239 | EXTRA_OEMAKE += ' CC="${KERNEL_CC}" LD="${KERNEL_LD}" OBJCOPY="${KERNEL_OBJCOPY}" STRIP="${KERNEL_STRIP}"' | 239 | EXTRA_OEMAKE += ' CC="${KERNEL_CC}" LD="${KERNEL_LD}" OBJCOPY="${KERNEL_OBJCOPY}" STRIP="${KERNEL_STRIP}"' |
240 | EXTRA_OEMAKE += ' HOSTCC="${BUILD_CC}" HOSTCFLAGS="${BUILD_CFLAGS}" HOSTLDFLAGS="${BUILD_LDFLAGS}" HOSTCPP="${BUILD_CPP}"' | 240 | EXTRA_OEMAKE += ' HOSTCC="${BUILD_CC}" HOSTCFLAGS="${BUILD_CFLAGS}" HOSTLDFLAGS="${BUILD_LDFLAGS}" HOSTCPP="${BUILD_CPP}"' |
241 | EXTRA_OEMAKE += ' HOSTCXX="${BUILD_CXX}" HOSTCXXFLAGS="${BUILD_CXXFLAGS}"' | 241 | EXTRA_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 | ||
243 | EXTRA_OEMAKE += ' HOSTPKG_CONFIG="pkg-config-native"' | ||
242 | 244 | ||
243 | KERNEL_ALT_IMAGETYPE ??= "" | 245 | KERNEL_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 | ||
409 | do_compile_kernelmodules() { | 408 | do_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.... |