Linux kbuild/kconfig development
 help / color / mirror / Atom feed
* [PATCH v2] kbuild: rpm-pkg: Preserve .BTF section in kernel modules during debuginfo stripping
@ 2026-07-16  2:53 Yafang Shao
       [not found] ` <20260716030116.C613E1F000E9@smtp.kernel.org>
  0 siblings, 1 reply; 3+ messages in thread
From: Yafang Shao @ 2026-07-16  2:53 UTC (permalink / raw)
  To: nathan, nsc; +Cc: linux-kbuild, bpf, Yafang Shao

After switching to the kernel's default package scripts for our local
kernel RPM builds, we noticed that module BTF entries were missing:

  $ ls /sys/kernel/btf/
  vmlinux    <<<< only vmlinux, no module BTF

Root cause: find-debuginfo.sh (from the debugedit package) prefers
eu-strip over strip when elfutils is installed, which is the common
case on RHEL 9. eu-strip removes non-allocated ELF sections, including
the .BTF section that contains BPF Type Format information for kernel
modules. Without .BTF, BPF tools (bpftool, bcc, bpftrace) cannot resolve
kernel types at runtime, and /sys/kernel/btf/<module> entries are not
created when modules are loaded.

Fix by passing --keep-section .BTF via _find_debuginfo_opts, which adds
-K .BTF to the eu-strip/strip command, preserving the .BTF section while
allowing normal debuginfo extraction to proceed.

After this change, all module BTF files are properly generated:

  $ ls /sys/kernel/btf/
  aesni_intel         drm                 i2c_i801            mfd_core
  ahci                drm_client_lib      i2c_mux             net_failover
  backlight           drm_kms_helper      i2c_smbus           pcspkr
  ccp                 drm_shmem_helper    input_leds          qemu_fw_cfg
  dm_log              failover            intel_rapl_common   sch_fq_codel
  dm_mirror           fat                 intel_rapl_msr      serio_raw
  dm_mod              fuse                irqbypass           sunrpc
  dm_region_hash      gf128mul            iTCO_wdt            vfat
  virtio_balloon      virtio_console      virtio_dma_buf      virtio_gpu
  virtio_net          virtio_rng          virtio_blk          vmlinux
  xfs

Assisted-by: Comagic:DeepSeek-V4-Flash
Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
---
 scripts/package/kernel.spec | 2 +-
 scripts/package/mkspec      | 5 +++++
 2 files changed, 6 insertions(+), 1 deletion(-)

v1->v2: check if find-debuginfo.sh supports --keep-section (sashiko-bot)

diff --git a/scripts/package/kernel.spec b/scripts/package/kernel.spec
index c732415662ef..2e16de54ed74 100644
--- a/scripts/package/kernel.spec
+++ b/scripts/package/kernel.spec
@@ -67,7 +67,7 @@ This package provides debug information for the kernel image and modules from th
 %undefine _unique_debug_srcs
 %undefine _debugsource_packages
 %undefine _debuginfo_subpackages
-%global _find_debuginfo_opts -r
+%global _find_debuginfo_opts -r%{?with_keep_section: --keep-section .BTF}
 %global _missing_build_ids_terminate_build 1
 %global _no_recompute_build_ids 1
 %{debug_package}
diff --git a/scripts/package/mkspec b/scripts/package/mkspec
index c604f8c174e2..00acef348ba8 100755
--- a/scripts/package/mkspec
+++ b/scripts/package/mkspec
@@ -65,6 +65,11 @@ fi
 echo "%define with_debuginfo_manual $with_debuginfo_manual"
 echo "%define with_debuginfo_rpm $with_debuginfo_rpm"
 
+# Detect if find-debuginfo.sh supports --keep-section (RHEL 9+)
+if find-debuginfo.sh --help 2>&1 | grep -q keep-section; then
+	echo "%global with_keep_section 1"
+fi
+
 cat<<EOF
 %define ARCH ${ARCH}
 %define KERNELRELEASE ${KERNELRELEASE}
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] kbuild: rpm-pkg: Preserve .BTF section in kernel modules during debuginfo stripping
       [not found]   ` <CALOAHbBQhAsTMHMMZH5Sen0cDYg8GREZMmQcT4Njc9VW_WHe4Q@mail.gmail.com>
@ 2026-07-24  0:00     ` Nathan Chancellor
  2026-07-24  2:49       ` Yafang Shao
  0 siblings, 1 reply; 3+ messages in thread
From: Nathan Chancellor @ 2026-07-24  0:00 UTC (permalink / raw)
  To: Yafang Shao; +Cc: sashiko-reviews, bpf, linux-kbuild, Nicolas Schier

