2013-08-21 152 views
2

我有一個內核模塊,我想在其中包含一個特殊文件。該文件是一個ASM文件。沒有什麼特別的,但文件擴展名也是「.asm」,它不被gcc識別。由於可移植性,我想避免任何重命名。 (它也可用於其他非GNU編譯器。)Linux內核模塊makefile中的特殊文件編譯

通常我的makefile文件是這個樣子:

obj-m := chardev.o 
chardev-objs := chardev2.o file2.o asm_test.o 

all: 
    make -C $(uClinux_dist_path) M=$$PWD modules 

clean: 
    make -C $(uClinux_dist_path) M=$$PWD clean 

的asm_test是違​​規的一個,因爲它命名爲「asm_test.asm」。 (請將名爲「asm_test.S」工作)。

在我的用戶空間程序中,我可以通過插入下面的規則解決這個問題:

asm_test.o: 
    $(CC) -c -x assembler-with-cpp asm_test.asm 

但是,這並不在它看來內核的makefile工作。

任何人都知道如何在內核makefile中創建特殊的文件規則?



順便說一句,我正在與交叉編譯Blackfin uClinux dist。如果它有所作爲。

+0

這也應該與內核的Makefile一起工作。你得到什麼錯誤? –

+0

錯誤消息是:make [3]:***目標'/home/mk/workspace/chardev/asm_test.o'沒有規則可用,這是'/home/mk/workspace/chardev/chardev.o'需要的。停止。 – Illishar

+0

您的問題的答案取決於編寫它們的彙編程序 – Vineet1982

回答

3

用於kbuild的標準模塊的Makefile有2次運行:第一隻重新運行做出來的內核源代碼樹,它使用複雜的kbuild Makefiles套件來構建您的模塊。第二次調用使用了Makefile中的變量定義,但使用了kbuild世界中的所有規則。

kbuild文檔https://www.kernel.org/doc/Documentation/kbuild/makefiles.txt的第3.10節(特殊規則)解釋瞭如何創建這些額外的規則。 kbuild爲您定義了一些額外的變量,您需要使用它來擴展實際使用的目錄。你的情況:我已經添加了一個明確的輸出文件名,

$(obj)/asm_test.o: 
    $(CC) -c -x assembler-with-cpp -o $(obj)/asm_test.o $(src)/asm_test.asm 

通知,以確保結果正確的目錄中去。

+0

正是我在找的東西。還有文檔。非常好。 – Illishar

1

你並不需要重命名文件,你可以複製或鏈接到它:

asm_test.S: asm_test.asm 
    ln -s asm_test.asm asm_test.S 
+0

如果您打算將其作爲生成文件規則,那麼它不起作用。但是,如果我手動創建鏈接到asm文件(並將鏈接添加到存儲庫等),那麼它會工作。不完全是我夢寐以求的,因爲它在FS中造成了很多混亂,但我想這是一個解決方案。 – Illishar

+0

我猜這個Makefile沒有執行正確的當前目錄... –

0

在內核的Makefile規則中,添加到obj-m中的每個目標被假定爲單個源內核模塊。這就是爲什麼在obj-m中添加assmebly對象可能會失敗。內核構建規則將每個文件視爲C源,然後找不到您的彙編源代碼。

我們必須告訴make系統我們的模塊是多源模塊。在多源模塊中,源可以是C或彙編。

以下是定義包含所有對象的歸檔對象文件並將此歸檔對象文件添加到obj-m中的示例。

obj-m += modulename.o 
modulename-objs += cfile1.o cfile2.o asmfile.o 

all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 
clean: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

這個例子適用於Linux 3.6.6 Makefile規則。