![](/img/trans.png)
[英]Linux Kernel Programming - Module 2 unable to get symbols exported by Module 1
[英]Warning building a kernel module that uses exported symbols
我有兩個內核模塊(比如modA和modB)。 modA使用EXPORT_SYMBOL(symA)
導出符號,modB使用它。 我有modA.h
的頭modA.h
modA.h:
...
extern void symA(int param);
...
在modB.c
:
#include "modA.h"
...
static int __init modB_init(void)
{
symA(10);
}
...
如果我insmod
modB一切正常,我的modB在內核中正確鏈接,並正確調用函數symA
。 但是,當我構建modB時,編譯器會發出警告: symA is undefined
。 LKM是ELF可重定位的,為什么編譯器會發出此警告? 怎么可以刪除?
這個問題(以及如何在這種情況下正確編譯)在http://www.kernel.org/doc/Documentation/kbuild/modules.txt中有解釋。
有時,外部模塊使用來自另一個外部模塊的導出符號。 kbuild需要完全了解所有符號,以避免吐出有關未定義符號的警告。 這種情況存在三種解決方案。
注意:建議使用頂級kbuild文件的方法,但在某些情況下可能不切實際。
使用頂級kbuild文件如果你有兩個模塊,foo.ko和bar.ko,其中foo.ko需要來自bar.ko的符號,你可以使用一個通用的頂級kbuild文件,所以這兩個模塊都是用同一個編譯的建立。 請考慮以下目錄布局:
./foo/ <= contains foo.ko ./bar/ <= contains bar.ko The top-level kbuild file would then look like: #./Kbuild (or ./Makefile): obj-y := foo/ bar/ And executing $ make -C $KDIR M=$PWD will then do the expected and compile both modules with full
任何一個模塊的符號知識。
使用額外的Module.symvers文件構建外部模塊時,會生成Module.symvers文件,其中包含未在內核中定義的所有導出符號。 要從bar.ko訪問符號,請將module.symvers文件從bar.ko的編譯復制到構建foo.ko的目錄。 在模塊構建期間,kbuild將讀取外部模塊目錄中的Module.symvers文件,並且在構建完成時,將創建一個新的Module.symvers文件,其中包含已定義的所有符號的總和,而不是內核的一部分。
使用“make”變量KBUILD_EXTRA_SYMBOLS如果從另一個模塊復制Module.symvers是不切實際的,則可以在構建文件中將空格分隔的文件列表分配給KBUILD_EXTRA_SYMBOLS。 這些文件將在其符號表初始化期間由modpost加載。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.