On Thu, Jul 16, 2026 at 05:11:05PM +0800, Yafang Shao wrote:
> On Thu, Jul 16, 2026 at 11:01 AM <sashiko-bot@kernel.org> wrote:
> >
> > Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> > - [Medium] The check for `find-debuginfo.sh` capabilities in `mkspec` hardcodes host properties into `kernel.spec`, breaking SRPM portability across distributions and failing silently when the tool is not in `$PATH`.
> > --
> >
> > --- Patch [1]: [PATCH v2] kbuild: rpm-pkg: Preserve .BTF section in kernel modules during debuginfo stripping ---
> > commit 99202060a54c32638e01a2bfdc4d23b190f3f77c
> > Author: Yafang Shao <laoar.shao@gmail.com>
> >
> > kbuild: rpm-pkg: Preserve .BTF section in kernel modules during debuginfo stripping
> >
> > This commit updates the RPM packaging scripts to pass --keep-section .BTF
> > to find-debuginfo.sh. This ensures that BTF information is preserved when
> > debuginfo is stripped from kernel modules.
> >
> > > diff --git a/scripts/package/mkspec b/scripts/package/mkspec
> > > index c604f8c174e2c..00acef348ba84 100755
> > > --- a/scripts/package/mkspec
> > > +++ b/scripts/package/mkspec
> > [ ... ]
> > > @@ -65,6 +65,11 @@ fi
> > >  echo "%define with_debuginfo_manual $with_debuginfo_manual"
> > >  echo "%define with_debuginfo_rpm $with_debuginfo_rpm"
> > >
> > > +# Detect if find-debuginfo.sh supports --keep-section (RHEL 9+)
> > > +if find-debuginfo.sh --help 2>&1 | grep -q keep-section; then
> > > +     echo "%global with_keep_section 1"
> > > +fi
> >
> > [Severity: Medium]
> > Is it safe to assume find-debuginfo.sh is in the standard user $PATH?
> >
> > On many systems, this script resides in /usr/lib/rpm/, which isn't typically
> > in the $PATH. This could cause the check to silently fail and strip the .BTF
> > section during a local make rpm-pkg build.
> >
> > Also, since mkspec runs during SRPM generation (make srcrpm-pkg), doesn't
> > this statically bake the generation host's capabilities into the resulting
> > kernel.spec file?
> >
> > If the SRPM is rebuilt on an older distribution, rpmbuild might fail because
> > the older script rejects the --keep-section argument. If generated on an
> > older host and built on a newer one, BTF info would be silently stripped.
> > Could we dynamically query the target host's capabilities using something
> > like %(__find_debuginfo) inside the spec file itself?
> >
> > --
> > Sashiko AI review · https://sashiko.dev/#/patchset/20260716025342.42628-1-laoar.shao@gmail.com?part=1
> 
> I believe we could use the builtin _rpmconfigdir to locate
> find-debuginfo.sh reliably. This avoids relying on $PATH.
> What do you think about the following change?

Just an FYI, this was not sent to anyone with authority to comment on
said change, as the Kbuild folks were not included in the AI review
thread. I just happened to find this when browsing the archives.

> diff --git a/scripts/package/kernel.spec b/scripts/package/kernel.spec
> index c732415662ef..4335e99f2aca 100644
> --- a/scripts/package/kernel.spec
> +++ b/scripts/package/kernel.spec
> @@ -67,7 +67,21 @@ This package provides debug information for the
> kernel image and modules from th
>  %undefine _unique_debug_srcs
>  %undefine _debugsource_packages
>  %undefine _debuginfo_subpackages
> +
> +# Preserve .BTF section in kernel modules during debuginfo stripping
> +# find-debuginfo.sh (from debugedit) uses eu-strip which removes
> +# non-allocated ELF sections like .BTF by default.
> +# --keep-section .BTF preserves BPF Type Format information.
> +#
> +# Uses _rpmconfigdir for reliable script location instead of relying on $PATH.
> +%{!?with_keep_section:%global __fd %{_rpmconfigdir}/find-debuginfo.sh}
> +%{!?with_keep_section:%global with_keep_section %(%{__fd} --help 2>&1
> | grep -c keep-section)}
> +%if %{with_keep_section}
> +%global _find_debuginfo_opts -r --keep-section .BTF
> +%else
>  %global _find_debuginfo_opts -r
> +%endif
> +
>  %global _missing_build_ids_terminate_build 1
>  %global _no_recompute_build_ids 1
>  %{debug_package}
> 
> Please let me know if this approach works or if there are any concerns.

/usr/lib/rpm/find-debuginfo.sh might not exist on certain distributions
that can build .rpm packages like Arch Linux:

  $ ls -l /usr/lib/rpm/find-debuginfo.sh
  "/usr/lib/rpm/find-debuginfo.sh": No such file or directory (os error 2)

Even on modern Fedora, this is a symlink:

  $ ls -l /usr/lib/rpm/find-debuginfo.sh
  lrwxrwxrwx@ - root 19 Jul 17:00 /usr/lib/rpm/find-debuginfo.sh -> ../../bin/find-debuginfo

