LinuxカーネルコードのEXPORT_SYMBOL_GPLとは何ですか?
以下は、EXPORT_SYMBOL_GPLを含むコードの一部です。
62 struct resource *platform_get_resource(struct platform_device *dev,
63 unsigned int type, unsigned int num)
64 {
65 int i;
66
67 for (i = 0; i < dev->num_resources; i++) {
68 struct resource *r = &dev->resource[i];
69
70 if (type == resource_type(r) && num-- == 0)
71 return r;
72 }
73 return NULL;
74 }
75 EXPORT_SYMBOL_GPL(platform_get_resource);
そのマクロはカーネルコードに何度も現れます...
一部のシンボル(関数など)をエクスポート可能(カーネルのロード可能なモジュールから見たもの)として定義するのはマクロです。シンボルに「EXPORT_SYMBOL」がない場合、モジュールからアクセスできません。
EXPORT_SYMBOL_GPL
は、GPLライセンスのモジュールでのみシンボルを表示します。EXPORT_SYMBOL
-任意のライセンスを持つモジュール内。
http://lwn.net/Articles/154602/ -EXPORT_SYMBOL_GPL(2005、corbet)の値について
ロード可能なモジュールを挿入する場合、カーネル関数およびデータ構造への参照は、現在実行中のカーネルにリンクする必要があります。ただし、モジュールローダーはすべてのカーネルシンボルへのアクセスを提供するわけではありません。明示的にエクスポートされたもののみが使用可能です。
エクスポートには、バニラ(EXPORT_SYMBOL)とGPLのみ(EXPORT_SYMBOL_GPL)の2つのフレーバーがあります。前者はすべてのカーネルモジュールで使用できますが、後者はGPL互換ライセンスを持たないモジュールでは使用できません。