kbuild 实际上是如何工作的?

2024-02-06

当我开发 Linux 驱动程序时,我读过如何通过此编写 linux kbuild makefiledocument https://www.kernel.org/doc/Documentation/kbuild/makefiles.txt

我知道 kbuild 系统使用 makefile 变量(例如 obj-y obj-m)来确定要构建的内容以及如何构建。

但我感到困惑的是 kbuild 系统在哪里真正执行构建过程。总之,如果我有obj-m = a.o,那么kbuild系统解析到哪里obj-m并执行gcc a.c ?


Kbuild 的 Makefile 不是最容易阅读的,但这里有一个高级的解理(使用 4.0-rc3 内核):

  1. 顶层 Makefile 的作用是

    include $(srctree)/scripts/Kbuild.include
    

    , where $(srctree)是顶级内核目录。

  2. Kbuild.include定义了各种常见的东西和助手。其中有build:

    ###
    # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
    # Usage:
    # $(Q)$(MAKE) $(build)=dir
    build := -f $(srctree)/scripts/Makefile.build obj
    

    build与类似命令一起使用$(MAKE) $(build)=dir执行目录的构建dir。它利用scripts/Makefile.build.

  3. 回到顶层Makefile,有以下内容:

    $(vmlinux-dirs): prepare scripts
            $(Q)$(MAKE) $(build)=$@
    

    vmlinux-dirs包含要构建的子目录列表(init, usr, kernel, ETC。)。$(Q)$(MAKE) $(build)=<subdirectory>将为每个子目录运行。

    上面的规则编译内核映像和模块的目标文件。在顶层 Makefile 的更下方,还有一些额外的特定于模块的内容:

    ifdef CONFIG_MODULES
    ...
    modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) modules.builtin
            # Do additional module-specific stuff using
            # scripts/Makefile.modpost among other things
            # (my comment).
            ...
    ...
    endif # CONFIG_MODULES
    
  4. 调查scripts/Makefile.build(使用的 Makefile$(build))现在,它首先初始化obj-*列表和各种其他列表:

    # Init all relevant variables used in kbuild files so
    # 1) they have correct type
    # 2) they do not inherit any value from the environment
    obj-y :=
    obj-m :=
    lib-y :=
    lib-m :=
    

    再往下一点,它加载到 Kbuild 文件中,其中obj-y, obj-m等,设置:

    include $(kbuild-file)
    

    再往下是默认规则,其中有$(obj-y) and $(obj-m)列出先决条件:

    __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
             $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \
             $(subdir-ym) $(always)
            @:
    

    The $(obj-y)前提条件来自于$(builtin-target),其定义如下:

    builtin-target := $(obj)/built-in.o
    ...
    $(builtin-target): $(obj-y) FORCE
            $(call if_changed,link_o_target)
    

    实际的构建似乎是按照以下规则进行的:

    # Built-in and composite module parts
    $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
            $(call cmd,force_checksrc)
            $(call if_changed_rule,cc_o_c)
    

    if_changed_rule来自Kbuild.include。该规则最终运行以下命令Makefile.build:

    define rule_cc_o_c
            $(call echo-cmd,checksrc) $(cmd_checksrc)                         \
            $(call echo-cmd,cc_o_c) $(cmd_cc_o_c);                            \
            ...
    endef
    

    $(cmd_cc_o_c)似乎是实际的编译命令。通常的定义(有两种可能Makefile.build,AFAICS)似乎如下:

    cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
    

    除非明确设置使用例如make CC=clang, CC默认为gcc,如顶级 Makefile 中所示:

    ifneq ($(CC),)
    ifeq ($(shell $(CC) -v 2>&1 | grep -c "clang version"), 1)
    COMPILER := clang
    else
    COMPILER := gcc
    endif
    export COMPILER
    endif
    

The way I untangled this was by doing a CTRL-C during a kernel build and seeing where make reported the error. Another handy make debugging technique is to use $(warning $(variable)) to print the value of variable.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

