问题标签 [kbuild]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
40 浏览

linux - 内核 makefile 中的以下几行是什么意思?

以下代码摘自内核源码

0 投票
1 回答
323 浏览

c - 编译linux内核时展开单个文件的宏

我对扩展单个 Linux 内核文件 (arch/x86/kernel/nmi.c) 的宏很感兴趣。我知道通常可以使用 gcc -E 来扩展宏。然而,由于该文件是 Linux 内核的一部分,因此需要将许多选项传递给 gcc。然后我试图修改内核 Makefile 以传递 -E 标志。

我目前正在修改 /arch/x86/kernel/Makefile,它是用于编译 nmi.c 并通过 make M=arch/x86/kernel 调用这个特定的子 Makefile

我发现可以使用 CFLAGS_nmi.o 传递额外的 gcc 标志。但是将 CFLAGS_nmi.o := -E 添加到 Makefile 并没有预期的效果

这是修改Makefile后的输出

我希望在“CC arch/x86/kernel/nmi.o”行之后扩展代码。我还尝试了“CFLAGS_nmi.o := -E > nmi.out”来尝试重定向输出,但生成的文件是空的。

0 投票
2 回答
737 浏览

makefile - LDFLAGS 和 ldflags-y 的区别

kbuild文档说:

ldflags-y... [适用] 仅适用于分配它们的 kbuild makefile.... [用于] 在递归构建期间发生的所有 ld 调用。

尽管

LDFLAGS... [用于] 链接器的所有调用。

m给定一个 Makefile (我们输入make m),我看不出它们之间有什么区别

  • 假设LDFLAGS := x,因为它适用于链接器的所有调用,所以在从 开始的ld任何构建会话中调用的所有都make m具有xLDFLAGS
  • 假设ldflags-y := y,因为如果适用于 的所有递归调用ld,则所有ld调用(由从 开始的任何构建会话make m)也y具有LDFLAGS

这种解释正确吗?

0 投票
0 回答
139 浏览

linux-kernel - kbuild 设置的 Linux 内核 #ifdef 指令可用?

是否有#ifdef用于条件编译的 Linux 内核指令,由内核构建系统 (kbuild) 设置?

用例

我有一个源代码文件,其中包含 SoC 的寄存器映射条目以及内核驱动程序使用的功能。用户空间程序也应包含此文件以使用寄存器映射条目:

我的头文件.h:

或者也许这个用例还有其他解决方案?

0 投票
1 回答
546 浏览

kernel-module - 当内核构建在树外时如何交叉编译外部内核模块?

在 x86_64 主机上,我为树外的 ARM 目标交叉编译了 Linux 内核。所以我有两个目录:

  1. ~/kernel_git_repo/ - 仅包含内核源代码
  2. ~/kernel_buld_dir/ - 包含 .config 文件和构建的内核对象

在第三个目录中

  1. ~/external_module - 外部内核模块的来源

我有一个带有 Makefile 的外部模块的源代码。

树内构建内核的“通常”命令是:

对于我的树外构建的内核, ~/kernel_git_repo/ 和 ~/kernel_buld_dir/ 都不能作为<path-to-compiled-src-code>. 似乎 make 命令需要带有Kbuild基础设施的内核源代码库.config带有文件和对象的构建目录。

在这种情况下,在 ~/external_module/Makefile 中用于构建模块的 make 命令是什么?

0 投票
0 回答
242 浏览

c - helloworld 内核模块中的 insmod 错误:模块格式无效

我正在交叉编译一个 helloworld 内核模块

我的文件是:

你好-1.c

KBuild

生成文件

这是我的终端输出,在 insmod 命令中显示错误:

但是当我在makefile下面的行评论时,一切都很好。

对于像这样的简单代码,我可以删除这个标志。但在另一个我应该使用 -fPIC 标志的代码中,我有同样的错误

我该如何解决?

0 投票
2 回答
957 浏览

makefile - 如何在 Makefile 中添加多个 Headers 文件路径?

我正在尝试编译 uleds.c 驱动程序,该驱动程序包含该路径下存在的多个文件:

/opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/usr/src/kernel/include/linux

我现在想修改我的 Makefile 并添加这个路径,这样我就可以正确编译 uleds.c

这是我的 Makefile :

有什么建议吗?谢谢

0 投票
0 回答
28 浏览

kbuild - Kbuild 可以一次为多个内核构建一个模块吗?

大致:针对 /lib/modules 中列出的所有内核构建

例如:

现在我有一个普通的 KBuild 并使用 -C 传递内核模块的位置,如下所示。

有没有办法将多个内核头文件传递到 Kbuild 的 -C 中?

0 投票
1 回答
459 浏览

c - 为什么我们没有ccflags-m,而是ccflags-y?

我正在分析 Linux KernelMakefile的捆绑包。我们可以定义一个额外的编译器标志来构建外部模块ccflags-y += -std=gnu11 -Wno-declaration-after-statement -Werror。我查看了Makefile.build哪个外部模块构建下降,甚至没有注意到ccflags-m定义的选项。完整的选项列表:

据我了解y, m -m用于kbuild可加载模块, y - 用于内置模块。ccflags-y所以用, not来指定编译器选项似乎不合逻辑ccflags-m

问题:为什么没有ccflags-y可加载模块的-m对应项?ccflags-m

0 投票
1 回答
136 浏览

c - Linux Kernel Makefile.build 构建外部模块时的奇怪行为

我需要一些KBuild与构建外部模块相关的实施细节建议。

Linux Kernel 5.0.0-32

这是我的LKMMakefile:

查看scripts/Makefile.build带有选项的调试输出的实现和打印,-d我发现正在执行的这个makefile的目标是__build

由于我正在构建外部 LKM,因此唯一的先决条件是$(obj-m)$(modorder-target). 我从数据库中得到了它们的值:

所以要执行__build先决条件/home/memyself/lkm/procfs_write_perm/pfsw.o必须首先构建。中定义了以下$(obj)/%.o:模式规则Makefile.build

我添加了调试输出以打印目标自动变量的名称:

并期望/home/memyself/lkm/procfs_write_perm/pfsw.o被打印,但实际上/home/memyself/lkm/procfs_write_perm/src/init.o被打印了。这看起来像一些魔法......

问题:为什么构建目标/home/memyself/lkm/procfs_write_perm/pfsw.o会导致构建/home/memyself/lkm/procfs_write_perm/src/init.o?它在代码中的哪个位置指定?

我知道有一个real-obj-m包含确切值的变量,但是grep根据某些东西我没有找到它的代码库...