Yocto:为什么在构建外部内核模块期间未定义结构模块
Yocto: Why is struct module undefined during building an external kernel module
我正在尝试从 meta-skeleton/recipes-kernel[= 添加示例外部内核 module hello-mod 35=] 使用 Yocto 构建系统添加到我的图像中。然而,当我尝试用 bitbake hello-mod
编译它时,它在第二阶段失败,抱怨 struct module
在行 .name = KBUILD_MODNAME,
上没有名为 name
的成员。似乎 struct module
没有被定义,即使 linux/module.h 已经被包含在内。这是似乎无法编译的通用 module 代码:
#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=";
我在编译日志中看不到任何错误,正在使用以下行调用 make(据我所知是正确的):
make -C /path/to/poky-rocko/build/tmp/work-shared/duovero/kernel-source \
M=/path/to/poky-rocko/build/tmp/work/duovero-poky-linux-gnueabi/hello-mod/0.1-r0
我可以确认 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 module 就生成了。
- 检查内核 4.16.x 的版本,将 hello-mod 添加到
MACHINE_ESSENTIAL_EXTRA
_RRECOMMENDS
并观察构建失败。
- 检查另一个内核 4 的副本。16.y 通过将 SRCREV 设置为相应的提交 ID,继续构建并观察它是否成功。
到目前为止,我在从 4.16.5 移动到 4.16.8 时观察到了这一点,反之亦然。所以在这一点上我很确定这是构建系统的问题。
我使用 grep(针对 "hello" 和 "MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS")和 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 配置任务的第二个 运行。对我来说,这很像是构建系统中的错误。为此,我已经在 Bugzilla 上报告了这个问题:
我正在尝试从 meta-skeleton/recipes-kernel[= 添加示例外部内核 module hello-mod 35=] 使用 Yocto 构建系统添加到我的图像中。然而,当我尝试用 bitbake hello-mod
编译它时,它在第二阶段失败,抱怨 struct module
在行 .name = KBUILD_MODNAME,
上没有名为 name
的成员。似乎 struct module
没有被定义,即使 linux/module.h 已经被包含在内。这是似乎无法编译的通用 module 代码:
#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=";
我在编译日志中看不到任何错误,正在使用以下行调用 make(据我所知是正确的):
make -C /path/to/poky-rocko/build/tmp/work-shared/duovero/kernel-source \
M=/path/to/poky-rocko/build/tmp/work/duovero-poky-linux-gnueabi/hello-mod/0.1-r0
我可以确认 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 module 就生成了。
- 检查内核 4.16.x 的版本,将 hello-mod 添加到
MACHINE_ESSENTIAL_EXTRA
_RRECOMMENDS
并观察构建失败。 - 检查另一个内核 4 的副本。16.y 通过将 SRCREV 设置为相应的提交 ID,继续构建并观察它是否成功。
到目前为止,我在从 4.16.5 移动到 4.16.8 时观察到了这一点,反之亦然。所以在这一点上我很确定这是构建系统的问题。
我使用 grep(针对 "hello" 和 "MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS")和 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 配置任务的第二个 运行。对我来说,这很像是构建系统中的错误。为此,我已经在 Bugzilla 上报告了这个问题: