【问题标题】:Special file compile in Linux kernel module makefileLinux内核模块makefile中的特殊文件编译
【发布时间】:2013-08-21 09:04:39
【问题描述】:

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

【问题讨论】:

  • 这也应该适用于内核 Makefile。你遇到了什么错误?
  • 错误消息是:make[3]: *** 没有规则来制作目标 /home/mk/workspace/chardev/asm_test.o', needed by /home/mk/workspace/chardev/chardev.o'。停止。
  • 问题的答案取决于他们为哪个汇编程序编写
  • 该代码是为 VDSP 编写的,并且经过修改也可以被 bfin-elf、bfin-linux-uclibc 和 bfin-uclinux 编译。不过,我看不出这与 makefile 有什么关系。

标签: c assembly makefile linux-kernel


【解决方案1】:

用于 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

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

【讨论】:

  • 正是我想要的。还有文档。非常好。
【解决方案2】:

您无需重命名文件,只需复制或链接即可:

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

【讨论】:

  • 如果您打算将其作为 makefile 规则,那么它就行不通了。但是,如果我手动创建指向 asm 文件的链接(并将链接添加到存储库等),那么它将起作用。不完全是我的梦想,因为它在 FS 中造成了很多混乱,但我想这是一个解决方案。
  • 我猜 Makefile 没有使用正确的当前目录执行……
【解决方案3】:

在内核的 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 规则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    相关资源
    最近更新 更多