編譯"hello world"驅動後都生成了什麼

雖然系統提供的makefile很智能地將hello.c最終編譯成了hello.ko,但是我還是想知道系統的makefile到底幹了些什麼。

   首先看編譯驅動的目錄,編譯後多個四個文件:hello.ko, hello.mod.c, hello.mod.o, hello.o
      hello.mod.c是一個C程序的源文件,查看其內容,似乎僅僅只是定義了兩個全局的結構體變量。
      我猜想:這個文件其實是驅動的版本信息,編譯後的這些信息就好像元數據一樣附加到ELF文件的.TEXT段,然後加載驅動的框架可以讀取這些信息。原理應該是WINDOWS下的那種rc文件一樣。

     光看生成的文件還不夠,修改了一下Makefile,把具體的執行信息都打印出來:
obj-m := hello.o
KERNEL_DIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
    make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules -n
clean:
    rm *.o *.ko

    在調用系統提供的makefile的時候,加上-n的參數。-n是指執行命令的時候將命令打印出來,但並不真正的執行。
    修改好後執行make,果然打印了許許多多的命令出來。認真看產生的命令,發現居然在源碼目錄下創建了一個隱藏文件,有意思,於是執行:ll -a,將所有文件顯示出來:
    編譯驅動後,不僅僅只多了四個文件,其實還產生了一個隱藏目錄(.tmp_versions)和三個隱藏的文本文件(.hello.ko.cmd, .hello.mod.o.cmd, .hello.o.cmd)。
    查看三個隱藏文件的內容,終於明白了系統的makefile執行的流程:

1、建立隱藏文件夾.tmp_versions,作爲編譯過程中的臨時文件夾;

2、使用GCC編譯hello.c,生成hello.o,將編譯的命令參數行寫到 .hello.o.cmd

3、使用腳本程序,根據hello.c生成hello.mod.c,hello.mod.c其實是驅動需要的元數據;
4、使用GCC編譯hello.mod.c,生成hello.mod.o,將編譯的命令參數行寫到 .hello.mod.o

5、使用ld鏈接器鏈接hello.mod.o和hello.o,生成hello.ko,將命令參數行寫到.hello.ko.cmd

6、刪除中間生成的臨時文件


原文地址:http://hi.baidu.com/ah__fu/blog/item/0f53ff4c2a5ecaf1d62afc62.html


參考文檔 http://www.360doc.com/content/11/0404/16/1317564_107153582.shtml

發佈了40 篇原創文章 · 獲贊 5 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章