簡體   English   中英

警告構建使用導出符號的內核模塊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM