2015-10-06 60 views
2

符號machine_power_off內核符號在標有 「T」 的/ proc/kallsyms: $ grep -w machine_power_off /proc/kallsyms ffffffff8102391b T machine_power_off 標有 「T」 在/ proc/kallsyms不會導出

但它是not exported。對於輸出符號來說,「k」是否必要且足夠?出口是否足夠用於其他模塊?

使用它編譯時警告我的模塊: WARNING: "machine_power_off" [/path/to/module.ko] undefined! 在主機(3.2.0-4-AMD64)我可以加載這個模塊,但在VirtualBox的(3.16.0-4-AMD64)產生的以下消息: insmod: ERROR: could not insert module module.ko: Unknown symbol in module

爲什麼將此模塊加載到我的主機系統中,而不是VirtualBox中?

回答

3
/proc/kallsyms

標記「T」是指符號是全局可見的,並且可以在其他內核的代碼被使用(例如,通過驅動器,編譯內置)。

但是爲了能夠在內核模塊的代碼中使用,需要使用EXPORT_SYMBOL或類似符號導出符號。導出的符號列表與內核中所有符號列表分開維護。

導出的符號可以在文件/lib/modules/<kernel-version>/build/Module.symvers中找到。

(該文件應該存在可能性,以針對給定的內核構建內核模塊)。

3

要使用是全球性的,而不是出口(如你所提到的machine_power_off符號)內核符號,你可以在你的模塊代碼中使用kallsyms_lookup

#include <linux/kallsyms.h> 

static void (*machine_power_off_p)(void); 
machine_power_off_p = (void*) kallsyms_lookup_name("machine_power_off"); 

現在你可以調用machine_power_off通過machine_power_off_p指針功能:

(*machine_power_off_p)(); 
+0

這隻會工作,如果'kallsyms_lookup_name'還遠銷(有些版本沒有它導出) – redgetan

+0

您的代碼導致多個錯誤。 – Melab

+0

報告的錯誤之一是關於衝突類型。 – Melab