Linux Yocto:为什么在构建外部内核模块时未定义结构模块
我试图使用Yocto构建系统将示例外部内核模块hello mod从meta skeleton/recipes内核添加到我的映像中。但是,当我尝试使用Linux Yocto:为什么在构建外部内核模块时未定义结构模块,linux,linux-kernel,kernel-module,yocto,Linux,Linux Kernel,Kernel Module,Yocto,我试图使用Yocto构建系统将示例外部内核模块hello mod从meta skeleton/recipes内核添加到我的映像中。但是,当我尝试使用bitbake hello mod编译它时,它在第二阶段失败,抱怨struct module行.name=KBUILD\u MODNAME,上没有名为name的成员。似乎没有定义struct module,即使包含了linux/module.h。这是似乎无法编译的通用模块代码: #include <linux/module.h> #inc
bitbake hello mod
编译它时,它在第二阶段失败,抱怨struct module
行.name=KBUILD\u MODNAME,
上没有名为name的成员。似乎没有定义struct module
,即使包含了linux/module.h。这是似乎无法编译的通用模块代码:
#include <linux/module.h>
#include <linux/vermagic.h>
#include <linux/compiler.h>
MODULE_INFO(vermagic, VERMAGIC_STRING);
MODULE_INFO(name, KBUILD_MODNAME);
__visible struct module __this_module
__attribute__((section(".gnu.linkonce.this_module"))) = {
.name = KBUILD_MODNAME,
.init = init_module,
#ifdef CONFIG_MODULE_UNLOAD
.exit = cleanup_module,
#endif
.arch = MODULE_ARCH_INIT,
};
#ifdef RETPOLINE
MODULE_INFO(retpoline, "Y");
#endif
static const char __module_depends[]
__used
__attribute__((section(".modinfo"))) =
"depends=";
我可以确认module.h存在于目录中:
/path/to/poky-rocko/build/tmp/work-shared/duovero/kernel-source/include/linux
因此,我正在寻找关于如何调试这个问题的想法。作为记录,以下是层、内核等的当前版本:
- poky是git.yoctoproject.org上的9915e071bcadd7c4d5363a067c529889851d37a5(rocko)
- linux是来自git.kernel.org的9dc30ff9a115559cc55673d0b1d3c576402d073e
任何帮助或提示都将不胜感激 这似乎是Yocto构建系统的一个问题。当我遵循这些步骤时,hello mod模块将生成
检查内核4.16.x的一个版本,将hello mod添加到MACHINE\u-ESSENTIAL\u-EXTRA
\u-red
并观察构建失败
通过将SRCREV设置为相应的commit id来检查另一个内核4.16.y的副本,继续构建并观察其成功
到目前为止,我在从4.16.5移动到4.16.8时观察到了这一点,反之亦然。所以在这一点上,我非常确定这是构建系统的一个问题
我使用grep(对照“hello”和“MACHINE\u-sential\u-EXTRA\u-rreproducts”)和diff仔细查看了bitbake-e
的输出,但没有发现任何显著差异。我还检查了编译和配置日志,唯一有趣的是在第二次运行时打印的配置日志中:
DEBUG: Executing shell function do_configure
NOTE: make KERNEL_SRC=/path/to/poky-rocko/build/tmp/work-shared/duovero/kernel-source clean
rm -f *.o *~ core .depend .*.cmd *.ko *.mod.c
rm -f Module.markers Module.symvers modules.order
rm -rf .tmp_versions Modules.symvers
DEBUG: Shell function do_configure finished
DEBUG: Executing python function do_qa_configure
DEBUG: Python function do_qa_configure finished
在第一次运行时,我们只有:
DEBUG: Executing shell function do_configure
DEBUG: Shell function do_configure finished
DEBUG: Executing python function do_qa_configure
DEBUG: Python function do_qa_configure finished
尽管这可能刚刚发生,因为这是hello mod配置任务的第二次运行。在我看来,这很像构建系统中的一个bug。为此,我在Bugzilla上报告了这一问题:
“似乎未定义结构模块”
。-否,错误struct module没有名为name的成员
表示已定义结构,但没有指定字段。关于使用未定义的结构类型的错误看起来不同。未修改的有效吗?我没有修改示例,只是将其包含在我的层中。我同意该错误表明有东西正在定义结构模块
,但是,
中定义的结构模块
肯定有一个名为名称
的成员。您的kernel.CONFIG中是否有配置模块=y
?这可能是一个愚蠢的问题,因为如果没有定义,它不应该进入第2阶段,但是struct module
完整声明确实取决于所定义的CONFIG\u MODULES
宏。感谢您的反馈,正如您猜测的那样,CONFIG\u MODULES=y
确实已定义。
DEBUG: Executing shell function do_configure
DEBUG: Shell function do_configure finished
DEBUG: Executing python function do_qa_configure
DEBUG: Python function do_qa_configure finished