sta*_*ius 2 linux kernel symbols module export
符号machine_power_off
在"T"中标记为/proc/kallsyms
:
$ grep -w machine_power_off /proc/kallsyms
ffffffff8102391b T machine_power_off
Run Code Online (Sandbox Code Playgroud)
但它没有出口.kallsyms中的"T"是否必要且足以导出符号?出口是否必要且足以在其他模块中使用?
我使用它的模块编译时带有警告:
WARNING: "machine_power_off" [/path/to/module.ko] undefined!
Run Code Online (Sandbox Code Playgroud)
在主机(3.2.0-4-amd64)上我可以加载这个模块,但是在VirtualBox(3.16.0-4-amd64)上它产生以下消息:
insmod: ERROR: could not insert module module.ko: Unknown symbol in module
Run Code Online (Sandbox Code Playgroud)
为什么这个模块加载在我的主机系统中,而不是在VirtualBox中?
标记“T”/proc/kallsyms
表示该符号是全局可见的,可以在其他内核的代码中使用(例如,由驱动程序、内置编译)。
但是为了在内核模块的代码中可用需要使用EXPORT_SYMBOL
或类似的符号导出。导出的符号列表与内核中所有符号的列表分开维护。
导出的符号可以在文件中找到 /lib/modules/<kernel-version>/build/Module.symvers
。
(此文件应该存在以便可以针对给定内核构建内核模块)。
要使用全局但未导出的内核符号(例如machine_power_off
您提到的符号),可以kallsyms_lookup
在模块代码中使用:
#include <linux/kallsyms.h>
static void (*machine_power_off_p)(void);
machine_power_off_p = (void*) kallsyms_lookup_name("machine_power_off");
Run Code Online (Sandbox Code Playgroud)
现在您可以machine_power_off
通过machine_power_off_p
指针调用该函数:
(*machine_power_off_p)();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3263 次 |
最近记录: |