Linux 内核模块 Makefile 不能包含相对路径

2024-04-19

我正在尝试构建 Linux 内核模块:

KBUILD_EXTRA_SYMBOLS := ../../Module.symvers
KBUILD_EXTRA_SYMBOLS := ../../dir0/Module.symvers
KDIR = ../../../../kernel/linux-4.9

INCLUDES = \
     -I../dir1/dir2/dir3  \
     -I../dir1/dir2 \
     -I../dir1

EXTRA_CFLAGS += $(INCLUDES)

PWD = $(shell pwd)

TARGET = some_module

obj-m := $(TARGET).o

all: default clean
default:
     make $(INCLUDES) -C $(KDIR) M=$(PWD) modules
clean:
     @rm -f *.o .*.cmd .*.flags *.mod.c *.order
     @rm -f .*.*.cmd *.symvers *~ *.*~ TODO.*
     @rm -fR .tmp*
     @rm -rf .tmp_versions
disclean: clean
     @rm -f *.ko

但它无法在相对路径中找到文件,例如喜欢fatal error: some_header.h: No such file or directory。当我使用绝对路径时,它工作得很好,但我需要从该项目中的当前目录进行相对寻址。怎么了?
抱歉,如果很明显的话。


Linux内核使用Kbuild来制作模块。该框架与普通的 makefile 约定不同,因此虽然它们都由 GNU make 解释,但需要注意其中的差异。使用 Kbuild 的 Makefile 文档可以在这里找到 https://www.mjmwired.net/kernel/Documentation/kbuild/makefiles.txt and 构建外部内核模块的文档可以在这里找到 https://www.kernel.org/doc/Documentation/kbuild/modules.txt.

下面引用了文档中与您的问题相关的一些要点。

From makefiles.txt:

--- 3.10 特别规则

当 kbuild 基础设施不提供所需的支持时,将使用特殊规则。一个典型的例子是头文件 在构建过程中生成。另一个例子是 需要特殊规则来准备的特定于体系结构的 Makefile 启动映像等。特殊规则按照正常的 Make 规则编写。 Kbuild 并不是在 Makefile 所在的目录中执行,所以所有 特殊规则应提供先决条件文件的相对路径 和目标文件。定义特殊规则时使用两个变量:

~$(src)~

$(src)是指向Makefile所在目录的相对路径。总是使用$(src)当引用位于src tree.

~$(obj)~

$(obj)是一个相对路径,指向保存目标的目录。总是使用$(obj)当引用生成的文件时。

From modules.txt:

--- 4.3 几个子目录

kbuild 可以处理分布在多个目录中的文件。 考虑以下示例:

  .   
  |__ src     
  |   |__ complex_main.c  
  |   |__ hal     
  |       |__ hardwareif.c
  |       |__ include     
  |           |__ hardwareif.h    
  |__ include
      |__ complex.h

为了构建模块complex.ko,我们需要以下kbuild 文件:

   --> filename: Kbuild
   obj-m := complex.o
   complex-y := src/complex_main.o
   complex-y += src/hal/hardwareif.o

   ccflags-y := -I$(src)/include
   ccflags-y += -I$(src)/src/hal/include

正如你所看到的,kbuild 知道如何处理位于 其他目录。技巧是指定相对于的目录 kbuild 文件的位置。话虽如此,不推荐这样做 实践。

对于头文件,必须明确告诉 kbuild 在哪里查找。 当kbuild执行时,当前目录始终是根目录 内核树(“-C”的参数),因此绝对路径是 需要。$(src)通过指向提供绝对路径 当前正在执行的kbuild文件所在的目录。

因此,您的 Makefile 应如下所示:

KBUILD_EXTRA_SYMBOLS := $(src)/../../Module.symvers
KBUILD_EXTRA_SYMBOLS := $(src)/../../dir0/Module.symvers
KDIR = $(src)/../../../../kernel/linux-4.9

INCLUDES = \
     -I$(src)/../dir1/dir2/dir3  \
     -I$(src)/../dir1/dir2 \
     -I$(src)/../dir1

EXTRA_CFLAGS += $(INCLUDES)

PWD = $(shell pwd)

