gpt4 book ai didi

makefile - Eudyptula Challenge 和内核路径

转载 作者:行者123 更新时间:2023-12-04 02:45:32 28 4
gpt4 key购买 nike

我决定采取Eudyptula Challenge .
在我提交了第一个任务之后,它就是构建一个简单的“Hello World!”。模块,我收到了以下答案。

Please read the requirements for the Makefile and allow the module to be built against any kernel source tree on the filesystem, not just those kernels that happened to be installed in /lib/ at some point in time.



要求是:

The Makefile should be able to build the kernel module against the source of the currently-running kernel as well as being able to accept an arbitrary kernel sources directory from an environment variable.



我正在做的是检查环境变量 KERNELRELEASE已设置。如果是我构建模块
$(KERNELRELEASE)/build  

如果不反对
/lib/modules/$(shell uname -r)/build

我不明白为什么这不能满足这项任务的要求。

最佳答案

根据 Eudyptula challenge规则,禁止给你直接解决,所以我会尽量描述答案的元素,所以你可以自己想出解决方案。基本上,我在下面写的所有内容都在 Documentation/kbuild/modules.txt 中进行了描述。文件(尤其是在 section 3.1 - Shared Makefile 中),所以我认为这不会违反某种规则。所以下面只是对提到的文档中描述的内容的解释。KERNELRELEASE多变的
你的错误在于认为 $(KERNELRELEASE)旨在保留内核的路径。什么$(KERNELRELEASE)变量实际上意味着 -- 你可以在 Documentation/kbuild/makefiles.txt 中找到它:

KERNELRELEASE


$(KERNELRELEASE) is a single string such as "2.4.0-pre4", suitablefor constructing installation directory names or showing inversion strings. Some arch Makefiles use it for this purpose.


问题是,你的 Makefile将被执行 2 次:从 您的 make命令和来自 内核 Makefile .和 $(KERNELRELEASE)可能有助于弄清楚:
  • 如果未定义此变量,您的 Makefile从您的 make 运行命令;在这一步你将执行内核的Makefile (使用 -C 参数提供内核目录)。一旦你运行了make对于内核的 Makefile(来自 Makefile 的 内的 ),您的 Makefile将第二次执行(见下一项)。
  • 如果定义了这个变量,你的 Makefile正在从内核的 Makefile 执行(它定义了这个变量并调用了你的Makefile)。在这一步,您可以使用内核构建系统功能,如 obj-m .
  • -C参数
    你真正需要做的是在你的 Makefile 中定义一些自定义变量。它将保存内核目录路径。您可以调用KDIR例如。如您所知,您的内核源代码位于以下路径:/lib/modules/$(shell uname -r)/build .接下来,您可以将此变量提供给 -C执行内核的 Makefile 时的参数(见 man 1 make)。
    接下来,您必须使从 Makefile 外部传递此变量成为可能。 .为此,可以使用 conditional variable assignment operator :
    KDIR ?= /lib/modules/$(shell uname -r)/build
    这样如果你通过 KDIR Makefile 的变量,如下所示:
    $ make KDIR=bla-bla-bla
    KDIR变量将具有您传递的值。否则它将包含默认值,即 /lib/modules/$(shell uname -r)/build .

    关于makefile - Eudyptula Challenge 和内核路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30031161/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com