Linux: modpost ничего не строит
У меня проблемы с получением модулей ядра для сборки на моей машине. Всякий раз, когда я собираю модуль, modpost всегда говорит, что модулей нет:
MODPOST 0 modules
Чтобы устранить проблему, я написал тестовый модуль (hello.c):
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
#include <linux/init.h> /* Needed for the macros */
static int __init hello_start(void)
{
printk(KERN_INFO "Loading hello module...\n");
printk(KERN_INFO "Hello world\n");
return 0;
}
static void __exit hello_end(void)
{
printk(KERN_INFO "Goodbye Mr.\n");
}
module_init(hello_start);
module_exit(hello_end);
Вот Makefile для модуля:
obj-m = hello.o
KVERSION = $(shell uname -r)
all:
make -C /lib/modules/$(KVERSION)/build M=$(shell pwd) modules
clean:
make -C /lib/modules/$(KVERSION)/build M=$(shell pwd) clean
Когда я собираю его на своей машине, я получаю следующий вывод:
make -C /lib/modules/2.6.32-27-generic/build M=/home/waffleman/tmp/mod-test modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-27-generic'
CC [M] /home/waffleman/tmp/mod-test/hello.o
Building modules, stage 2.
MODPOST 0 modules
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-27-generic'
Когда я делаю модуль на другой машине, он успешен:
make -C /lib/modules/2.6.24-27-generic/build M=/home/somedude/tmp/mod-test modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.24-27-generic'
CC [M] /home/somedude/tmp/mod-test/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/somedude/tmp/mod-test/hello.mod.o
LD [M] /home/somedude/tmp/mod-test/hello.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-27-generic'
Я искал любую соответствующую документацию по modpost, но нашел немного. Кто-нибудь знает, как modpost решает, что собирать? Есть ли среда, в которой я, возможно, скучаю?
Кстати, вот что я бегу:
uname -a
Linux waffleman-desktop 2.6.32-27-generic #49-Ubuntu SMP Wed Dec 1 23:52:12 UTC 2010 i686 GNU/Linux
редактировать
Вот как бегал с V=1:
make -C /lib/modules/2.6.32-27-generic/build M=/home/waffleman/tmp/mod-test modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-27-generic'
test -e include/linux/autoconf.h -a -e include/config/auto.conf || ( \
echo; \
echo " ERROR: Kernel configuration is invalid."; \
echo " include/linux/autoconf.h or include/config/auto.conf are missing."; \
echo " Run 'make oldconfig && make prepare' on kernel src to fix it."; \
echo; \
/bin/false)
mkdir -p /home/waffleman/tmp/mod-test/.tmp_versions ; rm -f /home/waffleman/tmp/mod-test/.tmp_versions/*
make -f scripts/Makefile.build obj=/home/waffleman/tmp/mod-test
gcc -Wp,-MD,/home/waffleman/tmp/mod-test/.hello.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-27-generic/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DMODULE -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(hello)" -D"KBUILD_MODNAME=KBUILD_STR(hello)" -c -o /home/waffleman/tmp/mod-test/.tmp_hello.o /home/waffleman/tmp/mod-test/hello.c
set -e ; perl /usr/src/linux-headers-2.6.32-27-generic/scripts/recordmcount.pl "i386" "32" "objdump" "objcopy" "gcc" "ld" "nm" "" "" "1" "/home/waffleman/tmp/mod-test/hello.o";
(cat /dev/null; echo kernel//home/waffleman/tmp/mod-test/hello.ko;) > /home/waffleman/tmp/mod-test/modules.order
make -f /usr/src/linux-headers-2.6.32-27-generic/scripts/Makefile.modpost
scripts/mod/modpost -m -a -i /usr/src/linux-headers-2.6.32-27-generic/Module.symvers -I /home/waffleman/tmp/mod-test/Module.symvers -o /home/waffleman/tmp/mod-test/Module.symvers -S -w -s
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-27-generic'
waffleman@waffleman-desktop:~/tmp/mod-test$ cat /home/waffleman/tmp/mod-test/modules.order
kernel//home/waffleman/tmp/mod-test/hello.ko
13 ответов
Ошибка таинственно ушла. Если у кого-то есть идея, что может вызвать это. Я хотел бы знать, если будет в следующий раз.
Я провел весь день, приклеенный к своему компьютеру, борясь с этой конкретной проблемой... которая в итоге загадочно исчезла, как для OP.
По крайней мере, я могу предложить эту скудную деталь из своего опыта: я получал тот же вывод, что и OP (для make V=1), и помещал операторы печати в ${kernel_directory}/scripts/makefile.build, который показал, что obj-m странно НЕ устанавливается после включения моего make-файла, хотя он был явно напечатан, как указано выше.
Я много дурачился со строкой "obj-m += hello.o" и теми, кто вокруг нее. В конце концов это волшебным образом сработало.. хотя в конце все выглядело точно так же, как и раньше. Может быть, я скопировал эти строки из учебника онлайн, и он содержал какой-то недопустимый / неправильный символ?
Для любого, кто испытывает это, убедитесь, что obj-m фактически установлен в hello.o
Если это таинственным образом не является, удалите строку, черт возьми весь Makefile, и повторите его.
Я знаю, что это не сильно помогает; Я хотел бы воспроизвести то, что произошло!
В другом потоке я обнаружил, что когда я копировал и вставлял содержимое make-файла, -C после make использовал неправильный символ "-", и мне пришлось его набирать заново. Так уж получилось, что это так для строки obj-m += ... выше. Вам нужно повторно ввести этот символ, чтобы сделать его действительным. Надеемся, что это должен найти любой, кто следует руководству по созданию модуля hello world.
Я просто столкнулся с этой же проблемой, и для меня это было вызвано изменением параметров grep по умолчанию через переменную среды GREP_OPTIONS. Я не копался в деталях, но что-то в процессе сборки модуля не понравилось моему альтернативному выводу grep (включая имя файла и номер строки). Удаление переменной среды GREP_OPTIONS исправило проблемы.
Это происходит потому, что когда вы копируете содержимое файла make из PDF или любого другого учебного сайта и используете его как есть. Пока вы выполняете копирование-вставку, содержимое будет немного странным в среде Linux. то есть; Там будут специальные выпуски персонажей. Если вы перепечатаете содержимое в среде Linux и сделаете make, это должно сработать.
Я предполагаю, что вы скопировали содержимое Makefile из PDF или какого-либо HTML-документа. Используемые дефисы несколько странные. Просто попробуйте заменить дефисы в make-файле; это будет работать как шарм.
На компьютере, который выходит из строя, в вашем.config отключена поддержка модулей?
Попробуйте выполнить "make menuconfig" и убедитесь, что поддержка модуля включена.
Я смог решить эту проблему, поставив
obj-m += <module name>.o
В отдельном файле с именем Kbuild. Смотрите Linux/ Documentation/kbuild/modules.txt для подсказки, почему это может работать
У меня такая же проблема. Наконец, я пересобрал ядро, переписал make-файл. Это сработало наконец.
Я предполагаю, что основная причина в том, что у меня были модули M=$(PWD) в следующей строке сразу после make ARCH=arm...
Попробуй удалить modules
строка из Makefile:
obj-m = hello.o
KVERSION = $(shell uname -r)
all:
make -C /lib/modules/$(KVERSION)/build M=$(shell pwd) # <--
clean:
make -C /lib/modules/$(KVERSION)/build M=$(shell pwd) clean
Я могу только предположить, что ваша среда сборки ядра испорчена, потому что она проходит как теоретическую проверку (взгляд разработчика), так и практический тест:
make -C /lib/modules/2.6.36-rc8-32-desktop/build M=/dev/shm modules
make[1]: Entering directory `/usr/src/linux-2.6.36-rc8-32-obj/x86_64/desktop'
make -C ../../../linux-2.6.36-rc8-32 O=/usr/src/linux-2.6.36-rc8-32-obj/x86_64/desktop/. modules
CC [M] /dev/shm/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /dev/shm/hello.mod.o
LD [M] /dev/shm/hello.ko
make[1]: Leaving directory `/usr/src/linux-2.6.36-rc8-32-obj/x86_64/desktop'
Думаю, дело не в специальных персонажах. Я не мог решить, даже когда набирал вручную! Затем я снова попробовал использовать текстовый редактор kate, потому что раньше я использовал
nano
и на этот раз даже простое копирование и вставка сработало как нельзя лучше. Из-за этого, я думаю, проблема в текстовом редакторе.
Я решил эту проблему, исправив Makefile, то есть:
obj-m := modulename.o