根据您的具体需求,可能会有不同的解决方案。我假设您至少控制了静态链接的代码,并且可以在需要时对其进行更改。
方式一
如果静态链接的代码可以导出一个函数(类似于set_my_good_var_ptr()
),则动态加载的模块可以调用该函数以将所需变量的地址传递给前者。
或者,也许,静态链接的代码可以提供一个接口,动态加载的模块可以使用该接口来提供 get/set 回调,从而允许访问变量。
如果这一切都不适合您的项目(例如,如果您无法更改动态加载模块的代码),以下可能会有所帮助,尽管我认为这不是一个好习惯。
方式二
注意提供要加载的变量的内核模块(例如,参见register_module_notifier()函数)。
请注意,通知函数将在模块加载后但在调用其初始化函数之前调用。
调用通知函数时,您可以使用kallsyms_lookup_name()或kallsyms_on_each_symbol()来获取所需变量的地址。
这需要在内核配置中进行设置CONFIG_KALLSYMS
。CONFIG_KALLSYMS_ALL
如果没有设置这些选项中的一个或两个,它仍然是可行的,但有点困难(例如,在模块的二进制文件中找到符号,获取符号所属的 ELF 部分的地址和其中的偏移量并传递所有这到您的代码等)
找到变量的地址后,静态链接的代码必须以某种方式确定何时可以实际使用该变量(何时初始化等)。如何做到这一点取决于所涉及的模块实际上做了什么,我对此没有任何建议。