/*
* 2020/12/11 18:06 qing
*/
/*
* 内核中通过lookup_symbol_name获取函数名称
*/
内核中很多结构体成员是函数,有时可能比较复杂不知道具体使用哪一个函数。这是可以通过lookup_symbol_name来获取符号表名称。
int lookup_symbol_name(unsigned long addr, char *symname)
{
symname[0] = '\0';
symname[KSYM_NAME_LEN - 1] = '\0';
if (is_ksym_addr(addr)) { /* 地址有效性检查 */
unsigned long pos;
pos = get_symbol_pos(addr, NULL, NULL);
/* Grab name */
kallsyms_expand_symbol(get_symbol_offset(pos), symname); /* 获取不好名称到symname */
return 0;
}
/* See if it's in a module. */
return lookup_module_symbol_name(addr, symname); /* 从module符号表中查找 */
}
/*
* 在timer_list.c和timer_stats.c中有使用
*/
static void print_name_offset(struct seq_file *m, unsigned long addr)
{
char symname[KSYM_NAME_LEN];
if (lookup_symbol_name(addr, symname) < 0)
seq_printf(m, "<%p>", (void *)addr);
else
seq_printf(m, "%s", symname);
}