Что такое символ экспорта GPL в коде ядра Linux?


Что такое EXPORT_SYMBOL_GPL в коде ядра Linux?

Ниже приведен фрагмент кода, который содержит 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);

Этот макрос появляется много раз в коде ядра...

1 12

1 ответ:

Это макрос для определения некоторого символа (например, функции) как экспортируемого (видно из загружаемых модулей ядра). Если символ не имеет "EXPORT_SYMBOL", он будет недоступен из модулей.

EXPORT_SYMBOL_GPL будет показывать символ только в GPL-лицензионных модулях, а EXPORT_SYMBOL - в модулях с любой лицензией.

Http://lwn.net/Articles/154602/ - О значении EXPORT_SYMBOL_GPL (2005, corbet)

Когда загружаемый модуль вставляется, любые ссылки, которые он делает на функции ядра и структуры данных должны быть связаны с текущим работающим ядром. Однако загрузчик модулей не предоставляет доступ ко всем символам ядра; доступны только те, которые были явно экспортированы.

Экспорт бывает двух видов: ванильный (EXPORT_SYMBOL) и GPL-only (EXPORT_SYMBOL_GPL). Первые доступны любому модулю ядра, а вторые не могут использоваться никакими модулями, не имеющими лицензии, совместимой с GPL.