【问题标题】:trouble compiling a kernel module in linux在linux中编译内核模块的麻烦
【发布时间】:2013-12-18 11:43:29
【问题描述】:

我写了一个简单的 hello world 内核模块。我写了一个make文件如下:

obj -m += hello.o

KDIR: /usr/src/linux-headers-3.2.0-21-generic-pae

all:
     $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

clean:
     rm -rf *.o *.ko *.mod.* *.symvers *.order

然后我使用 make 编译了模块。它工作得很好。

然后,最近我在内核更新到 3.2.0-24 时再次执行了“make”(当然我在 KDIR 中将版本更改为 24)。但是出现了以下错误:

make[1]: Entering directory `/usr/src/linux-headers-3.2.0-24-generic-pae'
make[2]: *** No rule to make target `arch/x86/tools/relocs.c', needed
by `arch/x86/tools/relocs'.  Stop.

我查了一下,发现/arch/x86/tools/有一个relocs的可执行文件,但是没有relocs.c

出了什么问题,我应该如何纠正它才能成功编译模块?

【问题讨论】:

    标签: module linux-kernel kernel-module kernel


    【解决方案1】:

    请分享您编写的 hello-world 模块代码。

    relocs.c 位于内核 src 内的 arch/x86/tools 下。

    由于您的机器上只安装了 linux-headers,您可能看不到 relocs.c 文件。 您必须下载整个内核 src。

    按照以下步骤操作:

    $ sudo apt-get 更新

    $ sudo apt-get install linux-source.

    作为试用版(在下载内核 src 之后),您可以更改 makefile 以将 KDIR 指向整个内核目录,然后构建您的模块。

    【讨论】:

      【解决方案2】:

      make[1]: 进入目录 `/usr/src/linux-headers-3.2.0-32-generic-pae'

      我的问题可能看起来很愚蠢,但我不明白“32”是什么?不是应该是“24”吗?

      【讨论】:

      • @ye9ane...哎呀...我通过 Windows 操作系统访问互联网。所以,为了得到准确的错误词,我在互联网上搜索并复制粘贴。你是对的,它是 24
      • 另一件奇怪的事情要指出,我从你的makefile中了解到你只包含'headers'文件夹来编译你的模块,你确定那个文件夹中也有源文件吗?除非你只使用内核静态,你可能需要源文件来编译你的模块。
      • @ye9ane ...它第一次工作,我在任何地方读到的 makefile 都具有相同的格式。但他们确实说我们正在根据内核源代码树“制作”内核文件(而我不要认为源文件应该在 header 的文件夹中)。所以,如果你认为它应该是别的东西,请写 apt 文件夹
      • 如果第一次运行良好,则不是问题。通过更新内核,您的意思是您将整个源代码树替换为新的吗?...您检查过以前的内核是否包含 reloc.c?
      • @ye9ane...以前的内核在那个位置也有相同的名为 relocs 的可执行文件
      【解决方案3】:

      应该是KDIR:= 而不是KDIR: 而且SUBDIRS= 已被弃用。使用M=$(PWD)

      【讨论】:

      • @itisravi ..我在这里犯了一个错误并写了 KDIR:...在我的 makefile 中它是 KDIR:= ....关于 SUBDIRS,我在这里发布之前已经尝试过这个...它没有工作
      【解决方案4】:

      我认为问题来自 Makefile。 我以前遇到过这个问题,你应该删除尾迹空间并用制表符替换 \t 就可以了。希望对您有所帮助。

      可能是 Makefile 语法。

      【讨论】:

        【解决方案5】:

        我遇到了和你一样的问题。我通过在 Makefile 中替换你的构建命令来解决它。

        make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
        

        【讨论】:

          【解决方案6】:

          在make文件中,把M=$(PWD)改成M=$(shell pwd)...

          像魅力一样工作

          【讨论】:

            猜你喜欢
            • 2011-05-03
            • 2011-06-06
            • 2012-02-22
            • 2014-01-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多