3

我正在將Linux模塊(PageMgrMod)移植到更新的內核,但現在這些函數對其他模塊不可見。例如,當裝入使用PageMgrMod模塊提供了錯誤現有的Linux模塊符號

no symbol version for init_pgmgr 
    Unknown symbol init_pgmgr 

但是看完/proc/kallsyms顯示符號存在

ffffffff81883c0d T x86_init_pgd_noop 
    ffffffffa012a5c0 r __ksymtab_init_pgmgr [PageMgrMod] 
    ffffffffa012a669 r __kstrtab_init_pgmgr [PageMgrMod] 
    ffffffffa012a600 r __kcrctab_init_pgmgr [PageMgrMod] 
    ffffffffa012a380 T init_pgmgr [PageMgrMod] 

此功能在2.6.18內核的工作,但未能在2.6.32- 24內核。

我已經看到類似的問題,但這些解決方案沒有幫助,因爲我無法修改其他模塊。

如果有差別,模塊源位於不同的文件夾中。

+0

你從'PageMgrMod'模塊使用Module.symvers文件當你構建一個使用'PageMgrMod'模塊?使用不正確的.symvers文件(或根本沒有文件)可能會導致您描述的錯誤。 – Eugene

回答

0

爲了init_pgmgr其它模塊可見的,加

EXPORT_SYMBOL(init_pgmgr); 

PageMgrMod模塊。如果沒有上述聲明,該符號可用於內核中的任何代碼(稱爲某些地方爲外部符號),但不適用於其他可加載模塊。

這是類似的質疑#413955 How to write Linux driver module call/use another driver module?

+0

感謝您的回覆,我已經爲我的函數使用了EXPORT_SYMBOL marco。這些符號對其他模塊是可見的,但它們的版本似乎不是他們應該的。總體而言,我無法真正理解爲什麼我會收到這些消息,因爲所有的東西都在舊版本的內核中工作。 – user973523