I think we would be better off just using the __find_debuginfo rpm
macro:

  $ rg -m 1 find-debuginfo /usr/lib/rpm/macros
  69:%__find_debuginfo    /usr/bin/find-debuginfo

This appears to work for me, it would be good if you can confirm this
works for you as well.

diff --git a/scripts/package/kernel.spec b/scripts/package/kernel.spec
index c732415662ef..590b5b2e1b40 100644
--- a/scripts/package/kernel.spec
+++ b/scripts/package/kernel.spec
@@ -67,7 +67,18 @@ This package provides debug information for the kernel image and modules from th
 %undefine _unique_debug_srcs
 %undefine _debugsource_packages
 %undefine _debuginfo_subpackages
+
+# Preserve .BTF section in kernel modules during debuginfo stripping
+# find-debuginfo.sh (from debugedit) uses eu-strip which removes
+# non-allocated ELF sections like .BTF by default.
+%global with_keep_section %(%{__find_debuginfo} --help 2>&1 | grep -c keep-section)
+%if %{with_keep_section}
+%global _find_debuginfo_opts -r --keep-section .BTF
+%else
 %global _find_debuginfo_opts -r
+%endif
+
 %global _missing_build_ids_terminate_build 1
 %global _no_recompute_build_ids 1
 %{debug_package}
-- 
Cheers,
Nathan

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] kbuild: rpm-pkg: Preserve .BTF section in kernel modules during debuginfo stripping
  2026-07-24  0:00     ` Nathan Chancellor
@ 2026-07-24  2:49       ` Yafang Shao
  0 siblings, 0 replies; 3+ messages in thread
From: Yafang Shao @ 2026-07-24  2:49 UTC (permalink / raw)
  To: Nathan Chancellor; +Cc: sashiko-reviews, bpf, linux-kbuild, Nicolas Schier

On Fri, Jul 24, 2026 at 8:00 AM Nathan Chancellor <nathan@kernel.org> wrote:
>
> On Thu, Jul 16, 2026 at 05:11:05PM +0800, Yafang Shao wrote:
> > On Thu, Jul 16, 2026 at 11:01 AM <sashiko-bot@kernel.org> wrote:
> > >
> > > Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> > > - [Medium] The check for `find-debuginfo.sh` capabilities in `mkspec` hardcodes host properties into `kernel.spec`, breaking SRPM portability across distributions and failing silently when the tool is not in `$PATH`.
> > > --
> > >
> > > --- Patch [1]: [PATCH v2] kbuild: rpm-pkg: Preserve .BTF section in kernel modules during debuginfo stripping ---
> > > commit 99202060a54c32638e01a2bfdc4d23b190f3f77c
> > > Author: Yafang Shao <laoar.shao@gmail.com>
> > >
> > > kbuild: rpm-pkg: Preserve .BTF section in kernel modules during debuginfo stripping
> > >
> > > This commit updates the RPM packaging scripts to pass --keep-section .BTF
> > > to find-debuginfo.sh. This ensures that BTF information is preserved when
> > > debuginfo is stripped from kernel modules.
> > >
> > > > diff --git a/scripts/package/mkspec b/scripts/package/mkspec
> > > > index c604f8c174e2c..00acef348ba84 100755
> > > > --- a/scripts/package/mkspec
> > > > +++ b/scripts/package/mkspec
> > > [ ... ]
> > > > @@ -65,6 +65,11 @@ fi
> > > >  echo "%define with_debuginfo_manual $with_debuginfo_manual"
> > > >  echo "%define with_debuginfo_rpm $with_debuginfo_rpm"
> > > >
> > > > +# Detect if find-debuginfo.sh supports --keep-section (RHEL 9+)
> > > > +if find-debuginfo.sh --help 2>&1 | grep -q keep-section; then
> > > > +     echo "%global with_keep_section 1"
> > > > +fi
> > >
> > > [Severity: Medium]
> > > Is it safe to assume find-debuginfo.sh is in the standard user $PATH?
> > >
> > > On many systems, this script resides in /usr/lib/rpm/, which isn't typically
> > > in the $PATH. This could cause the check to silently fail and strip the .BTF
> > > section during a local make rpm-pkg build.
> > >
> > > Also, since mkspec runs during SRPM generation (make srcrpm-pkg), doesn't
> > > this statically bake the generation host's capabilities into the resulting
> > > kernel.spec file?
> > >
> > > If the SRPM is rebuilt on an older distribution, rpmbuild might fail because
> > > the older script rejects the --keep-section argument. If generated on an
> > > older host and built on a newer one, BTF info would be silently stripped.
> > > Could we dynamically query the target host's capabilities using something
> > > like %(__find_debuginfo) inside the spec file itself?
> > >
> > > --
> > > Sashiko AI review · https://sashiko.dev/#/patchset/20260716025342.42628-1-laoar.shao@gmail.com?part=1
> >
> > I believe we could use the builtin _rpmconfigdir to locate
> > find-debuginfo.sh reliably. This avoids relying on $PATH.
> > What do you think about the following change?
>
> Just an FYI, this was not sent to anyone with authority to comment on
> said change, as the Kbuild folks were not included in the AI review
> thread. I just happened to find this when browsing the archives.

