我正在尝试在 Linux 源代码树 (3.18.0-rc6) 之外构建一个基本模块。当我构建它时,我收到一条错误消息,说它找不到脚本/...
我的目录设置如下
mymodule/
src/
file.c
linux/
.git/
# rest of the source tree
我正在运行:make -C ../linux SUBDIRS=$(pwd)/src modules
从我的模块。
这是实际的错误:
make: Entering directory '/home/me/linux'
Building modules, stage 2.
MODPOST 1 modules
/bin/sh: scripts/mod/modpost: No such file or directory
scripts/Makefile.modpost:90: recipe for target '__modpost' failed
make[1]: *** [__modpost] Error 127
Makefile:1384: recipe for target 'modules' failed
make: *** [modules] Error 2
make: Leaving directory '/home/me/linux'
是否有一个设置可以让 Make 在 linux/ 中查找脚本?
答案1
要构建内核模块,您需要的不仅仅是解压的内核源代码。您需要一些在内核构建期间生成的配套程序和头文件。生成文件正在寻找modpost
正确的位置,但尚未找到。发行版通常将其放在名为或或类似名称的包中。linux-headers-VERSION
kernel-headers-VERSION
首先,您需要配置内核。内核版本和内核配置必须与您要运行该模块的内核相匹配。如果您.config
从某处获得该文件,请将其复制到内核目录。然后,构建必要的文件来构建额外的模块,在内核源目录中运行以下命令:
make modules_prepare
然后你可以进入模块的源目录并运行
make -C ../linux M=$PWD/src
看构建外部模块在内核文档 ( Documentation/kbuild/modules.txt
) 中了解更多信息。
答案2
在构建自定义内核时,大多数人不要建造源 tarball 内的源代码。请考虑使用软链接:
正如您所看到的,/usr/src/linux
链接指向/usr/src/linux-3.12.21-gentoo-r1
目录因此,当发出 make 命令时,生成的输出将被放入构建树的顶级目录中,这不会污染原始源。要构建链接问题(以 root 身份):
ln -sf /usr/src/linux-_some-kernel-version_ /usr/src/linux && cd /usr/src/linux
完成后,参考 Giles 的回答来完成任务。