我有一个内核模块,我想在其中包含一个特殊文件。该文件是ASM文件。没什么特别的,但文件扩展名也是“.asm”,gcc无法识别。我想避免因可移植性而重命名。 (它也用于另一个非GNU编译器。)
通常我的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 :(得分:3)
kbuild的标准模块Makefile运行2次传递:第一次只是重新运行内核源代码树,它使用Makefiles的复杂kbuild套件来构建你的模块。第二次调用使用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
请注意,我添加了一个显式输出文件名,以确保结果位于正确的目录中。
答案 1 :(得分:1)
您不需要重命名该文件,您只需复制或链接到该文件:
asm_test.S: asm_test.asm
ln -s asm_test.asm asm_test.S
答案 2 :(得分:0)
在kernel的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规则。