Linux Yocto:为什么在构建外部内核模块时未定义结构模块

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

我试图使用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>
#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