Add CONFIG_DEBUG_INFO_BTF_INLINE to generate BTF inline-location
information with pahole v1.31 and later.

Enable pahole's inline feature and pass --inline to resolve_btfids.
This extracts LOC_PARAM, LOC_PROTO, and LOCSEC types into a split BTF
blob named <output>.BTF.inline while the ordinary BTF remains in .BTF.

Embed the resulting blob in a .BTF.inline ELF section for vmlinux and
modules.  Add the vmlinux linker-script output section to avoid it
being treated as an orphan.

Use the inline pahole feature unconditionally for both in-tree and
external modules; the generated split BTF has the same format in both
cases.

Signed-off-by: Alan Maguire <[email protected]>
---
 include/asm-generic/vmlinux.lds.h | 11 +++++++++++
 lib/Kconfig.debug                 | 17 +++++++++++++++++
 scripts/Makefile.btf              |  7 +++++++
 scripts/gen-btf.sh                | 17 +++++++++++++++--
 4 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/include/asm-generic/vmlinux.lds.h 
b/include/asm-generic/vmlinux.lds.h
index b2988aa12f66..a2e192854c47 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -675,12 +675,23 @@
 /*
  * .BTF
  */
+#ifdef CONFIG_DEBUG_INFO_BTF_INLINE
+#define BTF_INLINE                                                     \
+       . = ALIGN(PAGE_SIZE);                                           \
+       .BTF.inline : AT(ADDR(.BTF.inline) - LOAD_OFFSET) {             \
+               BOUNDED_SECTION_BY(.BTF.inline, _BTF_inline)            \
+       }
+#else
+#define BTF_INLINE
+#endif
+
 #ifdef CONFIG_DEBUG_INFO_BTF
 #define BTF                                                            \
        . = ALIGN(PAGE_SIZE);                                           \
        .BTF : AT(ADDR(.BTF) - LOAD_OFFSET) {                           \
                BOUNDED_SECTION_BY(.BTF, _BTF)                          \
        }                                                               \
+       BTF_INLINE                                                      \
        . = ALIGN(PAGE_SIZE);                                           \
        .BTF_ids : AT(ADDR(.BTF_ids) - LOAD_OFFSET) {                   \
                *(.BTF_ids)                                             \
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index 1244dcac2294..dd1b2d9ebe99 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -425,6 +425,12 @@ config PAHOLE_HAS_LANG_EXCLUDE
          otherwise it would emit malformed kernel and module binaries when
          using DEBUG_INFO_BTF_MODULES.
 
+config PAHOLE_HAS_INLINE
+       def_bool PAHOLE_VERSION >= 131
+       help
+         Support for the "inline" BTF feature is available. It encodes
+         information about inline sites and how to retrieve their parameters.
+
 config DEBUG_INFO_BTF_MODULES
        bool "Generate BTF type information for kernel modules"
        default y
@@ -432,6 +438,17 @@ config DEBUG_INFO_BTF_MODULES
        help
          Generate compact split BTF type information for kernel modules.
 
+config DEBUG_INFO_BTF_INLINE
+       bool "Provide information about inline sites in BTF"
+       default n
+       depends on DEBUG_INFO_BTF && PAHOLE_HAS_INLINE && SYSFS
+       help
+         Generate information about inline sites in .BTF.inline sections.
+         These sections contain split BTF relative to the kernel or module BTF
+         and are made available in /sys/kernel/btf with a ".inline" suffix.
+         The information describes inline locations and how to retrieve their
+         associated parameters.
+
 config MODULE_ALLOW_BTF_MISMATCH
        bool "Allow loading modules with non-matching BTF type info"
        depends on DEBUG_INFO_BTF_MODULES
diff --git a/scripts/Makefile.btf b/scripts/Makefile.btf
index a1812985a61a..d42dbc8d7199 100644
--- a/scripts/Makefile.btf
+++ b/scripts/Makefile.btf
@@ -22,7 +22,14 @@ endif
 
 pahole-flags-$(CONFIG_PAHOLE_HAS_LANG_EXCLUDE)         += --lang_exclude=rust
 
+btf-inline := $(CONFIG_DEBUG_INFO_BTF_INLINE)
+ifneq ($(btf-inline),)
+btf-inline-feat := inline
+pahole-flags-$(call test-ge, $(pahole-ver), 131) += 
--btf_features=$(btf-inline-feat)
+endif
+
 export PAHOLE_FLAGS := $(pahole-flags-y)
+export BTF_INLINE := $(btf-inline)
 
 resolve-btfids-flags-y :=
 resolve-btfids-flags-$(CONFIG_WERROR) += --fatal_warnings
diff --git a/scripts/gen-btf.sh b/scripts/gen-btf.sh
index 8ca96eb10a69..a75f41878c32 100755
--- a/scripts/gen-btf.sh
+++ b/scripts/gen-btf.sh
@@ -76,6 +76,7 @@ gen_btf_data()
 
        ${RESOLVE_BTFIDS} ${RESOLVE_BTFIDS_FLAGS}       \
                ${BTF_BASE:+--btf_base ${BTF_BASE}}     \
+               ${BTF_INLINE:+--inline}         \
                --btf ${btf1} "${ELF_FILE}"
 }
 
