linux2 6核心Makefile簡單語法與應用

2021-06-21 14:54:12 字數 2314 閱讀 8484

2.6的makefile的寫法和應用相對於2.4有了一些變化,可能對於很多人來說,因為找不到相關的文件,都是模仿核心中已有的檔案來寫自己的makefile。其實,在核心的documentation / kbuild目錄下面,還是有對核心makefile語法的詳細說明的。在這裡就2.6核心中makefile最常見的簡單應用情況做乙個翻譯和歸納介紹。

2.6核心的makefile分為5個組成部分:

l 最頂層的makefile

l 核心的.config配置檔案

l 在arch/$(arch) 目錄下的體系結構相關的makefile

l 在scripts/ 目錄下的 makefile.* 檔案,是一些makefile的通用規則

l 各級目錄下的大概約500個kbuild makefile檔案

頂層的makefile檔案讀取 .config檔案的內容,並總體上負責build核心和模組。arch makefile則提供補充體系結構相關的資訊。 scripts目錄下的makefile檔案包含了所有用來根據kbuild makefile 構建核心所需的定義和規則。

1.2 kbuild makefile

對於makefiles的不同組成部分,有一些不同的語法規則。針對的物件也不同,對於大部分核心模組或裝置驅動的開發者和使用者來說,最常接觸到的就是各層目錄下基於kbuild架構的kbuild makefile檔案。

kbuild makefile的語法結構非常簡單,核心內容主要包括

1.2.1 目標定義

目標定義就是用來定義哪些內容要做為模組編譯,哪些要編譯鏈結進核心。

例如 obj-y += foo.o

表示要由foo.c或者foo.s檔案編譯得到foo.o並鏈結進核心,而obj-m則表示該檔案要作為模組編譯。 除了y,m以外的obj-x形式的目標都不會被編譯。

而更常見的做法是根據.config檔案的config_ 變數來決定檔案的編譯方式,如:

obj-$(config_isdn) += isdn.o

obj-$(config_isdn_ppp_bsdcomp) += isdn_bsdcomp.o

除了obj-形式的目標以外,還有lib-y library庫,hostprogs-y 主機程式等目標,但是基本都應用在特定的目錄和場合下。

1.2.2 多檔案模組的定義

最簡單的kbuild makefile如上一節一句話的形式就夠了,如果乙個模組由多個檔案組成,那麼稍微複雜一些,採用模組名加 –objs字尾或者 –y字尾的形式來定義模組的組成檔案。如以下例子:

obj-$(config_ext2_fs) += ext2.o

ext2-y := balloc.o bitmap.o

ext2-$(config_ext2_fs_xattr) += xattr.o

模組的名字為ext2,由balloc.o和bitmap.o兩個目標檔案最終鏈結生成ext2.o 直至ext2.ko檔案,是否包括xattr.o取決於核心配置檔案的配置情況。如果config_ext2_fs的值是y也沒有關係,在此過程中生成的 ext2.o將被鏈結進built-in.o最終鏈結進核心。這裡需要注意的一點是,該kbuild makefile所在的目錄中不應該再包含和模組名相同的原始檔如ext2.c/ext2.s。

或者寫成如-objs的形式:

obj-$(config_isdn) += isdn.o

isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o

1.2.3 目錄層次的迭代

如下例:

obj-$(config_ext2_fs) += ext2/

如果config_ext2_fs 的值為y或m,kbuild將會將ext2目錄列入向下迭代的目標中,但是其作用也僅限於此,具體ext2目錄下的檔案是要作為模組編譯還是鏈入核心,還是有ext2目錄下的makefile檔案的內容來決定的。

1.2.4 模組的編譯

編譯模組的時候,你可以將模組放在**樹中,用make modules的方式來編譯你的模組,你也可以將模組相關檔案目錄放在**樹以外的位置,用如下命令來編譯模組:

make -c path/to/kernel/src m=$pwd modules

-c指定**樹的位置,m=$pwd 或 m=`pwd` 告訴kbuild回到當前目錄來執行build操作。

1.2.5 模組的安裝

當你需要將模組安裝到非預設位置的時候,你可以用install_mod_path 指定乙個字首,如:

make install_mod_path=/foo modules_install

模組將被安裝到 /foo/lib/modules目錄下

Linux 2 6核心編譯,核心公升級

本文描述了在fc8下公升級linux核心為2.6.25的詳細步驟.1.首先從如下 得到linux 2.6.25.2.然後在 usr src下untar這個包.tar xjfv linux 2.6.25.tar.bz2 3.配置核心 cd usr src linux 2.6.25 make mrpro...

Linux2 6核心啟動分析

我們已知u boot的終極目的是啟動核心,那麼核心啟動的開始必定是u boot傳入的引數。開啟armlinux.c 發現有一行的 為 thekernel 0,bd bi arch number,bd bi boot params 帶入三個引數 第乙個引數是0,第二個引數是機器id,第三個引數是引數所...

Linux 2 6 核心驅動移植

隨著 linux 2.6的發布,由於2.6核心做了教的改動,各個裝置的 驅動程式在不同程度上要進行改寫。為了方便各位linux愛好者我把自己整理的這分文件share出來。該文當列舉了2.6核心同以前版本的絕大多數變化,可惜的是由於時間和精力有限沒有詳細列出各個函式的用法。1 使用新的入口 必須包含 ...