linux - 内核模块 : hrtimer_start "Unknown Symbol in Module"

标签 linux linux-kernel kernel kernel-module

我正在构建一个使用 hrtimer 接口(interface)的内核模块。我的模块编译成功,它有 MODULE_LICENSE("GPL")设置:

make -C /lib/modules/3.0.0-23-server/build SUBDIRS=/home/projects/net-modeler modules
make[1]: Entering directory `/usr/src/linux-headers-3.0.0-23-server'
  CC [M]  /home/projects/net-modeler/nm_injector.o
  CC [M]  /home/projects/net-modeler/nm_scheduler.o
  LD [M]  /home/projects/net-modeler/net-modeler.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/projects/net-modeler/net-modeler.mod.o
  LD [M]  /home/projects/net-modeler/net-modeler.ko
make[1]: Leaving directory `/usr/src/linux-headers-3.0.0-23-server'

... 但是当我尝试 insmod它,dmesg 输出

[111853.094925] Unknown symbol hrtimer_init (err 0)
[111853.094931] Unknown symbol hrtimer_start (err 0)
[111853.094942] Unknown symbol hrtimer_cancel (err 0)

这些函数都在<linux/hrtimer.h> 中, 并在 kernel/hrtimer.c 中导出如下:

/**
 * hrtimer_init - initialize a timer to the given clock
 * @timer:  the timer to be initialized
 * @clock_id: the clock to be used
 * @mode: timer mode abs/rel
 */
void hrtimer_init(struct hrtimer *timer, clockid_t clock_id,
      enum hrtimer_mode mode)
{
  debug_init(timer, clock_id, mode);
  __hrtimer_init(timer, clock_id, mode);
}
EXPORT_SYMBOL_GPL(hrtimer_init);

cat /proc/kallsyms | grep <func>这三个函数的结果是:

0000000000000000 T hrtimer_init
0000000000000000 T hrtimer_cancel
0000000000000000 T hrtimer_start

谁能帮我弄清楚这是怎么回事?在我看来,所有功能都已导出,应该能够找到它们,但由于某种原因它们没有。我在做傻事吗?

最佳答案

对于任何其他试图解决此问题的人来说,MODULE_LICENSE("GPL") 必须在所有模块文件中,而不仅仅是主要文件。

否则,实际包含函数调用的文件将被 EXPORT_SYMBOL_GPL 限制访问它们。

关于linux - 内核模块 : hrtimer_start "Unknown Symbol in Module",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11873581/

相关文章:

linux - Git Bash 与 Oracle VM VirtualBox

android - 如何直接发送触摸事件到/dev/input/event?

linux - insmod lkm.ko 在可加载内核模块中调用 cleanup_module 而不是 init_module

linux - 如何在 Linux 中以 4kHz 的精确速率执行任务(必要时使用 PREEMPT-RT)

linux - 为什么我所有的浏览器都显示禁止使用 phpmyadmin config.js 文件的错误?

c - 使用 makefile 链接 C 程序时出错

c - 在汇编 x86 或 ARM 中引发软中断

Linux 内核 : copy_from_user - struct with pointers

PHP无法在tmp中写入文件

linux - register_kprobe() 在包含结构时返回 EINVAL,无需额外内存