kbuild 实际上是如何工作的? 的相关文章

  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 有谁知道在哪里定义硬件、版本和序列号。 /proc/cpuinfo 的字段?

    我想确保我的 proc cpuinfo 是准确的 目前它输出 Hardware am335xevm Revision 0000 Serial 0000000000000000 我可以在代码中的哪里更改它以给出实际值 这取决于 Linux 的
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • 无法解析类型“System.Net.Http.HttpClient”的服务

    我创建了一个ViewComponent调用一个类REST API使用HttpClient 这是代码 public class ProductsViewComponent ViewComponent private readonly Http
  • C 中的默认参数和参数提升

    我当时正在研究默认参数提升 并陷入了困境 在 C 2011 ISO IEC 9899 2011 中 相关部分似乎是 6 5 2 2 函数调用 6 如果表示被调用的表达式 函数具有不包含原型的类型 即整数 对每个参数执行升级 并且具有以下参数
  • 从 ASP.NET 中的 URL 获取数据

    我是 ASP NET 新手 我想从 ASP NET 上的 url 获取数据 需要将数据存储到字符串中 如果假设这是我的 URL 那么我想以字符串形式获取此 URL 数据 http www islamicfinder org prayer s
  • 将 XPath count() 与 contains() 结合使用

    我正在使用以下 次优 XML a b b a
  • mysql 中未来日期的日期时间值不正确

    MySQL语句 insert into banners path app id enabled from date to date updated at created at values banners example png com e
  • SSL 在 Chrome 中工作,但有时在 Firefox 中工作,而不在 IOS、Android 或 Blackberry 上工作

    我有 SSL 问题 我已将站点从一台服务器移至另一台服务器 因此必须移动 SSL 不幸的是 新服务器的根域与原始服务器不同 示例 原始版本为 www domain com 新版本为 www domainisnew com 我有多个网站使用此
  • 根据其他数据框中提供的范围值创建新列

    我有两个数据框 其中一个数据框作为参考表 另一个包含实际值 gt gt gt reference table MinRange MaxRange Multiplier Group 0 10 30 2 A 1 10 40 4 B 2 10 1
  • 使用 Java/JNI 时 Linux 上的信号处理

    我从事在 Wind River Linux 上运行的嵌入式系统的工作 它是 Java 和 C 的混合体 并带有一些用于技术之间通信的 JNI 我们构建了自定义错误处理 以便在出现任何意外错误时生成回溯和其他信息来帮助我们确定问题 此错误处理
  • Intel 64架构中CALLF(Far Call)可以有64位地址内存操作数吗?

    在 Intel 32 位架构中 我可以使用 ModR M 字节调用 32 位地址位置 根据英特尔手册 我需要 2 010B 用于操作码扩展 00B 用于 Mod 101B 允许我拥有 32 位位移 如果我想在 64 位架构中进行远调用 以便
  • alpha 版和 beta 版有什么区别?

    我想在不同的环境中部署我的软件并逐步提供功能 我应该何时何地使用 alpha 和 beta 版本 阿尔法版本 这是当您正在开发的功能不完整或部分完成时发布的版本 假设在机票预订系统中 您已经开发了座位选择 但仍保留支付实现 在这种情况下 您
  • 散点图的 Highcharts 图例符号大小

    我在为具有不同符号大小的 3d 散点图渲染图例时遇到问题 请参阅http jsfiddle net YyV6x 4 http jsfiddle net YyV6x 4 图例采用与主图表中相同大小的符号 并且图例项目的位置完全偏离 我尝试强制
  • 如何改进该算法来解决修改后的邮票难题?

    飞镖之子问题 http azspcs net Contest SonOfDarts是一场比赛Al Zimmermann 的编程竞赛 http azspcs net 于 2010 年 6 月 20 日结束 假设您有一个分为 R 个区域的飞镖靶
  • PSR-2 PHP 三元语法中是否需要括号?

    问题 PSR 2 PHP 三元语法中是否需要括号 寻找以下三元语句的语法中的哪一个 如果有的话 符合 PSR 2 我还需要指向文档或一些权威链接 error error status Error No Error OR error erro
  • 在 Tablayout 中设置可滚动或固定模式以实现动态选项卡数量

    我想要 tab 模式可使用选项卡滚动填充选项卡 具有单行标题 由于选项卡的数量及其标题是动态的在我的应用程序中 我该如何处理他们 当我设置给定的属性时 当选项卡数量较多时 选项卡标题分为两行 app tabGravity fill app
  • AWS S3 内联显示文件而不是强制下载

    由于某些原因 我的 S3 存储桶中的文件被强制下载 而不是内嵌显示 因此 如果我复制图像链接并将其粘贴到地址栏中 然后导航到它 它将促使我的浏览器下载它 相反 我实际上必须单击 打开图像 才能转到该网址 任何更改 S3 提供文件的方式的方法
  • 每次页面查看的成本哪个更高 - 数据库写入或文件写入?

    当您需要在应用程序中的每个页面视图上记录一些数据时 最有效的解决方案是什么 应该写入文件还是写入数据库 或者也许两者都不是 也许您应该将数据缓存在内存或文件中 并且只偶尔将其写入数据库 或文件系统 如果您使用内存缓存 如果只是记录少量数据而
  • 是否可以为组合类设置CSS?

    假设我有以下内容 tr background fff tr even background eee tr highlight background fec 是否可以指定第四个背景 fea 而不是有highlight只需覆盖even tr c
  • netBeans 图形用户界面问题

    我在 netBeans 中设计了这个 gui 它有一个 canvas 几个 JtextAreas 和一个 Jbutton 它在预览中看起来很棒 问题是当我运行实际程序时 文本区域会缩小 直到程序在其中打印一些内容 然后它们扩展到完整尺寸 J
  • jQuery 中两个按钮的功能相同

    我有两个按钮 btnAdd and btnUpdate 我为按钮编写了一个 jquery 函数btnUpdate验证网页中的某些字段 例如 function click function code here 我想做同样的事情btnAdd被点
  • kbuild 实际上是如何工作的?

    当我开发 Linux 驱动程序时 我读过如何通过此编写 linux kbuild makefiledocument https www kernel org doc Documentation kbuild makefiles txt 我知