My apologies, I failed to notice that the linux-kbuild mailing list
was excluded from Sashiko's reply.

>
> > diff --git a/scripts/package/kernel.spec b/scripts/package/kernel.spec
> > index c732415662ef..4335e99f2aca 100644
> > --- a/scripts/package/kernel.spec
> > +++ b/scripts/package/kernel.spec
> > @@ -67,7 +67,21 @@ This package provides debug information for the
> > kernel image and modules from th
> >  %undefine _unique_debug_srcs
> >  %undefine _debugsource_packages
> >  %undefine _debuginfo_subpackages
> > +
> > +# Preserve .BTF section in kernel modules during debuginfo stripping
> > +# find-debuginfo.sh (from debugedit) uses eu-strip which removes
> > +# non-allocated ELF sections like .BTF by default.
> > +# --keep-section .BTF preserves BPF Type Format information.
> > +#
> > +# Uses _rpmconfigdir for reliable script location instead of relying on $PATH.
> > +%{!?with_keep_section:%global __fd %{_rpmconfigdir}/find-debuginfo.sh}
> > +%{!?with_keep_section:%global with_keep_section %(%{__fd} --help 2>&1
> > | grep -c keep-section)}
> > +%if %{with_keep_section}
> > +%global _find_debuginfo_opts -r --keep-section .BTF
> > +%else
> >  %global _find_debuginfo_opts -r
> > +%endif
> > +
> >  %global _missing_build_ids_terminate_build 1
> >  %global _no_recompute_build_ids 1
> >  %{debug_package}
> >
> > Please let me know if this approach works or if there are any concerns.
>
> /usr/lib/rpm/find-debuginfo.sh might not exist on certain distributions
> that can build .rpm packages like Arch Linux:
>
>   $ ls -l /usr/lib/rpm/find-debuginfo.sh
>   "/usr/lib/rpm/find-debuginfo.sh": No such file or directory (os error 2)
>
> Even on modern Fedora, this is a symlink:
>
>   $ ls -l /usr/lib/rpm/find-debuginfo.sh
>   lrwxrwxrwx@ - root 19 Jul 17:00 /usr/lib/rpm/find-debuginfo.sh -> ../../bin/find-debuginfo
>
> I think we would be better off just using the __find_debuginfo rpm
> macro:
>
>   $ rg -m 1 find-debuginfo /usr/lib/rpm/macros
>   69:%__find_debuginfo    /usr/bin/find-debuginfo
>
> This appears to work for me, it would be good if you can confirm this
> works for you as well.
>
> diff --git a/scripts/package/kernel.spec b/scripts/package/kernel.spec
> index c732415662ef..590b5b2e1b40 100644
> --- a/scripts/package/kernel.spec
> +++ b/scripts/package/kernel.spec
> @@ -67,7 +67,18 @@ This package provides debug information for the kernel image and modules from th
>  %undefine _unique_debug_srcs
>  %undefine _debugsource_packages
>  %undefine _debuginfo_subpackages
> +
> +# Preserve .BTF section in kernel modules during debuginfo stripping
> +# find-debuginfo.sh (from debugedit) uses eu-strip which removes
> +# non-allocated ELF sections like .BTF by default.
> +%global with_keep_section %(%{__find_debuginfo} --help 2>&1 | grep -c keep-section)
> +%if %{with_keep_section}
> +%global _find_debuginfo_opts -r --keep-section .BTF
> +%else
>  %global _find_debuginfo_opts -r
> +%endif
> +
>  %global _missing_build_ids_terminate_build 1
>  %global _no_recompute_build_ids 1
>  %{debug_package}

This works for me, thanks for the improvement.
Do you plan to send the official patch, or would you like me to send a
new version?

-- 
Regards
Yafang

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-07-24  2:50 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-16  2:53 [PATCH v2] kbuild: rpm-pkg: Preserve .BTF section in kernel modules during debuginfo stripping Yafang Shao
     [not found] ` <20260716030116.C613E1F000E9@smtp.kernel.org>
     [not found]   ` <CALOAHbBQhAsTMHMMZH5Sen0cDYg8GREZMmQcT4Njc9VW_WHe4Q@mail.gmail.com>
2026-07-24  0:00     ` Nathan Chancellor
2026-07-24  2:49       ` Yafang Shao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox