簡體   English   中英

編譯單個內核模塊(Debian / Ubuntu)

[英]Compiling an individual kernel module (Debian/Ubuntu)

我需要修改Ubuntu 14.04發行版的ELF加載程序的內核實現。 使用以下命令下載了源:

sudo apt-get source linux-image-$(uname -r)

我運行了配置腳本:

make config

在根源樹中。 在看似無休止的輸入請求序列之后,腳本創建了構建內核(或一組模塊)所需的.config文件。 我正在使用的內核版本是linux-3.13.0,並且具有以下源代碼樹布局:

$ ls 
arch   COPYING  crypto         Documentation  dropped.txt  FileSystemMakefile  fs       init  Kbuild   kernel  MAINTAINERS  mm   README          samples  security   sound  ubuntu  virt
block  CREDITS  debian.master  drivers        elf.dat      firmware            include  ipc   Kconfig  lib     Makefile     net  REPORTING-BUGS  scripts  shortcuts  tools  usr

ELF加載程序位於/path/to/source/fs/binfmt_elf.c中 緊接着這個問題,為了編譯一個單獨的模塊,運行就足夠了

make /path/to/module/directory. 

在這種情況下,將是:

make ./path/to/source/fs

編譯時間很長。 (在虛擬機上)大約需要二十分鍾,並且輸出(默認情況下)被寫入模塊所在的同一目錄中。 我通過運行找到了目標文件:

find . -name "*.o"

在/ path / to / source / fs中。 通過名稱過濾可以通過運行以下命令找到ELF加載器:

find . -name "*elf*.o"

在當前資源中,它(默認)寫在:

/path/to/source/fs/binfmt_elf.o

在學習了教程之后,我注意到內核模塊具有命名約定[module_name] .ko ,以便將它們與用戶空間對象文件區分開。

我的問題是,如果存在當前的ELF加載器,那么如何將新的(修改的)ELF加載器插入內核(因為卸載它可能會阻止二進制文件執行)?

您所描述的並不是像通常所說的那樣真正地編譯“內核模塊”。 您已經建立了一個靜態鏈接到內核的對象,並且無法將那個對象僅加載到正在運行的內核中。

“內核模塊”通常是指“可加載內核模塊”(LKM)。 您需要/想要將fs構建和加載為LKM。 看看下面的HOWTO。 按照此步驟將所需的fs構建為LKM。 然后,您只需替換一個LKM(.ko)文件並重新啟動即可(正常情況下,您可以動態刪除並插入LKM,但不確定會如何影響ELF fs等根本性問題-如果您不先重新啟動就可以嘗試rmmod / modprobe ike)。

http://www.tldp.org/HOWTO/Module-HOWTO/x73.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM