[英]what is __ksymtab? in linux kernel
当我们cat'proc / kallsyms'或'system.map'时,我们会得到这样的符号
....
c033718c T nf_hook_slow
c04ca284 r __ksymtab_nf_hook_slow
c04ca28c r __ksymtab_nf_hooks
c04d24a0 r __kcrctab_nf_hook_slow
c04d24a4 r __kcrctab_nf_hooks
c04e9122 r __kstrtab_nf_hook_slow
c04e9179 r __kstrtab_nf_hooks
c054d854 D nf_hooks
c0571ca0 d nf_hook_mutex
....
先感谢您。
简单来说,'T'通常表示全局(非静态但不一定是导出的)函数,'t' - 编译单元本地的函数(即静态),'D' - 全局数据,'d' - 编译单元的本地数据。 'R'和'r' - 与'D'/'d'相同,但是对于只读数据。
这些是导出符号所需的特殊部分中的项目,以便内核模块可以使用这些符号。
对于每个导出的符号, EXPORT_SYMBOL()
至少定义以下内容:
__kstrtab_<symbol_name>
- 作为字符串的符号名称 __ksymtab_<symbol_name>
- 包含符号信息的结构:其地址, __kstrtab_<symbol_name>
地址等。 __kcrctab_<symbol_name>
- 符号的控制和(CRC)的地址 - 例如,它用于检查内核或模块是否提供给定内核模块所需的完全相同的符号。 如果模块需要具有给定名称和CRC的符号,并且内核提供具有该名称但具有不同CRC的符号(例如,如果模块是针对不同的内核版本编译的),则模块加载器将拒绝加载该内核模块(除非禁用此检查)。 有关详细信息,请查看linux / export.h中EXPORT_SYMBOL()
宏的实现。
不确定,但到目前为止,当System.map中存在函数(“文本符号”)或变量(“数据符号”)但在/ proc / kallsyms中未显示(如果内核编译正确并且完全启用kallsyms(CONFIG_KALLSYMS = y,CONFIG_KALLSYMS_ALL = y)。 如果CONFIG_KALLSYMS_ALL = n,则只有函数(确切地说,来自* .text部分的符号)将显示在/ proc / kallsyms中。
取决于您的内核版本。 您可以查看内核的EXPORT_SYMBOL()
定义,并找到__ksymtab_<symbol_name>
变量的类型。 在内核3.11中,它是linux / export.h中定义的struct kernel_symbol
kernel_symbol 。 有了该结构的定义及其地址,我想,你可以得到符号的地址: struct kernel_symbol::value
。 虽然我自己没试过。
但请注意, __ksymtab_nf_hook
适用于nf_hook
但不适用于nf_hooks
。 名称必须匹配。 nf_hooks
和nf_hook
是不同的实体。
很难说没有看到代码和/ proc / kallsyms的相关部分。 也许它是#ifdef'ed并且根本没有编译,可能还有别的东西。
此外, nf_hooks
是一个数据项,因此如果CONFIG_KALLSYMS_ALL为'n',它可能不会出现在/ proc / kallsyms中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.