2017-01-21 2 views
1

У меня есть модуль, который присутствует в kernel/trace, скажем module.c, и я определил один символ там, который мне нужно сделать доступным для всех модулей ядра. Я использовал EXPORT_SYMBOL(mymodule) в этом модуле, чтобы экспортировать его во все модули. Но я не указал extern type mymodule() в других модулях, таких как /lib, /net и т. Д. Сейчас я получаю тысячи неопределенных ошибок ссылок, и я не могу вручную перейти и добавить extern ко всем модулям , Есть ли способ добавить один extern type mymodule(), чтобы он использовался всеми модулями. Я думаю, мы должны добавить его в Makefile, но как и где его добавить? Я использую ядро ​​linux 4.1.Добавление поддержки символа для всех модулей ядра

Сообщение об ошибке:

lib/lib.a(klist.o): In function `klist_del': 
lib/klist.c:230: undefined reference to `__cyg_profile_func_enter' 
lib/klist.c:232: undefined reference to `__cyg_profile_func_exit' 
lib/lib.a(klist.o): In function `klist_iter_exit': 
lib/klist.c:313: undefined reference to `__cyg_profile_func_enter' 
lib/klist.c:318: undefined reference to `__cyg_profile_func_exit' 
lib/lib.a(klist.o): In function `klist_remove': 
lib/klist.c:240: undefined reference to `__cyg_profile_func_enter' 
+1

Вы меняли много мест в дереве ядра для ссылки на mymodule() и перестраивали все ядро? Если да, то как насчет добавления объявления в linux/kernel.h? – michaeljt

+0

@michaeljt Я изменил 'Makefile' и перестроил все ядро. – Ivid

+1

1. Если символ ** не объявлен ** (например, с «extern '), тогда ошибка компилятора должна быть о «** необъявленном ** символе». 2. Сообщение об ошибке «** Неопределенный ** ссылка» означает, что символ * объявлен *, но ** не определен **, например. если файл 'kernel/trace/module.c' не компилируется вообще. Итак, в каком случае это ваш? Также обратите внимание, что ** ядро ​​ядра ** не может использовать символ, определенный в ** загружаемом модуле **: вам нужно сделать исходные файлы * скомпилированными в ядро ​​* ('obj-y + = module.o'). – Tsyvarev

ответ

0

Я не думаю, что внешний вид явно нужно определить. Вам нужно только ниже реализации (предполагается, что вы уже внести изменения в Makefile и Kconfig):

module.c

return_type module_function(function_args){ 
} 
EXPORT_SYMBOL(module_function); 

module.h

return_type module_function(function_args); 

Добавить файл заголовка, например module.h в module.c и файл, из которого вы хотите получить доступ к модулю_функции.

Еще одна вещь, которую вы также можете попробовать с EXPORT_SYMBOL_GPL вместо EXPORT_SYMBOL.

+0

Что вы имеете в виду, внося изменения в Kconfig? – Ivid

+0

Если вы добавляете новый модуль; то вам нужно внести изменения в Kconfig. В противном случае изменения Kconfig не требуются. –

Смежные вопросы