TARGET = some_module

obj-m := $(TARGET).o

all: default clean
default:
     make $(INCLUDES) -C $(KDIR) M=$(PWD) modules
clean:
     @rm -f *.o .*.cmd .*.flags *.mod.c *.order
     @rm -f .*.*.cmd *.symvers *~ *.*~ TODO.*
     @rm -fR .tmp*
     @rm -rf .tmp_versions
disclean: clean
     @rm -f *.ko
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 内核模块 Makefile 不能包含相对路径 的相关文章

  • return 语句是否为按值返回的函数创建临时对象?

    当我学习 C 11 右值引用和移动语义时 我开始对函数如何返回值来初始化变量感到困惑 看下面的例子 Widget makeWidget Widget w return w Widget w1 makeWidget 这里我假设没有 RVO 即
  • 是否有一种快速替代方法可以从 XNA 中的位图对象创建 Texture2D?

    我环顾四周 发现从位图创建Texture2D的唯一方法是 using MemoryStream s new MemoryStream bmp Save s System Drawing Imaging ImageFormat Png s S
  • F1 2019 UDP解码

    我目前正在为 F1 方向盘开发自己的显示器 F1 2019 由codemasters提供 通过UDP发送数据 该数据存储在字节数组中 我在解码返回的数组时遇到一些问题 问题是我得到了很多信息 但我不知道如何处理它们 我将向您介绍我所尝试过的
  • 是否已经有一些基于 std::vector 的 set/map 实现?

    对于小型集合或地图 通常使用排序向量而不是基于树的向量要快得多set map 特别是对于 5 10 个元素的情况 LLVM 有一些类本着这种精神 http llvm org docs ProgrammersManual html ds se
  • 正确别名向量

    我无法在其他地方找到答案 所以我想我只需要问这个 我正在尝试获取向量 其中存储 int 指针 的别名 如下所示 void conversion Engine ENGINES The Engine class has a vector of
  • 为什么 C++11/Boost `unordered_map` 在擦除时不重新散列?

    我想知道为什么 C 11 和 Boost 的 hashmap 在通过迭代擦除元素时不会调整大小 即使这在技术上不是内存泄漏 我认为这可能是应用程序中的一个严重问题 这对我来说是一个隐藏的问题 很难追踪它 并且它实际上可能会影响许多应用程序
  • 将 CryptoStream 解密为 MemoryStream

    我编写了一个过程 其中文件被加密并上传到 Azure 然后必须解密下载过程 这会失败并出现 填充无效且无法删除 错误 或 要解密的数据长度为无效的 错误 我在网上尝试了很多解决方案 包括C 使用 RijndaelManaged 和 Cryp
  • 如何设置属性选择器的值 Expression>

    我需要使用模式工厂的想法将 Person 类实体中的实体属性 Address 与 FactoryEntities 类中的表达式 linq 相关联 看看这就是我所拥有的并且我想要做的 Address address new Address a
  • 在 WinForms 中显示输入对话框

    我想在我的 WinForm 应用程序中显示输入模式 我浏览过网络 但没有找到执行此操作的良好模式 我知道我必须创建另一个表单 并使用 ShowDialog 方法 你是对的 请注意 模式对话框在关闭时不会自动处理 与非模式对话框不同 因此您需
  • boost::unordered_map 是...有序的吗?

    我有一个 boost unordered map 但它看起来是有序的 给我一种压倒性的 你做错了 的感觉 为什么输出是这样的 我希望底层的哈希算法能够随机化这个顺序 include
  • 有没有一种方法可以在不测试整个应用程序的情况下对类库(通用 Windows)进行单元测试?

    我需要进行单元测试Class Library Universal Windows 但是从 添加新项目 窗口中 我只看到了这一点 该项目使用应用程序容器运行所有测试 它始终打开一个应用程序 由于我不需要所有这些开销 我想知道是否有一种方法可以
  • C++ 中的静态虚函数

    我有一个基类和一个派生类 我想更改基函数 同时保持它们静态 因为它们应该作为静态传递给其他函数 我怎样才能做到这一点 ATL 框架通过将基类设为模板 然后让派生类将其类类型作为模板参数传递 从而绕过了无虚拟静态的限制 然后 基类可以在需要时
  • 验证仅适用于数组的第一项

    给定这个模型代码 Required Display Name Name public string Name get set 以下查看代码有效 Html LabelFor model gt model Name Html TextBoxFo
  • 如何在 .NET 6.0 中使用最小 Api 配置 Newtonsoft Json

    I have net6 0具有最少 api 的项目 我想使用NetwtonsoftJson而不是内置的System Text Json用于序列化和反序列化的库 目前我有这个配置JsonOptions并且按预期工作 builder Servi
  • 拦截C# HttpClient GetAsync

    我有一个 Web 项目 C MVC5 但没有 WebAPI 和一个简单的 HTTP REST 客户端 该客户端调用外部 REST 服务并获取 accessToken 等 我想检查所有 Get PostAsync 调用对 statusCode
  • 是否可以允许jenkins访问只有root或某些特定程序可以访问的文件?

    我基本上想做的是允许 jenkins 访问我的 android sdk linux 文件夹和所有子目录 我的老板不想自己更改文件夹的权限 我应该在构建过程中这样做 我见过一些在构建过程中在执行 shell 中运行一些命令的示例 是否可以在该
  • 获取当前时间(以小时和分钟为单位)

    我正在尝试从系统收集信息 并且需要获取当前时间 以小时和分钟为单位 目前我有 date awk print 4 输出如下 16 18 54 怎样才能把秒数去掉呢 提供格式字符串 date H M Running man date将给出所有格
  • LINQ 中的左外连接

    下面的代码不断给我一个错误消息 你调用的对象是空的 var partsWithDefaults from partsList1 in p join partsList2 in d on new PartNo partsList1 PartN
  • 为什么我能够使用无效的类指针进行函数调用

    在下面的代码片段中 虽然指针未初始化 但调用仍然成功 temp ptr ptr gt func2 是C 语言特性的问题 还是VC 6编译器的作弊 class temp public temp a 9 int func1 return a b
  • 如何为单个函数设置 ICC 属性“fp-model precision”,以防止关联优化?

    我正在实施卡汉求和 http en wikipedia org wiki Kahan summation algorithm 在支持 gcc47 gcc48 clang33 icc13 和 icc14 编译的项目中 作为该算法的一部分 我想

