问题标签 [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.
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 语言的某个深沉、黑暗和棕色隐士出没的角落,还是只是一个直接的编译器错误?
编辑:正如评论中所解释的,我认为提升只发生在混合参数类型或分配给与值不同的类型时,并且不知道它可能发生在一元操作中。这个问题是重复的。
linux-kernel - arm平台无法启用exec-shield内核参数
我想在运行时或编译时在嵌入式平台中启用 kernel.exec-shield 参数。我的嵌入式平台中有 32 位 arm 架构。我使用以下命令列出所有内核参数。
我得到了许多不相关的参数,但没有列出 kernel.exec-shield。
我也无法使用 menuconfig 在 kconfig 环境中找到任何相关参数。
我想解决如下所述的缓冲区溢出漏洞。
http://people.redhat.com/mingo/exec-shield/
我如何在 arm 架构中做到这一点?
问候...
c - kbuild 外部模块问题
我正在为设备驱动程序构建一个树外内核模块。总的来说,一切进展顺利,但我对使用 kbuild 和构建系统有一些疑问:
- 我发现了这篇很棒的帖子: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
选项,但我想知道这将如何应用在这里(如果有的话)。 modules_install
编译后使用与仅复制 .ko 文件有什么区别吗?我问的原因是因为我认为手动复制对我来说更容易,因为我还需要支持“make uninstall”目标(并且没有modules_uninstall
,只有 aclean
,它似乎不会从 .ko 中删除安装位置)。
在此先感谢您的帮助。
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:
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
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
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>
但没有帮助。
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
?
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?