我们需要访问net/ipv4/af_inet.c中的内核全局变量,这些变量不是从可加载的内核模块显式导出的。我们目前使用的是2.6.18内核。
kallsyms_lookup_name似乎不再可用(未导出)
__symbol_get返回NULL (在进一步读取时,symbol_get/__ symbol _get查看内核和现有模块的符号表,该符号表仅包含导出的符号,并确保从中导出符号的模块实际已加载)
有没有什么办法可以访问不是从内核模块导出的符号?
经过大量阅读和查看人们提供的答案,似乎很难在许多内核版本中找到一种方法,因为kAPI会随着时间的推移发生重大变化。
发布于 2012-03-31 12:57:11
你可以使用你之前提到的方法,通过从/proc/kallsyms获取它,或者只使用System.map中给出的地址(这是一样的),它看起来可能有些老土,但这就是我以前看到的方法(我从来没有真正地自己做过)。或者你可以构建你自己的定制内核,在那里你可以在你想导出的任何东西上执行EXPORT_SYMBOL,但是这不像是可移植的。
发布于 2012-04-01 16:54:54
如果性能不是一个大问题,您可以使用kallsyms_on_each_symbol()
遍历整个符号列表(由GPL'd模块的内核导出),并检查名称以获得所需的名称。我不建议这样做,除非别无选择。
如果你想走这条路,这是我们其中一个项目的an example。查看kallsyms_on_each_symbol()
的用法以及symbol_walk_callback()
的代码,其他部分与此问题无关。
https://stackoverflow.com/questions/9951516
复制相似问题