ローダブル・カーネル・モジュール
hを見てほしい。
カーネルシンボルのエクスポート
概要で述べた通り、通常カーネル内にある関数名、構造体名などのシンボルはカーネルの外からは直接見えない。LKMのロードにはシンボル解決が必要であるが、シンボル解決するためにはinsmod等のモジュールローダを起動し、様々なチェックに通る必要がある。この時前述の通り、MODULE_LICENSEマクロにある文字列がチェックされる。シンボル名は通常、EXPORT_SYMBOLまたは、GPLにライセンスされたモジュールのみが参照可能なEXPORT_SYMBOL_GPLマクロに記述する。このマクロに記述されたシンボル名はモジュールローディング時にモジュールから参照できるようになるが、あらゆるライセンス用に提供されるEXPORT_SYMBOLとは異なり、EXPORT_SYMBOL_GPLマクロはプロプライエタリなモジュールからは一切参照できない。すなわちプロプライエタリなモジュールを作成する場合はEXPORT_SYMBOL_GPLマクロでエクスポートされている関数を利用できないことになる。プロプライエタリなモジュールを作成する企業にとっては、これは前述の汚染フラグとは比べものにならないほど厳しい制限に思える。しかし、Linuxカーネル開発者にとってはカーネル内の重要な処理に関する決定のイニシアティブを一貫してLinuxカーネルコミュニティが持つことができるという大きな利点がある。プロプライエタリなドライバはソースコードがない、もしくは自由な改変を許可していないものが多く、状況によりカーネルのAPIをはじめとして最新のカーネル開発状況に追随できていないものが存在する。
アットマーク・アイティ、ITmedia. 2011年1月27日閲覧。 sysfsは各種システムパラメータの塊といえるが、誤ったAPIで操作すれば当然クラッシュする。
↑ “GitHub, torvalds / linux, linux/include/linux/license.h”. 2023年10月31日閲覧。 インライン関数 license_is_gpl_compatible()が当該。
↑ “GitHub, torvalds / linux, linux/lib/string.c”. 2023年10月31日閲覧。 カーネル向けの実装だが、意味はユーザランド向けに同じ。
↑ Jeremy Andrews (2004年4月27日). “Linux: Abusing the MODULE_LICENSE Macro (MODULE_LICENSEマクロの乱用)”. KernelTrap(英語版). 2013年5月3日時点のオリジナルよりアーカイブ。2011年1月27日閲覧。
↑ Jonathan Corbet (2004年4月27日). “Being honest with MODULE_LICENSE”. LWN.net(英語版). 2011年12月14日閲覧。
↑ Michael Reiter. “Exploiting Loadable Kernel Modules”. 2011年12月14日閲覧。