访问不通过EXPORT_SYMBOL导出的Linux内核符号*

我们需要访问net / ipv4 / af_inet.c中的内核全局variables,这些内核variables不能从可加载的内核模块中显式导出。 目前我们正在使用2.6.18内核。

kallsyms_lookup_name似乎不再可用(未导出)

__symbol_get返回NULL(在进一步阅读之后,symbol_get / __ symbol_get通过内核和现有模块的符号表来查看只包含导出符号的符号表,并且确保从中导出符号的模块实际上被加载)

反正有没有从内核模块中导出的符号?

在做了大量的阅读和查看人们提供的答案之后,似乎很难在许多内核版本中find一种方法,因为kAPI会随着时间显着变化。

你可以使用前面提到的方法从/ proc / kallsyms获取它,或者只是使用System.map中给出的地址(这是同样的事情),它看起来可能有点骇人听闻,但这是我以前看过的(从来没有真的必须自己做)。 无论是这个,还是你可以建立你自己的定制内核,在你想要导出的任何东西上你实际上做了EXPORT_SYMBOL,但这不是可移植的。

如果性能不是一个大问题,那么可以使用kallsyms_on_each_symbol() (由内核为GPL模块导出kallsyms_on_each_symbol()遍历整个符号列表,并检查名称以获取所需的符号。 除非没有别的选择,否则我不会推荐这样做。

如果你想这样做,这是我们其中一个项目的例子 。 请参阅kallsyms_on_each_symbol()的使用以及kallsyms_on_each_symbol()的代码,其他部分与此问题无关。