2011-04-14 53 views
11

如果我有兩個正在靜態鏈接的模塊。一個模塊的module_init函數依賴於已經運行的另一個模塊的module_init函數。有沒有辦法強制一個模塊在另一個之前加載?LINUX:靜態鏈接模塊加載順序

此外,第一個模塊的init函數是否保證在第二個調用之前完成?

最後,如果上面的答案是NO,那麼推薦兩種模塊init調用同步的方式以確保我不會遇到問題?

+0

1)哪種語言/工具鏈,2)你的意思是鏈接到.so或a .a? – Erik 2011-04-14 21:07:28

+1

你的意思是兩個Linux內核模塊?他們如何靜態鏈接?您不能使用「module_init」函數將兩個對象靜態鏈接在一起。 – 2011-04-14 21:54:53

+1

我相信owen有它,因爲'module_init'符號是Linux內核模塊系統的一個組成部分。 @John你應該編輯你的問題並且包括'linux-kernel'標籤 - 'linux'標籤(不幸地)被用戶空間問題支配,甚至通常甚至不是Linux特定的。 – 2011-04-14 22:34:25

回答

0

我假設你要修復的靜態初始化慘敗

看一看

Static Initialization Order Fiasco

+0

他在談論Linux內核模塊;你的解決方案都與C++用戶空間有關。 – 2011-04-15 14:47:36

+0

@Eric:哎呀,感謝您的注意 - 我完全錯過了......我假設奇怪的名字(module_init)在某種異國情調的UNIX風格:) – sehe 2011-04-15 18:07:21

12

有沒有辦法迫使一個模塊之前,其他加載?

答案是出奇的簡單,確保第一個模塊是第一。在Makefile:

obj-y += mod1.o 
obj-y += mod2.o 

是第一模塊的初始化函數保證完成第二個是調用之前?

是的,initcalls(module_init掛鉤)在你的情況下被逐一調用。請參閱init/main.c, do_one_initcall()來電者。

+1

此解決方案不適用於在不同的Makefiles中定義的模塊。 這兩個模塊是否編譯在不同的Makefiles中的情況下的任何解決方案? – talel 2013-01-23 14:22:01

+0

@talel通常有一個頂層的Makefile來定義要下載到目錄中的序列,以及一個拱形的Makefile來定義特定於arch的部分。你可以在這些Makefiles中查找那些init-y,core-y,drivers-y等。這篇文章也許對你有所幫助。 http://www.kernel.org/doc/Documentation/kbuild/makefiles.txt – ywu 2016-04-05 21:23:27