Linux-Kernel

CONFIG_TRIM_UNUSED_KSYMS 和白名單文件的正確用法是什麼?

  • August 16, 2021

我想使用從最新的主線原始碼建構的核心建構一個樹外驅動程序。根據我的理解,我在建構時使用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

我懷疑對做什麼有一些誤解TRIM_UNUSED_KSYMSKconfig描述如下:

核心和一些模組使許多符號可供其他模組使用 viaEXPORT_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的白名單將無濟於事:不能通過不刪除它來添加一開始不存在的符號。

為了支持建構樹外模組,您需要首先確定這些模組需要的符號,並在您建構的核心中啟用必要的功能,以便這些符號可用。如果您隨後決定仍要啟用符號修剪,則可以這樣做,將必要的符號添加到白名單;但後者是無用的,除非你把第一部分弄對了。

通用分發核心支持大多數(如果不是全部)子系統,它允許在它們之上建構樹外模組,而無需預先知道它們需要的功能。

引用自:https://unix.stackexchange.com/questions/664688