Linux 为什么我的符号不与导出符号一起导出?

Linux 为什么我的符号不与导出符号一起导出?,linux,kernel,driver,Linux,Kernel,Driver,我正在制作一个简单的内核对象。但不知何故,一个变量不能用EXPORT_SYMBIL宏导出。 资料来源是: #include <linux/module.h> #include <linux/init.h> MODULE_LICENSE("Dual BSD/GPL"); int hello_int __attribute__ ((__unused__)); EXPORT_SYMBOL(hello_int); static int hello_init(void) {

我正在制作一个简单的内核对象。但不知何故,一个变量不能用EXPORT_SYMBIL宏导出。 资料来源是:

#include <linux/module.h>
#include <linux/init.h>

MODULE_LICENSE("Dual BSD/GPL");

int hello_int __attribute__ ((__unused__));
EXPORT_SYMBOL(hello_int);

static int hello_init(void)
{
        printk(KERN_ALERT "driver loaded\n");
        return 0;
}

static void hello_exit(void)
{
        printk(KERN_ALERT "driver unloaded\n");
}

module_init(hello_init);
module_exit(hello_exit);
没有,你好。但是当然,

# cat Module.symvers

0x8ed8de1a      hello_int       /home/ken/myprojects/hello/hello        EXPORT_SYMBOL
为什么??出什么事了

# uname -a
Linux debian-6-0-6-i386 2.6.32-5-686 #1 SMP Sun Sep 23 09:49:36 UTC 2012 i686 GNU/Linux
下面是用于此的Makefile:

obj-m := hello.o

all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

您的问题是,内核是在没有设置的情况下配置的,这导致它只导出函数而不导出变量。我发现很难做到这一点,但在某个时候,该标志似乎在某个内核更新中被启用。

nm of the.ko list
hello\u int
?问得好<代码>$nm hello.ko
00000000 B hello_int
它看起来是未初始化的数据(BSS部分),但“B”表示它是导出的,我想我使用的是debian挤压(6.0)、内核
2.6.32-40-generic-pae
,它在/proc/kallsyms中显示hello_int符号。32和64位似乎工作正常。我很困惑,因为它应该在银行里运作,彼得。嗯。。。我也是。。你和我展示的samke Mak文件核对过了吗?我复制粘贴了你在问题中写的东西。我唯一的另一个建议是初始化变量,这可能会导致它出现在您的案例中,尽管我正在用CONFIG_KALLSYMS_ALL重建内核(我找不到预构建包)。同时,我对两个内核模块进行了另一次尝试。一个是hello.ko,另一个是hi.ko,它访问hello_int并将其撬开。还好。不管CONFIG_KALLSYMS_ALL设置如何,符号肯定是导出的CONFIG_KALLSYMS_ALL通常有助于内核调试,但不需要使用从其他模块导出的非函数符号。正如您所注意到的,即使您看不到符号,它也可以正常工作。
obj-m := hello.o

all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean