繁体   English   中英

什么是__ksymtab? 在linux内核中

[英]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
....
  1. T,r,D,d东西是什么意思?
  2. 我可以在内核源代码中找到EXPORT_SYMBOL(...)中的符号,但还有其他前缀为__ksymtab ...或__kstrtab ...这些是什么?
  3. 是否有可能在System.map中有符号但在/ proc / kallsyms中被排除? (假设内核编译正确)
  4. 我有netfilter启用linux内核,但我找不到符号'nf_hooks',但有'__ksymtab_nf_hook'。 有没有办法使用__ksymtab_nf_hook获取nf_hooks的地址?
  5. 我在我的linux源代码EXPORT_SYMBOL(nf_hook)中看到,但是如果我'cat / proc / kallsyms'我就找不到它。 这有什么典型的原因吗?

先感谢您。

  1. 格式类似于nm实用程序输出格式,另请参见此页面

    简单来说,'T'通常表示全局(非静态但不一定是导出的)函数,'t' - 编译单元本地的函数(即静态),'D' - 全局数据,'d' - 编译单元的本地数据。 'R'和'r' - 与'D'/'d'相同,但是对于只读数据。

  2. 这些是导出符号所需的特殊部分中的项目,以便内核模块可以使用这些符号。

    对于每个导出的符号, EXPORT_SYMBOL()至少定义以下内容:

    • __kstrtab_<symbol_name> - 作为字符串的符号名称
    • __ksymtab_<symbol_name> - 包含符号信息的结构:其地址, __kstrtab_<symbol_name>地址等。
    • __kcrctab_<symbol_name> - 符号的控制和(CRC)的地址 - 例如,它用于检查内核或模块是否提供给定内核模块所需的完全相同的符号。 如果模块需要具有给定名称和CRC的符号,并且内核提供具有该名称但具有不同CRC的符号(例如,如果模块是针对不同的内核版本编译的),则模块加载器将拒绝加载该内核模块(除非禁用此检查)。

    有关详细信息,请查看linux / export.hEXPORT_SYMBOL()宏的实现。

  3. 不确定,但到目前为止,当System.map中存在函数(“文本符号”)或变量(“数据符号”)但在/ proc / kallsyms中未显示(如果内核编译正确并且完全启用kallsyms(CONFIG_KALLSYMS = y,CONFIG_KALLSYMS_ALL = y)。 如果CONFIG_KALLSYMS_ALL = n,则只有函数(确切地说,来自* .text部分的符号)将显示在/ proc / kallsyms中。

  4. 取决于您的内核版本。 您可以查看内核的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_hooksnf_hook是不同的实体。

  5. 很难说没有看到代码和/ proc / kallsyms的相关部分。 也许它是#ifdef'ed并且根本没有编译,可能还有别的东西。

    此外, nf_hooks是一个数据项,因此如果CONFIG_KALLSYMS_ALL为'n',它可能不会出现在/ proc / kallsyms中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM