Подтвердить что ты не робот

Линейные модули Linux: "*** Предупреждение: <function> [<module>] undefined!" - любой способ избавиться от них?

При компиляции модулей ядра 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 по этой проблеме - кажется, никто не знает ответа. Предполагается ли, что эти предупреждения компоновщика должны быть такими, когда вы создаете модуль ядра?

4b9b3361

Ответ 1

Используйте KBUILD_EXTRA_SYMBOLS, как показано ниже: KBUILD_EXTRA_SYMBOLS = 'ваш путь к модулю'/Module.symvers

Ответ 2

Наконец, я понял. Спасибо shodanex за то, что поставили меня на правильный путь.

Обновление: Будьте очень осторожны при применении этого исправления для сборки для более старых версий ядра, так как в файлах 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.

Ответ 3

Нет, это не так. Вы создаете свой код в дереве или вне дерева, это сообщение не должно отображаться. Я думаю, вы должны исправить свой 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 задокументирован

Ответ 4

В связи с вышеописанным методом использования KBUILD_EXTMOD и вопросом о том, какие версии ядра он работает:

  • andycjw указал, что он не работает для него в 2.6.12
  • Это не сработало для меня в 2.6.15 (сломал мой модуль)
  • Просматривая ядро, я вижу ряд изменений в Makefile.modpost, которые кажутся связанными в 2.6.26 и 2.6.28, поэтому я ожидаю, что один из них - это предел.

Ответ 5

Мне нужно быть привязанным к вашему дереву. В нашем источнике мы создали SYMBOLSDIR, который является путём ко всем модулям

SYMBOLSDIR = 'некоторый путь'

make (аналогично приведенному выше примеру) $(KERNELDIR) MODVERDIR = $(SYMBOLSDIR) модули