Что такое EXPORT_SYMBOL_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

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

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

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

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

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