2014-09-30 213 views
4

我有一個內核A頭文件的Linux機器。 我想在內核B正在運行時使用GCC與內核A編譯C程序。使用gcc與內核頭文件編譯Linux內核模塊

我怎麼能這樣做?我如何檢查它的工作原理?

+0

是你的C程序的內核模塊或一個用戶空間程序?你可以使用'gcc'的'-I'選項。內核模塊 – iqstatic 2014-09-30 08:02:00

+0

。我將'-I/usr/src/linux-headers-2.6.32-38-server/include /'選項添加到我的Makefile中,但在此之後系統繼續編譯過程,這種更改是否足夠? – kobi 2014-09-30 08:28:35

+0

如果它是內核模塊,則必須使用內核源目錄中的內核Makefile。你爲什麼使用'gcc'?發佈您正在使用的Makefile來構建內核模塊。 – iqstatic 2014-09-30 08:58:19

回答

5

這是需要深入研究的其他信息。 Post 2.6版本,正如其他答覆中提到的那樣,Makefile負責處理大部分Linux內核模塊編譯步驟。然而,在它的核心仍然是GCC,這是它是如何做:(你也可能編譯它沒有Makefile文件)

繼GCC選項是必要的:

  1. -isystem/lib目錄/ modules /`uname -r`/build/include:您必須使用正在編譯的內核的內核頭文件。使用 默認情況下,/ usr/include/linux將不起作用。

  2. -D__KERNEL__:定義這個符號告訴頭文件,代碼將在內核模式下運行,而不是作爲用戶進程運行。

  3. -DMODULE:該符號告訴頭文件爲內核模塊提供適當的定義。

gcc -DMODULE -D__KERNEL__ -isystem /lib/modules/$(uname -r)/build/include -c hello.c -o hello.ko

3

爲了編譯內核模塊,最好使用駐留在內核源目錄中的內核Makefile。您可以使用以下make命令:

make -C $(KERNEL_SOURCE_DIR) M=`pwd` modules 

否則,你可以選擇寫自己的Makefile這樣的:

KERNEL_DIR := /lib/modules/$(shell uname -r)/build 

obj-m := test.o 

driver: 
    make -C $(KERNEL_DIR) M=`pwd` modules 

clean: 
    make -C $(KERNEL_DIR) M=`pwd` clean 

在這個我已經使用了KERNEL_DIR作爲/lib/modules/$(shell uname -r)/build它使用的內核頭文件當前正在運行的內核。但是,您可以使用要編譯模塊的內核源代碼目錄的路徑。

This顯示瞭如何使用gcc來做到這一點。