linux内核符号表
时间:2010-10-19 来源:刘一痕
所谓内核符号表就是在内核内部函数或变量中可供外部引用的函数和变量的符号表。在 2.6 内核下,使用以下命令可以看到内核符号表:
引用 beyes@linux-beyes:/> cat /proc/kallsyms | more
c0100000 T _text
c0100000 T startup_32
c0100054 t default_entry
c01000b0 T startup_32_smp
c0100132 t checkCPUtype
c01001b3 t is486
c01001ba t is386
c0100227 t check_x87
c010025a t setup_idt
c0100277 t rp_sidt
c01002fa t early_divide_err
c0100300 t early_illegal_opcode
.... ....
在内核符号表中,左边一列是符号地址,右边一列是函数和变量。在一个模块加载后,任何一个被模块导出的符号都会成为内核符号表的一部分。一般情况下,你设计的一个模块实现了自己所需的功能,这里也并不一定需要要所有的符号都导出来。但是,如果希望别人也能用到自己的模块,那就需要将其导出。
使用以下宏可以导出符号到内核符号表:
引用 EXPORT_SYMBOL(符号名);
EXPORT_SYMBOL_GPL(符号名);
使用 EXPORT_SYMBOL_GPL() 只用于包含 GPL 许可权的模块。
示例代码:
引用 #include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
int add_int(int a, int b)
{
return (a + b);
}
int sub_int(int a, int b)
{
return (a - b);
}
EXPORT_SYMBOL(add_int);
EXPORT_SYMBOL(sub_int);
编译后用 insmod 加载到内核中,然后执行以下命令:
引用 beyes@linux-beyes:~/C/kernel/modadd> cat /proc/kallsyms |grep add_int
f9d70034 r __ksymtab_add_int [modadd]
f9d7004c r __kstrtab_add_int [modadd]
f9d70040 r __kcrctab_add_int [modadd]
6ce40a9f a __crc_add_int [modadd]
f9d70000 T add_int [modadd]
(滤掉一些多余的输出)
beyes@linux-beyes:~/C/kernel/modadd> cat /proc/kallsyms |grep sub_int
f9d7002c r __ksymtab_sub_int [modadd]
f9d70044 r __kstrtab_sub_int [modadd]
f9d7003c r __kcrctab_sub_int [modadd]
bb5e85f9 a __crc_sub_int [modadd]
f9d70004 T sub_int [modadd]
引用 beyes@linux-beyes:/> cat /proc/kallsyms | more
c0100000 T _text
c0100000 T startup_32
c0100054 t default_entry
c01000b0 T startup_32_smp
c0100132 t checkCPUtype
c01001b3 t is486
c01001ba t is386
c0100227 t check_x87
c010025a t setup_idt
c0100277 t rp_sidt
c01002fa t early_divide_err
c0100300 t early_illegal_opcode
.... ....
在内核符号表中,左边一列是符号地址,右边一列是函数和变量。在一个模块加载后,任何一个被模块导出的符号都会成为内核符号表的一部分。一般情况下,你设计的一个模块实现了自己所需的功能,这里也并不一定需要要所有的符号都导出来。但是,如果希望别人也能用到自己的模块,那就需要将其导出。
使用以下宏可以导出符号到内核符号表:
引用 EXPORT_SYMBOL(符号名);
EXPORT_SYMBOL_GPL(符号名);
使用 EXPORT_SYMBOL_GPL() 只用于包含 GPL 许可权的模块。
示例代码:
引用 #include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
int add_int(int a, int b)
{
return (a + b);
}
int sub_int(int a, int b)
{
return (a - b);
}
EXPORT_SYMBOL(add_int);
EXPORT_SYMBOL(sub_int);
编译后用 insmod 加载到内核中,然后执行以下命令:
引用 beyes@linux-beyes:~/C/kernel/modadd> cat /proc/kallsyms |grep add_int
f9d70034 r __ksymtab_add_int [modadd]
f9d7004c r __kstrtab_add_int [modadd]
f9d70040 r __kcrctab_add_int [modadd]
6ce40a9f a __crc_add_int [modadd]
f9d70000 T add_int [modadd]
(滤掉一些多余的输出)
beyes@linux-beyes:~/C/kernel/modadd> cat /proc/kallsyms |grep sub_int
f9d7002c r __ksymtab_sub_int [modadd]
f9d70044 r __kstrtab_sub_int [modadd]
f9d7003c r __kcrctab_sub_int [modadd]
bb5e85f9 a __crc_sub_int [modadd]
f9d70004 T sub_int [modadd]
相关阅读 更多 +