例如 mac80211 这个模块,我修改之后不想替换原来系统中的整个内核,只想可以单独编译出 mac80211.ko ,然后用 insmod 插入或者放到系统中。但是我在 mac80211 目录中用 make -C /usr/src/linux-headers-x.y.z M=pwd
modules 编译时报错。怎么操作才能像自己写的模块那样单独编译?
1
yolee599 236 天前
1. 可以单独编译,但是如果你内核中的 mac80211 是配置成 y 是不能再 insmod ;
2. 报错是报什么错? |
2
FranzKafka95 236 天前 via Android
说实话还真没有试过,如果原来分内核配置为 y 而非 m ,打包到 Image 了,是有可能无法再 insmod 该模块的
|
3
wniming 236 天前
可以单独编译模块,配置好 config 后只需要 2 步:
1, make modules_prepare 2, make KBUILD_MODPOST_WARN=1 -j32 M=net/mac8021 注意要在源码树的根目录下执行。 |
5
sbldehanhan OP @wniming #3 试了一下,这样的确可以做到单独编译 mac80211 ,但是编译出来的 ko 插不到系统中,因为这个 ko 编译用的头文件是源码的头文件,不是系统的文件。有什么办法能让它用系统的头文件吗?
|
6
wniming 236 天前
@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 系列你自行研究,方法类似,就是包的名称不一样。 |
7
GavinXSF 236 天前
应该先需要 `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 对的上,才能正常插入,不然不被允许插入 |
8
wniming 236 天前
@GavinXSF #7 你这种方式比我 #6 楼给出的方式更简单,不需要第 5 和第 6 步,只需要 cd 到 mac80211 的目录,直接命令行执行:
make -j32 -C /lib/modules/`uname -r`/build M=$PWD 就可以了。 |
9
sbldehanhan OP @wniming #8 这种方式编译成功了,一开始可能是因为用的内核源码和系统头文件不匹配,编译时会报某些操作的数据类型不匹配。用系统提供的源码就成功了。
|