gpt4 book ai didi

linux - 什么是 __ksymtab?在 linux 内核中

转载 作者:IT王子 更新时间:2023-10-29 00:49:46 26 4
gpt4 key购买 nike

当我们 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'。有没有办法获取 nf_hooks 的地址使用 __ksymtab_nf_hook?
  5. 我在我的 Linux 源代码中看到了 EXPORT_SYMBOL(nf_hook) 但如果我找不到它'猫/proc/kallsyms'。这有什么典型的原因吗?

提前致谢。

最佳答案

  1. 格式类似于output of nm utility ,另见 this page .

    简单来说,'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 不同的符号(例如,如果模块是为不同的内核版本编译的),模块加载器将拒绝加载该内核模块(除非禁用此检查)。

    看看 EXPORT_SYMBOL() 的实现linux/export.h 中的宏了解详情。

  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_hooksnf_hook是不同的实体。

  5. 如果不查看/proc/kallsyms 的代码和相关部分,很难判断。可能是 #ifdef 输出,根本没有编译,可能还有其他原因。

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

关于linux - 什么是 __ksymtab?在 linux 内核中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18487032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com