内核编译期间出现奇怪的错误

时间:2015-04-11 12:56:25

标签: c linux linux-kernel

我编辑了2.6.32.65 linux内核的一些部分并进行了编译。内核编译得很好并且正常生成bzImage。然后制作然后继续如下:

Kernel: arch/x86/boot/bzImage is ready.  (#170)
   Building modules, stage 2.
   MODPOST 2414 modules.
ERROR: "external_page_start" [fs/cachefiles/cachefiles.ko] undefined!
ERROR: "variable_hash_start" [fs/cachefiles/cachefiles.ko] undefined!

虽然有两个问题。 首先,这些变量在头文件include/linux/stthash.h中定义如下:

extern unsigned long fixed_hash_start;
extern unsigned long variable_hash_start;
extern unsigned long external_page_start;
extern unsigned long command_space_start;

并在mm/page_alloc.c中定义如下:

unsigned long fixed_hash_start;
unsigned long variable_hash_start;
unsigned long external_page_start;
unsigned long command_space_start;

然后根据需要为它们分配变量。他们确实通过编译并创建了bzImage,所以我不知道这有什么问题。

第二个问题是variable_hash_start中的fs/cachefiles未在external_page_start中的任何文件中使用,fs/cachefiles/rdrw.c中只有cachefiles.ko被访问(读取,未写入)。

我不知道是什么导致了这个错误,我猜测变量在{{1}}中没有正确链接,但我不知道如何解决这个问题。有什么帮助吗?

2 个答案:

答案 0 :(得分:2)

Linux内核的动态模块默认情况下无权访问内核中的全局变量和函数(标题中的函数除外)。您需要专门为模块导出它。

EXPORT_SYMBOL宏是最常用的。此外,您只能通过EXPORT_SYMBOL_GPL导出变量和函数来限制GPL模块访问您的变量和函数。

详情: http://tuxthink.blogspot.in/2011/07/exporting-symbols-from-module.html

答案 1 :(得分:0)

首先,在构建内核模块时会遇到错误,这些模块是独立于主内核映像生成的,因此模块中的错误将停止编译,但仍然会为您提供bzImage。

此外,随意浏览内核2.6.32.65表示变量external_page_start和command_space_start不存在于mm / page_alloc.c中

https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/mm/page_alloc.c?id=refs/tags/v2.6.32.65

但是,您还没有告诉我们您修改了什么,这些变量是由您添加的吗?

在任何情况下,包括您定义这些变量的正确头文件都将停止未定义的变量错误。