CONFIG_TRIM_UNUSED_KSYMSとホワイトリストファイルの正しい使い方は何ですか?

CONFIG_TRIM_UNUSED_KSYMSとホワイトリストファイルの正しい使い方は何ですか?

最新のメインラインソースから構築されたカーネルを使用してツリー外部ドライバを構築したいと思います。ビルド時に使用していると理解すると、localmodconfigシステムで使用可能なデバイスと一致するようにエクスポートされたモジュールとカーネルシンボルの数が減ります。 Out-of-treeドライバにはカーネルの他のコンポーネントで使用されていないシンボルが必要なので、次のように手動でエクスポートするシンボルを指定する必要があります。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_KSYMSKconfig説明次のように:

カーネルと一部のモジュールは、他のモジュールやバリアントで使用できる多くのシンボルを作成しますEXPORT_SYMBOL()。カーネル構成で選択したモジュールセットによっては、エクスポートされた多くのシンボルが使用されないことがあります。

このオプションを使用すると、ビルドから未使用のエクスポートされたシンボルを削除できます。これは最終的にコンパイラにコードを最適化し、バイナリサイズを減らす機会(特にLTOを使用する場合)を提供します。これにはいくつかのセキュリティ上の利点もあります。

不明な場合やツリーの外側にモジュールを構築する必要がある場合は、Nを選択してください。

TRIM_UNUSED_KSYMS最後の文章に特別な注意を払ってください。あなたのシナリオでは、有効な理由がない限り無効にする必要があります(そして結果を処理する必要があります)。

シンボルを削除する前にカーネルで使用できる完全なシンボルセットは、ビルド構成によって異なります。特定の機能を除く構成のカーネルには対応するシンボルはありません。あなたの場合は.config含まれませんVIDEO_V4L2。つまり、ビルドするカーネルには必要な項目と必要な項目がまったくないかvideo_ioctl2含まれません。これらのシンボルをホワイトリストに追加しても役に立ちません。最初にシンボルがないと、削除せずにシンボルを追加することはできません。VIDEOBUF_V4L2vb2_init_queueVIDEOBUF2_DMA_SGvb2_dma_sg_memopsTRIM_UNUSED_KSYMS

ビルドツリーの外側のモジュールをサポートするには、まずこれらのモジュールに必要なシンボルを識別し、それらを使用できるようにビルドするカーネルで必要な機能を有効にする必要があります。後でシンボルクリーンアップを有効にすることにした場合は、ホワイトリストに必要なシンボルを追加できますが、最初の部分を正しく設定しないと後者は役に立ちません。

一般的な展開カーネルはすべてではありませんが、ほとんどのサブシステムをサポートしているため、必要な機能に関する事前の知識がなくても、ツリーの外部モジュールをその上に構築できます。

関連情報