Предупреждения компоновщика модуля ядра Linux: "*** Предупреждение: <function>[<module>] undefined!" - Есть ли способ избавиться от них? - PullRequest
20 голосов
/ 09 марта 2009

При компиляции модулей ядра Linux, которые зависят друг от друга, компоновщик выдает неопределенные предупреждения о символах, такие как

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

Ответы [ 5 ]

16 голосов
/ 26 февраля 2010

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

9 голосов
/ 09 марта 2009

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

Обновление: Будьте очень осторожны при применении этого исправления к сборкам для более старых версий ядра, так как в файле Makefile.modpost в более старых версиях есть ошибка версии ядра, из-за которых ваша сборка ведет себя неправильно и создает неправильные цели, когда вы указываете опцию KBUILD_EXTMOD .

Вы должны указать пути к источнику модулей, от которых вы зависите, в KBUILD_EXTMOD make параметр.

Скажем, у вас есть модуль foo , который зависит от символов из модуля bar .

Исходные файлы для foo находятся в foo / module / , а исходные файлы для bar находятся в 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 \ line, где pwd / .. / bar / module - путь к источникам модуля ядра, от которого мы зависим.

Можно ожидать, что параметр KBUILD_EXTRA_SYMBOLS будет работать таким образом, однако это KBUILD_EXTMOD .

3 голосов
/ 09 марта 2009

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

1 голос
/ 31 августа 2010

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

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

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

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

make (как в примере выше) $ (KERNELDIR) MODVERDIR = $ (SYMBOLSDIR) modules

...