在Linux内核模块makefile中编译特殊文件

时间:2013-08-21 09:04:40

标签: c assembly makefile linux-kernel

我有一个内核模块,我想在其中包含一个特殊文件。该文件是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合作。如果它有所作为。

3 个答案:

答案 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规则。