2014-10-27 51 views
0

我有2個驅動程序文件。Linux內核爲vmlinux提供了未定義的參考,但編譯.o文件

dr1.c

dr2.c

dr1.c確實的EXPORT_SYMBOL(func1的)。

dr2.c採用了威盛dr1.h

的定義無論是DR1和DR2被編譯並創建文件對象。 但是,在內核編譯的最後階段,我得到一個錯誤 未定義的dr2中func1的引用,但創建了dr2目標文件。

我不明白爲什麼鏈接沒有發生。

回答

0

dr1正在編譯爲模塊 dr2正被編譯到內核中。

因此,由於dr1不是vmlinux的一部分,因此即使dr1編譯成模塊沒有任何錯誤,也不會發生鏈接。我也將dr2製作成模塊。

此外,我必須確保在配置中啓用了內核模塊選項。

1

基本上不會發生鏈接,因爲在dr1.c中定義的func1()的地址對於dr2.c是未知的。

有兩個解決這個問題:

1.手動已知第二個文件地址: 在這種情況下,讓我們假設模塊dr1.cdr2.c存在於不同的目錄中,有有自己的Makefile。首先,編譯dr1模塊。完成後,將Modules.symvers文件複製到包含dr2.c的目錄中,然後構建dr2模塊。 Modules.symvers基本上包含了「導出的符號」的地址,通過將其複製到另一個模塊的目的地,使其「已知」,並最終發生鏈接。

2.使用兩個模塊共同的Makefile: 把兩個dr1.cdr2.c在同一目錄下,並創建一個通用內核Makefile它。構建在makefile以下條目:

obj-m := dr1.o dr2.o

當做到這一點,這兩個文件將被編譯,產生一個共同的Modules.symvers文件和相應的鏈接。

希望這有助於。

+0

感謝有關手動鏈接過程的信息。我將來會使用它。 – preetam 2014-10-28 22:21:20