Re: [PATCH v4] scripts/link-vmlinux.sh: Add alias to duplicate symbols for kallsyms
flat view
From: Alessandro Carminati <hidden>
Date: 2023-09-20 07:40:39
Also in:
linux-kbuild, lkml
Hello Masami, Thank you for the feedback. Il giorno mer 20 set 2023 alle ore 01:52 Masami Hiramatsu [off-list ref] ha scritto:
On Tue, 19 Sep 2023 19:39:48 +0000 "Alessandro Carminati (Red Hat)" [off-list ref] wrote:quoted
It is not uncommon for drivers or modules related to similar peripherals to have symbols with the exact same name. While this is not a problem for the kernel's binary itself, it becomes an issue when attempting to trace or probe specific functions using infrastructure like ftrace or kprobe. The tracing subsystem relies on the `nm -n vmlinux` output, which provides symbol information from the kernel's ELF binary. However, when multiple symbols share the same name, the standard nm output does not differentiate between them. This can lead to confusion and difficulty when trying to probe the intended symbol. ~ # cat /proc/kallsyms | grep " name_show" ffffffff8c4f76d0 t name_show ffffffff8c9cccb0 t name_show ffffffff8cb0ac20 t name_show ffffffff8cc728c0 t name_show ffffffff8ce0efd0 t name_show ffffffff8ce126c0 t name_show ffffffff8ce1dd20 t name_show ffffffff8ce24e70 t name_show ffffffff8d1104c0 t name_show ffffffff8d1fe480 t name_show kas_alias addresses this challenge by enhancing symbol names with meaningful suffixes generated from the source file and line number during the kernel build process. These newly generated aliases provide tracers with the ability to comprehend the symbols they are interacting with when utilizing the ftracefs interface. This approach may also allow for the probing by name of previously inaccessible symbols. ~ # cat /proc/kallsyms | grep gic_mask_irq ffffd15671e505ac t gic_mask_irq ffffd15671e505ac t gic_mask_irq@drivers_irqchip_irq_gic_c_167 ffffd15671e532a4 t gic_mask_irq ffffd15671e532a4 t gic_mask_irq@drivers_irqchip_irq_gic_v3_c_407 ~ # Changes from v1: - Integrated changes requested by Masami to exclude symbols with prefixes "_cfi" and "_pfx". - Introduced a small framework to handle patterns that need to be excluded from the alias production. - Excluded other symbols using the framework. - Introduced the ability to discriminate between text and data symbols. - Added two new config symbols in this version: CONFIG_KALLSYMS_ALIAS_DATA, which allows data for data, and CONFIG_KALLSYMS_ALIAS_DATA_ALL, which excludes all filters and provides an alias for each duplicated symbol. https://lore.kernel.org/all/20230711151925.1092080-1-alessandro.carminati@gmail.com/ (local) Changes from v2: - Alias tags are created by querying DWARF information from the vmlinux. - The filename + line number is normalized and appended to the original name. - The tag begins with '@' to indicate the symbol source. - Not a change, but worth mentioning, since the alias is added to the existing list, the old duplicated name is preserved, and the livepatch way of dealing with duplicates is maintained. - Acknowledging the existence of scenarios where inlined functions declared in header files may result in multiple copies due to compiler behavior, though it is not actionable as it does not pose an operational issue. - Highlighting a single exception where the same name refers to different functions: the case of "compat_binfmt_elf.c," which directly includes "binfmt_elf.c" producing identical function copies in two separate modules. https://lore.kernel.org/all/20230714150326.1152359-1-alessandro.carminati@gmail.com/ (local) Changes from v3: - kas_alias was rewritten in Python to create a more concise and maintainable codebase. - The previous automation process used by kas_alias to locate the vmlinux and the addr2line has been replaced with an explicit command-line switch for specifying these requirements. - addr2line has been added into the main Makefile. - A new command-line switch has been introduced, enabling users to extend the alias to global data names. https://lore.kernel.org/all/20230828080423.3539686-1-alessandro.carminati@gmail.com/ (local) NOTE: About the symbols name duplication that happens as consequence of the inclusion compat_binfmt_elf.c does, it is evident that this corner is inherently challenging the addr2line approach. Attempting to conceal this limitation would be counterproductive. compat_binfmt_elf.c includes directly binfmt_elf.c, addr2line can't help but report all functions and data declared by that file, coming from binfmt_elf.c. My position is that, rather than producing a more complicated pipeline to handle this corner case, it is better to fix the compat_binfmt_elf.c anomaly. This patch does not deal with the two potentially problematic symbols defined by compat_binfmt_elf.cHi, it looks good but if I build with O=<build dir>, I have this error. /ksrc/linux/scripts/link-vmlinux.sh: 176: scripts/kas_alias.py: not found Maybe something wrong with setting the path?
You're spot on. Switching from C to Python for kas_alias has this little quirk where it doesn't end up in the target script directory anymore. So, if you're using a specific target build directory, you'll have to hunt down the script in the source tree. I'll sort this out once I've collected all the feedback. Regards Alessandro