针对文件系统上的任何内核源代码树编译树外核心模块

时间:2014-03-13 03:01:30

标签: linux build makefile kernel kernel-module

我正在尝试针对文件系统上的任何源树编译模块,但是我遇到了Makefile的问题。这是我对内核指定的原始Makefile:

obj-m += new-mod.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

这个Makefile可以正确编译,但目标是让它针对任何源树进行编译。我试过了:

obj-m += new-mod.o

我认为“全部:”是假设但我得到错误:

make: *** No targets.  Stop.

我还补充说:

all: 

到Makefile,除了错误消息之外没有区别:

make: Nothing to be done for `all'

我尝试了很多文档,但没有运气。我非常感谢任何帮助。

2 个答案:

答案 0 :(得分:9)

goal is to have it compile against any source tree

你可以提供compiled source-code path

只需替换make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

用这个

make -C <path-to-compiled-src-code> M=$(PWD) modules

make -C /home/vinay/linux-3.9 M=$(PWD) modules

尝试下面的makefile

Makefile -

# if KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq (${KERNELRELEASE},)
obj-m := new-mod.o
# Otherwise we were called directly from the command line.
# Invoke the kernel build system.
  else
    KERNEL_SOURCE := /usr/src/linux
    PWD := $(shell pwd)
default:
      ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules

clean:
      ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean
endif

在上面,您可以将KERNEL_SOURCE := /usr/src/linux - &gt;更改为.--&gt;你的sr-code KERNEL_SOURCE := <path to compiled-src-code>

有关详细信息,请参阅以下内容

while building kernel modules why do we need /lib/modules?

A simple program on linux device driver

How to make a built-in device driver in linux

答案 1 :(得分:0)

针对您的自定义内核源代码(不是已安装的内核源代码)构建, 您可以使用以下步骤。

1.从 kernel.org (tar) 下载内核

2.提取

3.make x86_64_defconfig

4.做好准备

5.make modules_prepare

现在您必须将 Makefile 更改为指向您下载并解压缩的内核源代码。 Vinay Answer 的示例中提到的类似内容。

请记住,您不能插入此模块,因为运行的内核和构建的模块是针对不同的内核的。