Linux下使用核心原始碼單獨編譯某一模組

2021-09-25 06:53:45 字數 3365 閱讀 8823

初衷:由於ubuntu1604安裝版本沒有 igmp snooping的模組,所以研究了一下此功能。

進入需要編譯的目錄,我的目錄是 ./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引數,如下:

命令如下:

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模組了。

$(make) -c $(kdir) m=$(pwd) modules
-c:後面的引數為linux核心的頂層目錄

m:後面的引數為需要編譯檔案的目錄

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 (ke

rnel

dir)

指明跳轉

到核心源

碼目錄下

讀取那裡

的mak

efil

e;m=

(kerneldir)指明跳轉到核心原始碼目錄下讀取那裡的makefile;m=

(kerne

ldir

)指明跳

轉到核心

原始碼目錄

下讀取那

裡的ma

kefi

le;m

=(pwd) 表明然後返回到當前目錄繼續讀入、執行當前的makefile。

當從核心原始碼目錄返回時,kernelrelease已被被定義,kbuild也被啟動去解析kbuild語法的語句,make將繼續讀取else之前的內容。else之前的內容為kbuild語法的語句, 指明模組原始碼中各檔案的依賴關係,以及要生成的目標模組名。

如要在/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

Linux下使用核心原始碼單獨編譯某一模組

使用linux在於折騰。生命不息,折騰不止。在vmware中安裝了linuxmint 18,自帶核心是4.4,於是自己手動將核心版本公升級到了4.8,但是安裝新的核心後,發現vmware螢幕無法自動適應客戶機,於是 lspci knn檢視了下顯示模組,發現vga沒有可用的模組。於是對比了正常的虛擬機...

關於Linux核心原始碼使用

很多人對linux這乙個開放核心原始碼的os不會陌生,因此開源相關話題在此不再贅述。問題是,拿到了linux kernel source以後 不知道在 麼,那就看下http www.kernel.org 吧 應該如何正確的進行配置,編譯,安裝 公升級工作。事先宣告,安裝 公升級核心的操作被執行以前,...

linux核心原始碼

1.機器當前使用的核心版本 apuser jianzhangubtnb uname a linux jianzhangubtnb 3.2.0 23 generic 36 ubuntu smp tue apr 10 20 39 51 utc 2012 x86 64 x86 64 x86 64 gnu ...