2014-03-03 117 views
3

我想我的內核模塊與外部靜態庫鏈接,像這樣:鏈接內核模塊的靜態庫

obj-m += my_prog.o 
my_prog-objs := some/path/lib.a 
# all the standard targets... 

對於一些reasone,上面的Makefile不編譯my_prog.c在全部,並且生成的模塊不包含其代碼。當然,如果我刪除my_prog-objs行,則編譯my_prog.c

這種方法在Makefile中出現了什麼問題?

回答

1

您正在覆蓋默認的my_prog-objs,這只是my_prog.o。相反,與庫替換的內容,將庫添加到默認:

my_prog-objs := my_prog.o some/path/lib.a 

希望你不是想對一個普通的用戶態庫......不會在內核空間在所有的工作聯繫起來。

+0

然後它抱怨'my_prog.o'的循環依賴並且無論如何跳過它。 –

1

您必須創建一個合成名稱以及源文件和它的對象名稱。您不能直接使用my_prog.o,因爲有來自源代碼的規則。下面是一個示例,

obj-m += full.o 
full-src := my_prog.c 
full-objs := $(full-src:.c=.o) lib.o # yes, make it an object. 

只有某些特殊目錄支持庫。你的對象應該被命名爲lib.o_shipped並放置在同一個目錄中。參見:item 11 under TODOnote。因此,您需要將外部庫作爲的本地版本提供給本地版本。你需要兩個目標文件;一個是你編譯的'C'代碼/驅動程序,另一個是與庫連接在一起。

說明:我很face;;它有一個TODO來記錄這個功能。

+0

顯然,你只需要在'lib.o_shipped'中需要的對象。你可以從'lib.a'中創建它,方法是用'ar'提取所有對象,然後用'ld -r'做一個增量鏈接。至少這就是我認爲我所做的......如果有人有更好的方法,我在聽:) –

2

當您創建my_prog-objs列表時,您告訴kbuild僅使用該列表中的對象文件。 kbuild將不再編譯my_prog.c,並且包含my_prog.omy_prog-objs會導致循環依賴。相反,您需要創建一個唯一的obj-m,並在其objs列表中包含my_prog.o/path/lib.a。例如:

obj-m += foo.o 
foo-objs += my_prog.o /path/lib.a 

花了我大約2個小時來弄清楚爲什麼我的模塊什麼都不做!