@@ -83,14 +84,21 @@ gen_btf_o()
 {
        btf_data=${ELF_FILE}.btf.o
 
-       # Create ${btf_data} which contains just .BTF section but no symbols. 
Add
+       # Create ${btf_data} which contains just BTF sections but no symbols. 
Add
        # SHF_ALLOC because .BTF will be part of the vmlinux image. --strip-all
        # deletes all symbols including __start_BTF and __stop_BTF, which will
        # be redefined in the linker script.
        echo "" | ${CC} ${CLANG_FLAGS} ${KBUILD_CPPFLAGS} ${KBUILD_CFLAGS} 
-fno-lto -c -x c -o ${btf_data} -
        ${OBJCOPY} --add-section .BTF=${ELF_FILE}.BTF \
                --set-section-flags .BTF=alloc,readonly ${btf_data}
-       ${OBJCOPY} --only-section=.BTF --strip-all ${btf_data}
+       ONLY_SEC="--only-section=.BTF"
+       btf_inline=${ELF_FILE}.BTF.inline
+       if [ -n "${BTF_INLINE}" ] && [ -f "${btf_inline}" ]; then
+               ${OBJCOPY} --add-section .BTF.inline=${btf_inline} \
+                       --set-section-flags .BTF.inline=alloc,readonly 
${btf_data}
+               ONLY_SEC="${ONLY_SEC} --only-section=.BTF.inline"
+       fi
+       ${OBJCOPY} ${ONLY_SEC} --strip-all ${btf_data}
 
        # Change e_type to ET_REL so that it can be used to link final vmlinux.
        # GNU ld 2.35+ and lld do not allow an ET_EXEC input.
@@ -111,6 +119,10 @@ embed_btf_data()
        if [ -f "${btf_base}" ]; then
                ${OBJCOPY} --add-section .BTF.base=${btf_base} ${ELF_FILE}
        fi
+       btf_inline=${ELF_FILE}.BTF.inline
+       if [ -n "${BTF_INLINE}" ] && [ -f "${btf_inline}" ]; then
+               ${OBJCOPY} --add-section .BTF.inline=${btf_inline} ${ELF_FILE}
+       fi
        btf_ids="${ELF_FILE}.BTF_ids"
        if [ -f "${btf_ids}" ]; then
                ${RESOLVE_BTFIDS} --patch_btfids ${btf_ids} ${ELF_FILE}
@@ -121,6 +133,7 @@ cleanup()
 {
        rm -f "${ELF_FILE}.BTF.1"
        rm -f "${ELF_FILE}.BTF"
+       rm -f "${ELF_FILE}.BTF.inline"
        if [ "${BTFGEN_MODE}" = "module" ]; then
                rm -f "${ELF_FILE}.BTF.base"
                rm -f "${ELF_FILE}.BTF_ids"
-- 
2.43.5


Reply via email to