Re: [PATCH 00/15] Implement MODVERSIONS for Rust
From: Masahiro Yamada <masahiroy@kernel.org>
Date: 2024-06-18 16:28:59
Also in:
linux-kbuild, lkml, rust-for-linux
On Tue, Jun 18, 2024 at 2:58 AM Sami Tolvanen [off-list ref] wrote:
Hi folks, This series implements CONFIG_MODVERSIONS for Rust, an important feature for distributions like Android that want to ship Rust kernel modules, and depend on modversions to help ensure module ABI compatibility. There have been earlier proposals [1][2] that would allow Rust modules to coexist with modversions, but none that actually implement symbol versioning. 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 [3], 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 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 12 patches of this series add a small tool for computing symbol versions from DWARF, called gendwarfksyms. When passed a list of exported symbols, 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). Another compatibility issue is fitting the extremely long mangled Rust symbol names into struct modversion_info, which can only hold 55-character names (on 64-bit systems). Previous proposals suggested changing the structure to support longer names, but the conclusion was that we cannot break userspace tools that parse the version table. The next two patches of the series implement support for hashed symbol names in struct modversion_info, where names longer than 55 characters are hashed, and the hash is stored in the name field. To avoid breaking userspace tools, the binary hash is prefixed with a null-terminated string containing the name of the hash function. While userspace tools can later be updated to potentially produce more useful information about the long symbols, this allows them to continue working in the meantime. The final patch allows CONFIG_MODVERSIONS to be selected with Rust, provided that debugging information is also available.
I am surprised at someone who attempts to add another variant of genksyms. I am also surprised at the tool being added under the tools/ directory. At least, we can avoid the latter misfortune, though. A patch attached (on top of your patch set). Such a tool can be compiled in scripts/, or even better in rust/Makefile if it is only used in rust/Makefile. -- Best Regards Masahiro Yamada
Attachments
- 0001-kbuild-move-tools-gendwarfksyms-to-scripts-gendwarfk.patch [application/x-patch] 9299 bytes · preview