Module LINUX:静态链接模块加载顺序

Module LINUX:静态链接模块加载顺序,module,linux-kernel,Module,Linux Kernel,如果我有两个静态链接的模块。一个模块的module_init函数依赖于另一个模块已经运行的module_init函数。有没有办法强制一个模块先加载另一个模块 另外,第一个模块的init函数是否保证在调用第二个模块之前完成 最后,如果上述问题的答案是否定的,那么建议采用什么方法同步两个模块初始化调用以确保不会遇到问题?我假设您希望修复静态初始化失败 看看 (初始优先级) gcc/ld的-rdynamic链接器标志(这使您可以自由地进行编译时链接,并且仍然使用运行时加载程序(dload))

如果我有两个静态链接的模块。一个模块的module_init函数依赖于另一个模块已经运行的module_init函数。有没有办法强制一个模块先加载另一个模块

另外,第一个模块的init函数是否保证在调用第二个模块之前完成


最后,如果上述问题的答案是否定的,那么建议采用什么方法同步两个模块初始化调用以确保不会遇到问题?

我假设您希望修复静态初始化失败

看看

  • 初始优先级
  • gcc/ld的-rdynamic链接器标志(这使您可以自由地进行编译时链接,并且仍然使用运行时加载程序(dload))

有没有办法强制一个模块先加载另一个模块

答案非常简单,请确保第一个模块位于Makefile中的第一个模块:

obj-y += mod1.o
obj-y += mod2.o
第一个模块的init函数是否保证在调用第二个模块之前完成

是的,在您的案例中,initcalls(
module_init
hook)会逐个调用。参见
init/main.c

do\u one\u initcall()
调用方。

1)哪种语言/工具链,2)您是指链接到.so还是.a?您是指两个Linux内核模块?它们是如何静态链接的?你不能用一个“module_init”函数将两个对象静态链接在一起。我相信owen拥有它,因为
module_init
符号是Linux内核模块系统不可分割的一部分@John你应该编辑你的问题,并包括
linux内核
标记-不幸的是,
linux
标记主要是用户空间问题,通常甚至不是特定于linux的;你的解决方案都与C++用户空间有关。埃里克:OOP,谢谢你注意到我完全错过了…我采用了奇怪的名称(module_init),其中在某种异国风格的UNIX上:)此解决方案不适用于在不同的makefile中定义的模块。对于两个模块在不同的Makefile中编译的情况,有什么解决方案吗?@talel通常有一个top Makefile来定义进入目录的顺序,还有一个arch Makefile来定义特定于arch的部分。您可以在这些makefile中查找init-y、core-y、drivers-y等。此外,本文可能对您有所帮助。