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