什么是__ksymtab?在linux内核中

dae*_*hee 6 linux kernel symbols

当我们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
....
Run Code Online (Sandbox Code Playgroud)
  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'我就找不到它.这有什么典型的原因吗?

先感谢您.

Eug*_*ene 7

  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中,它struct kernel_symbollinux/export.h中定义.有了该结构的定义及其地址,我想,你可以得到符号的地址:struct kernel_symbol::value.虽然我自己没试过.

    但请注意,这__ksymtab_nf_hook是为了nf_hook但不是为了nf_hooks.名称必须匹配.nf_hooks并且nf_hook是不同的实体.

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

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