CONFIG_TRIM_UNUSED_KSYMS和白名单文件的正确用法是什么?

CONFIG_TRIM_UNUSED_KSYMS和白名单文件的正确用法是什么?

我想使用从最新主线源代码构建的内核构建一个树外驱动程序。根据我的理解,我在构建时使用localmodconfig,这减少了导出以匹配系统上可用设备的模块和内核符号的数量。树外驱动程序需要内核其他组件未使用的符号,因此我认为我需要根据以下内容指定要手动导出的符号关于 TRIM_UNUSED_KSYMS 和白名单的对话。

我的 .config 看起来像这样:

...
CONFIG_TRIM_UNUSED_KSYMS=y
CONFIG_UNUSED_KSYMS_WHITELIST="ksyms-whitelist"
...

ksyms-whitelist在内核源目录的根目录中创建了文件:

vb2_queue_init
vb2_dma_sg_memops
video_ioctl2
...

使用通用内核时可以毫无问题地构建驱动程序(并且设备可以工作),但是我们需要做什么才能使用从源代码构建的内核中的符号来构建树外驱动程序?

编辑:我的整个.config

答案1

我怀疑人们对它的作用有一些误解TRIM_UNUSED_KSYMS它的Kconfig描述如下:

内核和一些模块使许多符号可供其他模块通过和变体使用EXPORT_SYMBOL()。根据内核配置中选择的模块集,许多导出的符号可能永远不会被使用。

此选项允许从构建中删除未使用的导出符号。反过来,这为编译器提供了更多机会(尤其是在使用 LTO 时)来优化代码和减小二进制大小。这也可能具有一些安全优势。

如果不确定,或者如果您需要构建树外模块,请选择 N。

特别注意最后一句:在您的场景中,您应该禁用TRIM_UNUSED_KSYMS,除非您有充分的理由启用它(并处理后果)。

在进行任何符号修剪之前,内核中可用符号的总体集合取决于构建配置:其配置排除给定功能的内核将永远不会具有相应的符号。在你的情况下,你.config不包含VIDEO_V4L2,这意味着你构建的内核永远不会有video_ioctl2,也不包含VIDEOBUF_V4L2你需要的vb2_init_queue,以及VIDEOBUF2_DMA_SG你需要的vb2_dma_sg_memops。将这些符号添加到TRIM_UNUSED_KSYMS的白名单中不会有帮助:如果不删除开头不存在的符号,则无法通过不删除它来添加它。

为了支持构建树外模块,您需要首先确定这些模块所需的符号,并在您构建的内核中启用必要的功能,以便这些符号可用。如果您随后决定仍要启用符号修剪,则可以将必要的符号添加到白名单中;但除非你把第一部分弄对,否则后者就没用。

通用分发内核支持大多数(如果不是全部)子系统,这允许在其之上构建树外模块,而无需预先了解它们所需的功能。

相关内容