我有2個驅動程序文件。Linux內核爲vmlinux提供了未定義的參考,但編譯.o文件
dr1.c
dr2.c
dr1.c確實的EXPORT_SYMBOL(func1的)。
dr2.c採用了威盛dr1.h
的定義無論是DR1和DR2被編譯並創建文件對象。 但是,在內核編譯的最後階段,我得到一個錯誤 未定義的dr2中func1的引用,但創建了dr2目標文件。
我不明白爲什麼鏈接沒有發生。
我有2個驅動程序文件。Linux內核爲vmlinux提供了未定義的參考,但編譯.o文件
dr1.c
dr2.c
dr1.c確實的EXPORT_SYMBOL(func1的)。
dr2.c採用了威盛dr1.h
的定義無論是DR1和DR2被編譯並創建文件對象。 但是,在內核編譯的最後階段,我得到一個錯誤 未定義的dr2中func1的引用,但創建了dr2目標文件。
我不明白爲什麼鏈接沒有發生。
dr1正在編譯爲模塊 dr2正被編譯到內核中。
因此,由於dr1不是vmlinux的一部分,因此即使dr1編譯成模塊沒有任何錯誤,也不會發生鏈接。我也將dr2製作成模塊。
此外,我必須確保在配置中啓用了內核模塊選項。
基本上不會發生鏈接,因爲在dr1.c
中定義的func1()
的地址對於dr2.c
是未知的。
有兩個解決這個問題:
1.手動已知第二個文件地址: 在這種情況下,讓我們假設模塊dr1.c
和dr2.c
存在於不同的目錄中,有有自己的Makefile
。首先,編譯dr1
模塊。完成後,將Modules.symvers
文件複製到包含dr2.c
的目錄中,然後構建dr2
模塊。 Modules.symvers
基本上包含了「導出的符號」的地址,通過將其複製到另一個模塊的目的地,使其「已知」,並最終發生鏈接。
2.使用兩個模塊共同的Makefile: 把兩個dr1.c
和dr2.c
在同一目錄下,並創建一個通用內核Makefile
它。構建在makefile以下條目:
obj-m := dr1.o dr2.o
當做到這一點,這兩個文件將被編譯,產生一個共同的Modules.symvers
文件和相應的鏈接。
希望這有助於。
感謝有關手動鏈接過程的信息。我將來會使用它。 – preetam 2014-10-28 22:21:20