我有點驚訝的是,Linux內核模塊是如此的「脆弱」,需要重新編譯,所以經常重新編譯。在兩臺不同的機器上使用相同的源代碼樹(例如不同版本的gcc)生成不能與內核一起工作的模塊(機器A)(機器B)。什麼引發的linux內核模塊
添加一個虛擬系統調用顯然也需要重新編譯,如果我不想要一個臭名昭著的no symbol version for module_layout
錯誤消息。
更令我驚訝的是,在kernel /中添加一個純粹的.c文件,它不會觸及任何ABI(即獨立函數,不會導出,使用或更新任何內部結構)。
添加在新的.c文件中的虛擬文本字符串,讓所有的模塊不變。
那麼究竟什麼是規則,這裏的原理是什麼?我很專注於x86,32位體系結構,如果這很重要的話)
不是因爲它的答案只是一個猜測。基本上,模塊需要知道導出的函數駐留在內核中的哪個位置。內核是一個可以在重新編譯期間更改的模塊。如果使用完全相同的標誌編譯完全相同的代碼,則會得到相同的模塊,因此導出不會被修改。否則模塊會中斷。在實際編譯之前,文件中的註釋會被刪除,從而不會引起任何更改。 – Aneri 2013-03-12 11:11:44
你的意思是說,對於坐在內核本身的表沒有符號解析? – PypeBros 2013-03-12 12:18:32
不,它是在模塊與內核鏈接期間完成的。沒有運行時解析,就像在DLL中一樣。 – Aneri 2013-03-13 11:31:42