- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以我相信内核模块代码可以使用静态编译内核代码中的任何内容,只要它们是公开的。但是如果静态编译的内核代码想在模块代码中使用一个全局变量,这可能吗?
例如,我们在一个内核模块代码(任何可加载的内核模块)中有一个名为“int a”的全局变量。在静态编译的内核代码中(例如,在/linux/sched/fair.c 中),我想访问该变量。
这将导致编译错误,因为模块是最后编译的(在编译静态编译的内核代码之后)并且没有在开始时加载。
如果我先在静态编译的头文件中声明这个变量会怎样?但在加载模块之前,该变量将毫无意义。
谢谢,
最佳答案
根据您的具体需要,可以采用不同的解决方案。我假设您至少控制了静态链接代码,并且可以根据需要更改它。
方式一
如果静态链接代码可以导出函数(类似于 set_my_good_var_ptr()
),动态加载模块可以调用该函数以将所需变量的地址传递给前者。
或者,也许静态链接的代码可以提供一个接口(interface),动态加载的模块可以使用该接口(interface)来提供 get/set 回调,从而允许访问变量。
如果所有这些都不适合您的项目(例如,如果您不能更改动态加载模块的代码),以下可能会有所帮助,尽管我不认为这是一个好的做法。
方式二
注意提供要加载的变量的内核模块(例如,参见 register_module_notifier() 函数)。
请注意,通知函数将在模块加载之后但在其初始化函数被调用之前被调用。
调用通知函数时,可以使用kallsyms_lookup_name()或 kallsyms_on_each_symbol()获取所需变量的地址。
这需要在内核配置中设置 CONFIG_KALLSYMS
和 CONFIG_KALLSYMS_ALL
。如果这些选项中的一个或两个都没有设置,它仍然可行但有点困难(例如在模块的二进制文件中找到符号,获取符号所属的 ELF 部分的地址和其中的偏移量并传递所有这到你的代码等)
找到变量的地址后,静态链接代码必须以某种方式确定何时可以实际使用该变量(何时初始化等)。如何做到这一点取决于所涉及的模块实际做什么,对此我无法给出任何建议。
关于c - 如果静态编译的代码想要访问内核模块代码中的一个变量,模块是否必须静态编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12497016/
使用登录后,我想吐出用户名。 但是,当我尝试单击登录按钮时, 它给了我力量。 我看着logcat,但是什么也没显示。 这种编码是在说。 它将根据我在登录屏幕中输入的名称来烘烤用户名。 不会有任何密码。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我是一名优秀的程序员,十分优秀!