我观察到linux中的许多函数都没有直接调用者。可能它们可能是通过函数指针或其他方式调用的。 我正在静态分析Linux内核代码的内存泄漏。在那里我遇到了许多释放分配对象的函数,但我无法弄清楚该函数的调用者。
e.g。 i915_gem_free_object() 释放 drm_i915_gem_object 结构中的对象 drm_i915_gem_object i915_gem_set_tiling()功能。但浏览代码我无法弄清楚谁在调用 i915_gem_free_object()函数。
有什么方法可以静态检查吗? 附:我正在使用Linux内核3.12
答案 0 :(得分:0)
通过struct drm_driver
调用i915_gem_free_object(),我想你需要弄清楚如何调用驱动程序这个函数:
static struct drm_driver driver = {
...
.gem_free_object = i915_gem_free_object,
...
}
答案 1 :(得分:0)
由于大多数内核都是基于框架(子系统)的,因此使用函数指针导出特定框架(子系统)的功能,而函数指针本质上是动态的。因此,您实际上无法“知道”如何调用函数,但当然您可以始终查看子系统的代码并找出函数指针的调用位置。在你的情况下,它可能是这样的driver->gem_free_object(obj);
,可能会根据情况从不同的地方调用。请参阅drivers/gpu/drm/drm_gem.c
。
您也可以使用dump_stack()
将堆栈跟踪打印到内核日志中并找出调用者。