Hi, Here's v2 of the DWARF modversions series [1]. The main motivation remains modversions support for Rust, which is important for distributions like Android that are eager to ship Rust kernel modules. However, per Luis' request [2], v2 drops all Rust specific bits from the series and instead adds the feature as an option for the entire kernel. Matt is addressing Rust modversion_info compatibility issues in a separate series [3], and we'll follow up with a patch to actually allow CONFIG_MODVERSIONS with Rust once these have been sorted out. A short background recap: Unlike C, Rust source code doesn't have sufficient information about the final ABI, as the compiler has considerable freedom in adjusting structure layout for improved performance [4], for example, which makes using a source code parser like genksyms a non-starter. Based on Matt's suggestion and previous feedback from maintainers, this series uses DWARF debugging information for computing versions. DWARF is an established and a relatively stable format, which includes all the necessary ABI details, and adding a CONFIG_DEBUG_INFO dependency for Rust symbol versioning seems like a reasonable trade-off. The first 16 patches of this series add a small tool for computing symbol versions from DWARF, called gendwarfksyms. When passed a list of exported symbols and an object file, the tool generates an expanded type string for each symbol, and computes symbol CRCs similarly to genksyms. gendwarfksyms is written in C and uses libdw to process DWARF, mainly because of the existing support for C host tools that use elfutils (e.g., objtool). The next two patches ensure that debugging information is present where we need it and fix a compilation issue with x86 asm-prototypes.h. The last patch adds gendwarfksyms as an alternative to genksyms. A quick note about performance: On my development system, building x86_64 defconfig with MODVERSIONS takes about 59.4s with gcc 13 (avg. of ten runs). Adding DEBUG_INFO_DWARF5 increases the build time by ~23% to 73.3s. Switching from GENKSYMS to GENDWARFKSYMS reduces the build time by 6% to 68.9s, which is still ~16% slower than genksyms without debugging information. Therefore, if you already build kernels with debugging information, gendwarfksyms should be slightly faster. YMMV, of course. Things would change with LTO, because we won't have full DWARF until we have an ELF binary, which means we'd have to process vmlinux.o. This version of gendwarfksyms is still single-threaded as it seems we can't rely on libdw to be thread-safe. Processing a ThinLTO x86_64 defconfig vmlinux.o on my system takes ~2m16s, and would have to happen even on incremental builds, just like LTO linking itself. As cross-language LTO presumably isn't wildly popular yet, gendwarfksyms intentionally depends in !LTO in this version. Looking forward to hearing your thoughts! Sami [1] https://lore.kernel.org/lkml/20240617175818.58219-17-samitolvanen@xxxxxxxxxx/ [2] https://lore.kernel.org/lkml/ZnIZEtkkQWEIGf9n@xxxxxxxxxxxxxxxxxxxxxx/ [3] https://lore.kernel.org/lkml/20240806212106.617164-1-mmaurer@xxxxxxxxxx/ [4] https://lore.kernel.org/rust-for-linux/CAGSQo005hRiUZdeppCifDqG9zFDJRwahpBLE4x7-MyfJscn7tQ@xxxxxxxxxxxxxx/ --- Changes in v2: - Per Luis' request, dropped Rust-specific patches and added gendwarfksyms as an alternative to genksyms for the entire kernel. - Added support for missing DWARF features needed to handle also non-Rust code. - Changed symbol address matching to use the symbol table information instead of relying on addresses in DWARF. - Added __gendwarfksyms_ptr patches to ensure the compiler emits the necessary type information in DWARF even for symbols that are defined in other TUs. - Refactored debugging output and moved the more verbose output behind --dump* flags. - Added a --symtypes flag for generating a genksyms-style symtypes output based on Petr's feedback, and refactored symbol version calculations to be based on symtypes instead of raw --dump-dies output. - Based on feedback from Greg and Petr, added --stable flag and support for reserved data structure fields and declaration-onl structures. Also added examples for using these features. - Added a GENDWARFKSYMS option and hooked up kbuild support for both C and assembly code. Note that with gendwarfksyms, we have to actually build a temporary .o file for calculating assembly modversions. --- Sami Tolvanen (19): tools: Add gendwarfksyms gendwarfksyms: Add symbol list handling gendwarfksyms: Add address matching gendwarfksyms: Add support for type pointers gendwarfksyms: Expand base_type gendwarfksyms: Add a cache for processed DIEs gendwarfksyms: Expand type modifiers and typedefs gendwarfksyms: Expand subroutine_type gendwarfksyms: Expand array_type gendwarfksyms: Expand structure types gendwarfksyms: Limit structure expansion gendwarfksyms: Add die_map debugging gendwarfksyms: Add symtypes output gendwarfksyms: Add symbol versioning gendwarfksyms: Add support for declaration-only data structures gendwarfksyms: Add support for reserved structure fields export: Add __gendwarfksyms_ptr_ references to exported symbols x86/asm-prototypes: Include <asm/ptrace.h> kbuild: Add gendwarfksyms as an alternative to genksyms arch/x86/include/asm/asm-prototypes.h | 1 + include/linux/export.h | 15 + kernel/module/Kconfig | 31 + scripts/Makefile | 3 +- scripts/Makefile.build | 34 +- scripts/gendwarfksyms/.gitignore | 2 + scripts/gendwarfksyms/Makefile | 12 + scripts/gendwarfksyms/cache.c | 51 ++ scripts/gendwarfksyms/crc32.c | 69 ++ scripts/gendwarfksyms/crc32.h | 34 + scripts/gendwarfksyms/die.c | 196 +++++ scripts/gendwarfksyms/dwarf.c | 973 ++++++++++++++++++++++ scripts/gendwarfksyms/examples/declonly.c | 31 + scripts/gendwarfksyms/examples/reserved.c | 66 ++ scripts/gendwarfksyms/gendwarfksyms.c | 201 +++++ scripts/gendwarfksyms/gendwarfksyms.h | 275 ++++++ scripts/gendwarfksyms/symbols.c | 392 +++++++++ scripts/gendwarfksyms/types.c | 557 +++++++++++++ 18 files changed, 2936 insertions(+), 7 deletions(-) create mode 100644 scripts/gendwarfksyms/.gitignore create mode 100644 scripts/gendwarfksyms/Makefile create mode 100644 scripts/gendwarfksyms/cache.c create mode 100644 scripts/gendwarfksyms/crc32.c create mode 100644 scripts/gendwarfksyms/crc32.h create mode 100644 scripts/gendwarfksyms/die.c create mode 100644 scripts/gendwarfksyms/dwarf.c create mode 100644 scripts/gendwarfksyms/examples/declonly.c create mode 100644 scripts/gendwarfksyms/examples/reserved.c create mode 100644 scripts/gendwarfksyms/gendwarfksyms.c create mode 100644 scripts/gendwarfksyms/gendwarfksyms.h create mode 100644 scripts/gendwarfksyms/symbols.c create mode 100644 scripts/gendwarfksyms/types.c base-commit: 7c626ce4bae1ac14f60076d00eafe71af30450ba -- 2.46.0.184.g6999bdac58-goog