About exporting symbols from an external module

Chetan Nanda chetannanda at gmail.com
Tue Jan 14 02:52:13 EST 2014


On Tue, Jan 14, 2014 at 12:38 PM, Le Tan <tamlokveer at gmail.com> wrote:

> Thanks very much! I will try that later. What you mentioned is another
> amazing sight. But I am confused that why it can't work if I export a
> function from my module and call it in the kvm? Do I have to modify the
> makefile of kvm? How? I have referenced to the doc of KBuild. It said that :
>      Sometimes, an external module uses exported symbols from
>     another external module. kbuild needs to have full knowledge of
>     all symbols to avoid spliitting out warnings about undefined
>     symbols. Three solutions exist for this situation.
>
>     NOTE: The method with a top-level kbuild file is recommended
>     but may be impractical in certain situations.
>
>     Use a top-level kbuild file
>         If you have two modules, foo.ko and bar.ko, where
>         foo.ko needs symbols from bar.ko, you can use a
>         common top-level kbuild file so both modules are
>         compiled in the same build. Consider the following
>         directory layout:
>
>         ./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 knowledge of symbols from either module.
>
>     Use an extra Module.symvers file
>         When an external module is built, a Module.symvers file
>         is generated containing all exported symbols which are
>         not defined in the kernel. To get access to symbols
>         from bar.ko, copy the Module.symvers file from the
>         compilation of bar.ko to the directory where foo.ko is
>         built. During the module build, kbuild will read the
>         Module.symvers file in the directory of the external
>         module, and when the build is finished, a new
>         Module.symvers file is created containing the sum of
>         all symbols defined and not part of the kernel.
>
>     Use "make" variable KBUILD_EXTRA_SYMBOLS
>         If it is impractical to copy Module.symvers from
>         another module, you can assign a space separated list
>         of files to KBUILD_EXTRA_SYMBOLS in your build file.
>         These files will be loaded by modpost during the
>         initialization of its symbol tables.
>
> But I have tried those methods. They don't work. Why?
> Thanks for your help very much!
>

Please show your kvm module makefile,


>
>

>
> 2014/1/14 Henrique Rodrigues <henriquesilvar at gmail.com>
>
>> Hi Le,
>>
>> You can do that by exporting a function pointer from the kvm code that is
>> only called if it is not null. Then, when you load your module, you set
>> that exported function pointer (I'm assuming that you want to call your
>> module's function from the kvm code... ). Here is a post on how to do that:
>>
>>
>> http://stackoverflow.com/questions/11463184/how-to-use-exported-symbols-in-the-linux-kernel
>>
>> http://stackoverflow.com/questions/1196944/can-i-replace-a-linux-kernel-function-with-a-module
>>
>> Best,
>> --
>> Henrique Rodrigues
>> http://www.dcc.ufmg.br/~hsr
>>
>>
>> On Mon, Jan 13, 2014 at 2:47 AM, Le Tan <tamlokveer at gmail.com> wrote:
>>
>>> Hello! I am writing a device driver module. I define some functions in
>>> the module, for example print_record(). I am doing something in the kvm, so
>>> I want to call print_record() in the file of kvm module, for example, I may
>>> call print_record() in file /arch/x86/kvm/x86.c to put something into my
>>> device driver module.
>>> Now comes the question.
>>> 1. Where should I put the codes of my device driver module? It's the
>>> first time I write the device driver.
>>> 2. After compiling my module, I encounter an error when I compile the
>>> kvm module.
>>>      ERROR: "print_record" [arch/x86/kvm/kvm.ko] undefined!
>>>     I use EXPORT_SYMBOL(print_record) in my module file. I use "extern"
>>> to declare print_record() and then call print_record()  in file x86.c.
>>>     To solve this problem, I have tried to copy the Module.symvers from
>>> my module folder to /arch/x86/kvm/. But it doesn't work. I have also tried
>>> to add *KBUILD_EXTRA_SYMBOLS *to the Makefile of kvm. It doesn't work
>>> either.
>>>     I cat /proc/kallsyms and find that the type of symbol "print_record"
>>> is "t" ( local text). What should I do? How to call functions defined in my
>>> own module from kvm? Maybe there is something wrong in Makefiles?
>>>
>>> Any suggestion is appreciated!
>>> Thanks!
>>>
>>> _______________________________________________
>>> Kernelnewbies mailing list
>>> Kernelnewbies at kernelnewbies.org
>>> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>>>
>>>
>>
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20140114/0db5c0c7/attachment-0001.html 


More information about the Kernelnewbies mailing list