什么是uu ksymtab?在linux内核中

什么是uu ksymtab?在linux内核中,linux,kernel,symbols,Linux,Kernel,Symbols,当我们输入'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 __k

当我们输入'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的意思是什么
  • 我可以在内核源代码中找到导出符号(…) 但是还有其他前缀为uu ksymtab的。。。或uu kstrtab。。。 这些是什么
  • System.map中可能有符号,但在/proc/kallsyms中排除了吗? (假设内核编译正确)
  • 我启用了netfilter的linux内核,但找不到符号“nf_hooks” 但是有一个“钩”。有什么方法可以得到nf_钩子的地址吗 使用uu ksymtab\u nf\u钩子
  • 我在linux源代码中看到了导出符号(nf_hook),但是如果我 “cat/proc/kallsyms”。这有什么典型的原因吗
  • 先谢谢你

  • 格式与的类似,另请参见

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

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

    对于每个导出的符号,至少以下内容由
    EXPORT\u symbol()
    定义:

    • \uuuu kstrtab\uuu
      -符号的字符串名称
    • \uuuu ksymtab\uu
      -一种包含符号信息的结构:其地址、
      \uuu kstrtab\uu
      的地址等
    • \uuuuukcrctab\uuu
      -符号控制和(CRC)的地址-例如,它用于检查内核或模块是否提供与给定内核模块所需完全相同的符号。如果模块需要具有给定名称和CRC的符号,并且内核提供具有该名称但具有不同CRC的符号(例如,如果模块是为不同内核版本编译的),则模块加载程序将拒绝加载该内核模块(除非禁用此检查)
    有关详细信息,请查看中的
    EXPORT\u SYMBOL()
    宏的实现

  • 不确定,但到目前为止,我还没有遇到过这样的情况:如果内核编译正确并且完全启用了kallsyms(CONFIG_kallsyms=y,CONFIG_kallsyms_ALL=y),System.map中存在函数(“文本符号”)或变量(“数据符号”),但/proc/kallsyms中没有显示。如果CONFIG_KALLSYMS_ALL=n,则在/proc/KALLSYMS中只显示函数(确切地说,是*.text节中的符号)

  • 取决于内核版本。您可以查看内核的
    EXPORT\u SYMBOL()
    定义,并找到变量的类型。在内核3.11中,它是中定义的
    struct kernel\u symbol
    。有了这个结构的定义和地址,我想,您可以得到符号的地址:
    struct kernel\u symbol::value
    。我自己也没试过

    但是请注意,
    \uksymtab\unf\uhook
    用于
    nf\uhook
    ,而不是
    nf\uhook
    。名称必须匹配<代码>nf_钩子和
    nf_钩子
    是不同的实体

  • 如果看不到代码和/proc/kallsyms的相关部分,很难判断。也许它被定义出来了,根本没有被编译,也许还有别的东西

    此外,
    nf\u hooks
    是一个数据项,因此如果CONFIG\u kallsyms\u ALL为“n”,它可能不会显示在/proc/kallsyms中