随机推荐

  • 本地主机上的服务器 App Engine Standard 无法启动

    从 eclipse 中 我创建了一个 Google App Engine 标准项目 并尝试在本地 App Engine 上运行它 它没有启动并抛出以下错误 java lang NullPointerException at java bas
  • 根据所选数字指定数字范围

    当用户选择数字 1000243 时 我想要另一个选项来从该输入的数字中选择 200 个数字 所以它会是 User Input Number Here
  • 需要用jquery将h3和div包装在包装器div中

    我有以下 HTML div class accordion h3 My title h3 div My content div h3 My title h3 div My content div h3 My title h3 div My
  • 如何从 Ionic 选项卡打开 Ionic 模态

    我有一个用例 我想通过单击 Ion 选项卡来打开 Ionic Modal 我们的应用程序有 4 个固定的ion tabs 其中一个选项卡当前转到评论表单 但它更适合作为模式 因此用户可以快速完成表单并返回到他们正在做的事情 模态框通常附加到
  • Python CSV 编写器截断长数字

    我目前正在开发一个项目 该项目需要生成一个包含大量信息的 CSV 文件作为最终输出 目前 我将所有数据存储在一个非常大的列表中 然后使用 CSV 包将其写入 CSV 文件 我的问题是其中一个数据字段包含一个非常长的数字 存储为字符串 但第
  • Swift 栈和堆的理解

    我想快速了解堆栈和堆中存储的内容 我有一个粗略的估计 您打印的所有内容和内存地址都不是值 它们存储在堆栈中 而作为值打印出来的内容则在堆上 基本上根据值和引用类型 我完全错了吗 或者 您可以提供堆栈 堆的可视化表示吗 As Juul htt
  • 如何在 Firebase 实时数据库中保存本地数据?

    我对 Kotlin 和编程非常陌生 目前正在制作包含事件的日历 当我想将这些事件连接到 firebase 时 我的问题就出现了 我正在使用在 git 中找到的一个示例 https github com kizitonwose Calenda
  • 使用鼠标滚动 DataGridView

    因此 我们都熟悉单击并按住鼠标按钮 然后将鼠标移动到网格边缘 列 行滚动并且选择范围增加的功能 我有一个基于 DataGridView 的控件 由于性能问题 我必须关闭 MultiSelect 并自行处理选择过程 现在单击 按住滚动功能也被
  • 在matlab中对矩阵元素求和的有效(最快)方法

    让我们有矩阵A say A magic 100 我见过两种计算矩阵所有元素之和的方法A sumOfA sum sum A Or sumOfA sum A 其中一个比其他更快 或更好的练习 吗 如果有的话是哪一个 或者它们都同样快 看来你无法
  • 使用 PHPMailer 附加文​​件

    我有一个 HTML 表单 可以选择上传文件 然后 我想将该文件作为附件与其余表单数据一起发送到电子邮件地址 我正在使用 PHP Mailer 我获取要发送的表单数据 例如姓名 电话号码等 我无法将图像与它一起发送 我已经提供了迄今为止的代码
  • 如何在 Android 应用程序中播放和停止 mp3 文件

    我在 eclipse 中创建了一个应用程序来播放和停止 mp3 文件 一切都很好 除了当我播放音频文件并停止它并且我想重播它时 播放 btn 不起作用 我想知道是否有人可以帮助我 提前致谢 代码如下 package ir polyglotc
  • 更改 NUnit 测试的名称

    我希望我的单元测试基于NUnit在 Visual Studio 测试资源管理器中命名的框架更易于理解 例如 而不是有Test Case 1 or TestCase1我最好有类似的东西Test Case 1 Category First Ca
  • Android Room:应用与嵌入对象相关的多列

    在我的 Android 应用程序中 我使用 Room 进行数据存储 我目前面临的问题是 我需要在嵌入对象的 Relation 中放入 2 列 因为关系依赖于 2 列 结构见下图 Entity tableName damages public
  • 从通用平面获取轴对齐坐标

    标题可能是错误的 因为我不知道足够的数学知识来实际用一个小句子描述我的问题 我有一个 3D 矢量闭环 我将其称为 3D 多边形 我需要对其执行仅 2D 操作 这将返回一个 不同的 2D 点集 我需要将这些新的 2D 点转换回 3D 我目前的
  • 如何将下拉菜单置于父选项卡下居中?

    我有以下 CSS HTML 设置http jsfiddle net UDAUY http jsfiddle net UDAUY 如何对齐下拉菜单字段使其在父选项卡下居中 如下所示 MENU 1 MENU 2 MENU 3 MENU 4 Fi
  • 如何让 ko.compated 处理对象内的可观察值

    我有一个相当简单的视图模型来保存数据数组并获取一个我想用来过滤数据的字符串 我有一些非常简单的标记来渲染它 如下所示 section class task list ul li li ul section
  • 具有备用序列的列

    我想创建一个 user widgets 表 该表由 user id 和 user widget id 主键 其中 user widget id 的工作方式类似于序列号 除了每个用户从 1 个开始 对此有通用或实用的解决方案吗 我正在使用 P
  • networkx 通过属性搜索节点

    我寻找更优雅的方法来从以下属性之一搜索有向图中的节点 g nx DiGraph g add nodes from 1 dict d 0 a 7 2 dict d 0 a 6 g add nodes from 11 dict d 1 a 4
  • Android Studio - 非法字符 8204 错误

    由于某种原因 在重建我的项目后 我收到非法字符错误 但我的代码中没有任何内容以红色下划线显示 有人可以告诉我出了什么问题以及如何解决吗 Error illegal character 8204 WCBankActivity java imp
  • Linux 内核模块 Makefile 不能包含相对路径

    我正在尝试构建 Linux 内核模块 KBUILD EXTRA SYMBOLS Module symvers KBUILD EXTRA SYMBOLS dir0 Module symvers KDIR kernel linux 4 9 IN