最新のメインラインソースから構築されたカーネルを使用してツリー外部ドライバを構築したいと思います。ビルド時に使用していると理解すると、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_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
ビルドツリーの外側のモジュールをサポートするには、まずこれらのモジュールに必要なシンボルを識別し、それらを使用できるようにビルドするカーネルで必要な機能を有効にする必要があります。後でシンボルクリーンアップを有効にすることにした場合は、ホワイトリストに必要なシンボルを追加できますが、最初の部分を正しく設定しないと後者は役に立ちません。
一般的な展開カーネルはすべてではありませんが、ほとんどのサブシステムをサポートしているため、必要な機能に関する事前の知識がなくても、ツリーの外部モジュールをその上に構築できます。