void *__symbol_get(const char * symbol)
symbol: 符号名
ret: 符号的地址,不存在则返回空
头文件: #include <linux/module.h>

void *__symbol_get(const char *symbol)
{
struct module *owner;
const struct kernel_symbol *sym;
preempt_disable();
sym = find_symbol(symbol, &owner, NULL, true, true);
if (sym && strong_try_module_get(owner))
sym = NULL;
preempt_enable();
return sym ? (void *)sym->value : NULL;
}
从strong_try_module_get可以看出__symbol_get会对符号所对应的模块引用计数增加 1
并且获取符号的地址具体是由find_symbol来实现的,查看find_symbol发现find_symbol也是一个导出函数
那么直接使用此函数的例子如下
const struct kernel_symbol *find_symbol(const char *name,
struct module **owner,
const unsigned long **crc,
bool gplok,
bool warn)
name:符号名
owner: 二级指针 输出参数 获得模块的地址
crc:二级指针 输出参数 内核符号的crc值所在的地址
gplok:模块支持GPL许可
warn: 允许输出警告信息
头文件: #include <linux/module.h>