Linux下使用核心原始碼單獨編譯某一模組
1. 檢視config配置項
進入需要編譯的目錄,我的目錄是 ./net/bridge,
sean@sean:/media/sean/b55f4db0-2560-4807-b8bf-b29a66db54e1/home/sean/work/tmp/kernel/linux-4.8/net/bridge$ ls br.c br_fdb.o bridge.mod.c br_if.o br_ioctl.o br_multicast.o br_netfilter_ipv6.o br_netfilter.o br_nf_core.o br_stp_bpdu.c br_stp_if.o br_sysfs_br.c br_vlan.c Makefile br_device.c br_forward.c bridge.mod.o br_input.c br_mdb.c br_netfilter_hooks.c br_netfilter.ko br_netlink.c br.o br_stp_bpdu.o br_stp.o br_sysfs_br.o br_vlan.o modules.order br_device.o br_forward.o bridge.o br_input.o br_mdb.o br_netfilter_hooks.o br_netfilter.mod.c br_netlink.o br_private.h br_stp.c br_stp_timer.c br_sysfs_if.c built-in.o Module.symvers br_fdb.c bridge.ko br_if.c br_ioctl.c br_multicast.c br_netfilter_ipv6.c br_netfilter.mod.o br_nf_core.c br_private_stp.h br_stp_if.c br_stp_timer.o br_sysfs_if.o Kconfig netfilter sean@sean:/media/sean/b55f4db0-2560-4807-b8bf-b29a66db54e1/home/sean/work/tmp/kernel/linux-4.8/net/bridge$
檢視Makefile,找到需要編譯的檔案,並確認編譯的config引數,如下:
2. 編譯
命令如下:
make CONFIG_BRIDGE_IGMP_SNOOPING=m -C /home/sean/kernel/linux-4.8 M=/home/sean/kernel/linux-4.8/net/bridge modules 或者 cd /home/sean/kernel/linux-4.8/net/bridge make CONFIG_BRIDGE_IGMP_SNOOPING=m -C /home/sean/kernel/linux-4.8 M=`pwd` modules
然後手動將生成的*.ko拷貝到/lib/modules/2.6.19/kernel/對應的目錄即可。(由於我需要的檔案只能編譯為.o,所以不需要拷貝)
執行depmod -a重新配置依賴關係,以後就可以通過modprobe fuse來載入fuse模組了。
3. make 引數的說明:
$(MAKE) -C $(KDIR) M=$(PWD) modules
-C:後面的引數為linux核心的頂層目錄
M:後面的引數為需要編譯檔案的目錄
4. 例子
1)模組Makefile
ifneq ($(KERNELRELEASE),) obj-m := mytest.o mytest-objs := file1.o file2.o file3.o else KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KDIR) M=$(PWD) modules endif
KERNELRELEASE 是在核心原始碼的頂層Makefile中定義的一個變數,在第一次讀取執行此Makefile時,KERNELRELEASE沒有被定義,所以make將讀取執行else之後的內容。如果make的目標是clean,直接執行clean操作,然後結束。
當make的目標為modules或modules_install時,-C( K E R N E L D I R ) 指 明 跳 轉 到 內 核 源 碼 目 錄 下 讀 取 那 裡 的 M a k e f i l e ; M = (KERNELDIR)指明跳轉到核心原始碼目錄下讀取那裡的Makefile;M=(KERNELDIR)指明跳轉到內核源碼目錄下讀取那裡的Makefile;M=(PWD) 表明然後返回到當前目錄繼續讀入、執行當前的Makefile。
當從核心原始碼目錄返回時,KERNELRELEASE已被被定義,kbuild也被啟動去解析kbuild語法的語句,make將繼續讀取else之前的內容。else之前的內容為kbuild語法的語句, 指明模組原始碼中各檔案的依賴關係,以及要生成的目標模組名。
2)Kconfig與核心Makefile
-
a. 使用Kconfig以及核心的Makefile可以在核心中新增自己的原始碼,並且可以新增核心配置選項,是否編進核心,是否以模組的方式等;
-
b. 在核心某個目錄的Kconfig檔案中可以配置各個選項的含義;在Makefile中指定如果配置了,該如何編譯;
如要在/driver/char中增加一個配置選項CONFIG_FISHING_POLE選項;
在driver/char/Kconfig檔案中增加對該選項的說明:
config FISHING_POLE tristate “簡單說明” //tristate代表有三種方式,如為bool代表不能變為模組 default n //預設是否選擇 help **** //一些幫助資訊
在driver/char/Makefile中增加:
obj-$(CONFIG_FISHING_POLE) += fishing.o
如果有多個原始檔:
obj-$(CONFIG_FISHING_POLE) += fishing.o
fishing-objs := fishing-main.o fishing-line.o
root@ubuntu:/opt/gopath/src/github.com/kata-containers/packaging/kernel/kata-linux-5.4.60-89/drivers/android# make CONFIG_ANDROID_BINDER_IPC=m -C /opt/gopath/src/github.com/kata-containers/packaging/kernel/kata-linux-5.4.60-89 M=/opt/gopath/src/github.com/kata-containers/packaging/kernel/kata-linux-5.4.60-89/drivers/android make: Entering directory '/opt/gopath/src/github.com/kata-containers/packaging/kernel/kata-linux-5.4.60-89' CC kata-linux-5.4.60-89/drivers/android/binderfs.o CC /kernel/kata-linux-5.4.60-89/drivers/android/binder_alloc_selftest.o AR kernel/kata-linux-5.4.60-89/drivers/android/built-in.a CC [M] kata-linux-5.4.60-89/drivers/android/binder.o CC [M] packaging/kernel/kata-linux-5.4.60-89/drivers/android/binder_alloc.o cat: / kernel/kata-linux-5.4.60-89/drivers/android/modules.order: No such file or directory Building modules, stage 2. MODPOST 0 modules sed: can't read packaging/kernel/kata-linux-5.4.60-89/drivers/android/modules.order: No such file or directory cat: /opt/gopath/src/github.com/kata-containers/packaging/kernel/kata-linux-5.4.60-89/drivers/android/modules.order: No such file or directory make: Leaving directory '/ /packaging/kernel/kata-linux-5.4.60-89'