【发布时间】:2018-05-14 16:46:19
【问题描述】:
我正在尝试使用 Yocto 构建系统将示例外部内核模块 hello-mod 从 meta-skeleton/recipes-kernel 添加到我的图像中。然而,当我尝试用bitbake hello-mod 编译它时,它在第二阶段失败,抱怨struct module 在.name = KBUILD_MODNAME, 行上没有名为name 的成员。即使 linux/module.h 已包含在内,似乎也没有定义 struct 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
任何帮助或提示将不胜感激!
【问题讨论】:
-
"似乎
struct module没有被定义..." - 不,错误struct module has no member named name表示结构已定义,但没有指定字段。关于使用未定义结构类型的错误看起来不同。 -
未修改的example有效吗?
-
我没有修改示例,只是将它包含在我的图层中。我同意该错误表明某些东西正在定义
struct module,但是,struct module中定义的<linux/module.h>肯定有一个名为name的成员。 -
你的内核.config 中有
CONFIG_MODULES=y吗?这可能是一个愚蠢的问题,因为如果没有定义它就不应该进入第 2 阶段,但struct module完整声明确实依赖于正在定义的CONFIG_MODULES宏。 -
感谢 Ian 的反馈,不过正如您所猜测的那样,
CONFIG_MODULES=y确实已定义。
标签: linux linux-kernel kernel-module yocto