问题标签 [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 回答
56 浏览

c - kbuild C: ~ 运算符将无符号转换为有符号?

在 Linux 内核模块中,对于用户模式 ​​C 的 stdint.h/limits.h 中有许多内容的定义,但标准内核头文件中明显缺少这些内容。例如以下:

但是,当使用 kbuild(i386 目标)构建时,INT16_MAX 将输出到 (int16_t)-1,而 INT16_MIN 输出到 (int16_t)0。这意味着 UINT16_MAX 在右移之前由 ~ 运算符转换为 int16_t。如果 UINT16_MAX 的定义改为

结果是正确的。这是 C 语言的某个深沉、黑暗和棕色隐士出没的角落,还是只是一个直接的编译器错误?

编辑:正如评论中所解释的,我认为提升只发生在混合参数类型或分配给与值不同的类型时,并且不知道它可能发生在一元操作中。这个问题是重复的。

0 投票
0 回答
216 浏览

linux-kernel - arm平台无法启用exec-shield内核参数

我想在运行时或编译时在嵌入式平台中启用 kernel.exec-shield 参数。我的嵌入式平台中有 32 位 arm 架构。我使用以下命令列出所有内核参数。

我得到了许多不相关的参数,但没有列出 kernel.exec-shield。

我也无法使用 menuconfig 在 kconfig 环境中找到任何相关参数。

我想解决如下所述的缓冲区溢出漏洞。

http://people.redhat.com/mingo/exec-shield/

我如何在 arm 架构中做到这一点?

问候...

0 投票
1 回答
328 浏览

c - kbuild 外部模块问题

我正在为设备驱动程序构建一个树外内核模块。总的来说,一切进展顺利,但我对使用 kbuild 和构建系统有一些疑问:

  1. 我发现了这篇很棒的帖子:Is it possible to set CFLAGS to a linux kernel module Makefile? ,它显示了如何修改编译器标志。结果,我现在将我的编译器标志设置为:ccflags-y := -O2 -Wall -Wextra -I $(DRIVER_INC_DIR)$(DRIVER_INC_DIR)我的驱动程序的各种头文件在哪里。请注意,我的驱动程序由几个 .o 文件组成,这些文件合并为一个 .ko。我想显示编译器为我自己的代码生成的警告,而不是 Linux 中的代码(例如 linux/module.h)。我怎样才能做到这一点?我知道在用户空间应用程序中有-isystem选项,但我想知道这将如何应用在这里(如果有的话)。
  2. modules_install编译后使用与仅复制 .ko 文件有什么区别吗?我问的原因是因为我认为手动复制对我来说更容易,因为我还需要支持“make uninstall”目标(并且没有modules_uninstall,只有 a clean,它似乎不会从 .ko 中删除安装位置)。

在此先感谢您的帮助。

0 投票
1 回答
224 浏览

linux - 从跨目录的对象构建 .ko 时在 Makefile 中使用通配符的问题

我将内核模块组织为不同的子组件,因此我可以轻松插入/删除现有的子模块以尝试或集成东西。

目录布局如下图所示:

这是我的Makefile,

当我尝试在上面的 Makefile 中将方法 [1-1] 替换为 [1-2] 时,我收到如下所示的警告。

从控制台输出中,我看不到已src/foo1.c编译,就好像我在 Makefile 中使用方法 [1-1] 一样。

我尝试回foo-objs显(检查 Makefile 中的 [2])并发现两种方法 [1-1] 和 [1-2] 的值相同。

SO上有没有人提出过类似的问题可以帮助解决一些问题?

(我更喜欢 [1-2] 因为它可以节省我在添加新子组件时更新 Makefile 的精力)

main.c下面我还附上了, foo1.c&的源代码foo1.h。您还可以查看github 存储库以了解此问题,以便更轻松地访问这些代码。


主程序

这里foo1是一个子组件,在初始化和清理过程中简单地打印出一些东西:

./include/foo1.h

./src/foo1.c


更新_2018/01/15

根据下面的 Tsyvarev 回答,可以通过如下修改 Makefile 来更正 Makefile:

0 投票
1 回答
1128 浏览

linux - 如何构建内核模块的单个源文件

我想将一个.c文件编译成一个.o文件,以便在稍后的单独阶段我可以将它与其他文件链接以生成一个可加载的模块(.ko文件)。

我尝试遵循 Kbuilds 文档(此处为 2.4 ),但没有成功:

输出是:

0 投票
1 回答
146 浏览

c++ - VirtualBox 来宾添加编译

我正在根据官方文档编译 VirtualBox Guest Additions 。分别构建 64 位和 32 位添加并尝试将其打包到 iso 映像中。

目标系统是 Windows 7 x64。根据文档的所有软件要求,包括确切的版本。仅应构建添加项(LocalConfig.kmk 中的 VBOX_ONLY_ADDITIONS := 1)

不设置目标的 32 位编译

不设置目标的 64 位编译

尝试构建 x86 添加(根据 Makefile.kmk 中的注释,必须在 x64 之前构建)

得到错误

尝试构建 x64 版本时出现相同的错误:kmk additions-build-win.amd64

我的 LocalConfig.kmk

0 投票
2 回答
195 浏览

c++ - VirtualBox Guest Additions 编译和 iso 打包

我正在根据官方文档编译 VirtualBox Guest Additions 。分别构建 64 位和 32 位添加并尝试将其打包到 iso 映像中。

目标系统是 Windows 7 x64。根据文档的所有软件要求,包括确切的版本。只应构建添加(VBOX_ONLY_ADDITIONS := 1在 LocalConfig.kmk 中)

32位编译不设置目标是正常的

不设置目标的 64 位编译

尝试构建 x86 添加(根据 Makefile.kmk 中的注释,必须在 x64 之前构建)

...并得到错误

尝试构建 x64 版本时出现相同的错误:kmk additions-build-win.amd64

我的 LocalConfig.kmk

0 投票
1 回答
297 浏览

linux - 如何检查给定页面是否是内核模块中的 ZERO_PAGE?

我正在编写一个内核模块,在一个函数内部,我需要检查是否传递了
struct page*映射ZERO_PAGE
我想出了以下代码来检查条件。

当我尝试编译它时,我收到以下警告消息:

当我尝试“insmod”“.ko”时,它会给出错误“未知符号”
。并在日志缓冲区中打印“未知符号 phys_base”。
我的制作文件:

我正在为其编写模块的内核版本:
2.6.18-398.el5 (rhel 5.11)
我试图在内核中找到一些其他“接口”来检查页面是否为 ZERO_PAGE,但没有运气。
有人可以告诉我如何摆脱这个错误。或者任何其他方式来检查这种情况?

注意:我遇到了这个 kernelnewbie线程,它解决了同样的问题。包括<asm/pgtable.h>但没有帮助。

0 投票
1 回答
777 浏览

makefile - obj-m 变量如何导出到 sub-make 中?

我正在尝试通过遵循https://www.tldp.org/LDP/lkmpg/2.6/lkmpg.pdf并阅读 GNU make 手册来学习 linux 内核模块构建和 kbuild。

这是 Linux 内核模块编程指南中第一个示例 Hello-1 的 Makefile:

AFAIK,obj-m应该由 kbuild 阅读。但是根据 GNU Make 手册,我知道obj-m不应该导出。

除非通过显式请求,否则仅当变量最初在环境中定义或在命令行中设置,并且其名称仅包含字母、数字和下划线时,才会导出变量。某些 shell 无法处理由字母、数字和下划线以外的字符组成的环境变量名称。

https://www.gnu.org/software/make/manual/html_node/Variables_002fRecursion.html

obj-m最初既不是在环境中定义的,也不是在命令行中设置的。所以我希望它不应该导出到 target 的配方all。kbuild如何访问obj-m

0 投票
0 回答
72 浏览

c - How use library at linux driver use linux source code tree to compile

I want to modify the wifi driver of Linux, because I want use ioctl and socket to change the channel. So first I use a library to implement those function and install it to linux with the header file in /usr/local/include/ folder. For normal program, if I want to use this library all I need to do is add -llibaryname in the compile command. But since the driver uses Linux source code, it uses its own Makefile and uses the rule call Kbuild. I want to know how to modify the Makefile to let me use the library? Or is there are other way to reach my goal?