1. 程式人生 > 實用技巧 >Linux下使用核心原始碼單獨編譯某一模組

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)MakefileM=(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'