2

我有一个内核模块,我想在其中包含一个特殊文件。该文件是 ASM 文件。没什么特别的,但文件扩展名也是 gcc 无法识别的“.asm”。由于可移植性,我想避免任何重命名。(它也用于另一个非 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。如果它有所作为。

4

3 回答 3

3

用于 kbuild 的标准模块 Makefile 运行 2 次:第一次只是从内核源代码树中重新运行 make,它使用 Makefile 的复杂 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

请注意,我添加了一个明确的输出文件名,以确保结果进入正确的目录。

于 2013-08-21T12:55:51.797 回答
1

您不需要重命名文件,只需复制或链接到它:

asm_test.S: asm_test.asm
    ln -s asm_test.asm asm_test.S
于 2013-08-21T09:38:57.087 回答
0

在内核的 Makefile 规则中,添加到 obj-m 中的每个目标都被假定为单个源内核模块。这就是为什么将 assmebly 对象添加到 obj-m 中可能会失败的原因。内核构建规则将每个文件视为 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 规则。

于 2015-05-15T06:38:43.270 回答