У меня есть модуль, который присутствует в 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'
Вы меняли много мест в дереве ядра для ссылки на mymodule() и перестраивали все ядро? Если да, то как насчет добавления объявления в linux/kernel.h? – michaeljt
@michaeljt Я изменил 'Makefile' и перестроил все ядро. – Ivid
1. Если символ ** не объявлен ** (например, с «extern'), тогда ошибка компилятора должна быть о «** необъявленном ** символе». 2. Сообщение об ошибке «** Неопределенный ** ссылка» означает, что символ * объявлен *, но ** не определен **, например. если файл 'kernel/trace/module.c' не компилируется вообще. Итак, в каком случае это ваш? Также обратите внимание, что ** ядро ядра ** не может использовать символ, определенный в ** загружаемом модуле **: вам нужно сделать исходные файлы * скомпилированными в ядро * ('obj-y + = module.o'). –
Tsyvarev