可以单独编译内核中已有的模块吗?

33 天前
 sbldehanhan

例如 mac80211 这个模块,我修改之后不想替换原来系统中的整个内核,只想可以单独编译出 mac80211.ko ,然后用 insmod 插入或者放到系统中。但是我在 mac80211 目录中用 make -C /usr/src/linux-headers-x.y.z M=pwd modules 编译时报错。怎么操作才能像自己写的模块那样单独编译?

977 次点击
所在节点    Ubuntu
9 条回复
yolee599
33 天前
1. 可以单独编译,但是如果你内核中的 mac80211 是配置成 y 是不能再 insmod ;
2. 报错是报什么错?
FranzKafka95
33 天前
说实话还真没有试过,如果原来分内核配置为 y 而非 m ,打包到 Image 了,是有可能无法再 insmod 该模块的
wniming
33 天前
可以单独编译模块,配置好 config 后只需要 2 步:

1, make modules_prepare
2, make KBUILD_MODPOST_WARN=1 -j32 M=net/mac8021

注意要在源码树的根目录下执行。
Donaldo
33 天前
@yolee599 #1 那可以先 rmmod 然后再 insmod 新的么?
sbldehanhan
33 天前
@wniming #3 试了一下,这样的确可以做到单独编译 mac80211 ,但是编译出来的 ko 插不到系统中,因为这个 ko 编译用的头文件是源码的头文件,不是系统的文件。有什么办法能让它用系统的头文件吗?
wniming
33 天前
@sbldehanhan #5 如果你用的是 redhat 系列可以参考如下步骤,我用 fedora39 作为演示:

1, dnf download --source kernel-core
2, rpm -ivh kernel-6.5.6-300.fc39.src.rpm
3, rpmbuild -bp ~/rpmbuild/SPECS/kernel.spec
4, cd ~/rpmbuild/BUILD/kernel-6.5.6/linux-6.5.6-300.fc39.x86_64
5, cp /usr/src/kernels/6.5.6-300.fc39.x86_64/Makefile . # 需要安装 kernel-devel 包
6, cp /usr/src/kernels/6.5.6-300.fc39.x86_64/.config . # 需要安装 kernel-devel 包

然后执行我 #3 楼给出的步骤。

如果是 debian 系列你自行研究,方法类似,就是包的名称不一样。
GavinXSF
33 天前
应该先需要 `apt install linux-headers-$(uname -r)` 安装一下构建的 kernel headers

然后参考:
https://docs.kernel.org/kbuild/modules.html
`make -C /lib/modules/`uname -r`/build M=$PWD`
用已安装的本机内核树去构建

编译模块的 magic number 必须和正在运行的 kernel 对的上,才能正常插入,不然不被允许插入
wniming
33 天前
@GavinXSF #7 你这种方式比我 #6 楼给出的方式更简单,不需要第 5 和第 6 步,只需要 cd 到 mac80211 的目录,直接命令行执行:

make -j32 -C /lib/modules/`uname -r`/build M=$PWD

就可以了。
sbldehanhan
29 天前
@wniming #8 这种方式编译成功了,一开始可能是因为用的内核源码和系统头文件不匹配,编译时会报某些操作的数据类型不匹配。用系统提供的源码就成功了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1033967

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX