当我们捕捉“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,R,D,D什么意思?
我可以在内核源代码中find符号EXPORT_SYMBOL(…),但也有其他的前缀__ksymtab …或__kstrtab …这些是什么?
System.map中是否有符号,但排除在/ proc / kallsyms中? (假设内核编译正确)
我有netfilter启用linux内核,但我不能find符号'nf_hooks',但有'__ksymtab_nf_hook'。 有没有办法使用__ksymtab_nf_hook获取nf_hooks的地址?
我看到我的linux源代码EXPORT_SYMBOL(nf_hook),但我不能find它,如果我'猫/ proc / kallsyms'。 这是否有一些典型的原因?
先谢谢你。
哪个驱动程序是一个句柄的所有者?
linux / windows内核模块中的无限循环
插入linux内核模块静态
Linux套接字内核缓冲区是否交换到磁盘?
简单来说,'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,则只会在/ proc / kallsyms中显示函数(确切地说,来自* .text部分的符号)。
取决于你的内核版本。 你可以看看你的内核的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的相关部分。 也许它是#如果已经被定义出来而没有被编译,那么可能还有别的东西。
此外, nf_hooks是一个数据项,所以如果CONfig_KALLSYMS_ALL是'n',它可能不会显示在/ proc / kallsyms中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。