Ответ 1
Используйте KBUILD_EXTRA_SYMBOLS, как показано ниже: KBUILD_EXTRA_SYMBOLS = 'ваш путь к модулю'/Module.symvers
При компиляции модулей ядра Linux, которые зависят друг от друга, компоновщик предоставляет undefined предупреждения о символах типа
Building modules, stage 2.
MODPOST
*** Warning: "function_name1" [module_name] undefined!
*** Warning: "function_name2" [module_name] undefined!
*** Warning: "function_name3" [module_name] undefined!
Неразрешенные символы разрешаются, как только модуль вставляется в ядро с помощью insmod или modprobe. Есть ли способ избавиться от предупреждения компоновщика?
Я прочитал 3 запроса Google SERP по этой проблеме - кажется, никто не знает ответа. Предполагается ли, что эти предупреждения компоновщика должны быть такими, когда вы создаете модуль ядра?
Используйте KBUILD_EXTRA_SYMBOLS, как показано ниже: KBUILD_EXTRA_SYMBOLS = 'ваш путь к модулю'/Module.symvers
Обновление: Будьте очень осторожны при применении этого исправления для сборки для более старых версий ядра, так как в файлах Makefile.modpost есть ошибка в более старых версиях ядра что делает ваш сбор неверным и создает неправильные цели, когда вы указываете опцию KBUILD_EXTMOD.
Вы должны указать пути к источнику модулей, на которые вы зависите, в параметре KBUILD_EXTMOD.
Скажем, у вас есть модуль foo, который зависит от символов из модуля bar.
Исходные файлы для foo находятся в foo/module/, а исходные файлы для строки находятся в bar/module/
Команда make в Makefile для foo, вероятно, выглядит как
make ARCH=$$ARCH CROSS_COMPILE=$$CROSS_COMPILE -C $$LINUX_DIR \
M=`pwd`/module \
modules
(точная строка может отличаться в вашем проекте).
Измените его на
make ARCH=$$ARCH CROSS_COMPILE=$$CROSS_COMPILE -C $$LINUX_DIR \
M=`pwd`/module \
KBUILD_EXTMOD=`pwd`/../bar/module \
modules
(мы добавили строку KBUILD_EXTMOD = pwd
/../bar/module \, где pwd
/../bar/module - это путь к источникам модуля ядра, от которого мы зависим.
Можно ожидать, что этот параметр будет работать KBUILD_EXTRA_SYMBOLS, однако KBUILD_EXTMOD.
Нет, это не так. Вы создаете свой код в дереве или вне дерева, это сообщение не должно отображаться. Я думаю, вы должны исправить свой Makefile. Вот пример makefile. Не идеально, но используется для работы (до 2.6.26, не пробовал это с тех пор):
ifneq ($(KERNELRELEASE),)
# We were called by kbuild
obj-m += mymodule.o
mymodule-objs := mymodule_usb.o a.o b.o c.o
else # We were called from command line
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
@echo ' Building FOO drivers for 2.6 kernel.'
@echo ' PLEASE IGNORE THE "Overriding SUBDIRS" WARNING'
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
install:
./do_install.sh *.ko
endif # End kbuild check
clean:
rm -f -r *.o *.ko .*cmd .tmp* core *.i
Для дальнейшей документации вы можете проверить дерево ядра, процесс kbuild задокументирован
В связи с вышеописанным методом использования KBUILD_EXTMOD и вопросом о том, какие версии ядра он работает:
Мне нужно быть привязанным к вашему дереву. В нашем источнике мы создали SYMBOLSDIR, который является путём ко всем модулям
SYMBOLSDIR = 'некоторый путь'
make (аналогично приведенному выше примеру) $(KERNELDIR) MODVERDIR = $(SYMBOLSDIR) модули