About exporting symbols from an external module

Henrique Rodrigues henriquesilvar at gmail.com
Tue Jan 14 14:48:24 EST 2014


You are getting a compile error because the symbol you are trying to export
is not complete.

Step back and think about what you are trying to do. You were initially
trying to export (with EXPORT_SYMBOL) a function that is supposed to be
implemented by your module, but you state that its implementation in
another object file that will be linked later (with the keyword "extern").
You don't provide that implementation, and that is the reason why your
compilation fails.

With a function pointer, however, you are exporting a complete object, that
is a pointer to a function with a certain signature.

This might be confusing at first, specially if you don't know how compilers
work, but I hope this helps.

--
Henrique Rodrigues
http://www.dcc.ufmg.br/~hsr






--
Henrique Rodrigues
http://www.dcc.ufmg.br/~hsr


On Mon, Jan 13, 2014 at 11:08 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!
>
>
>
> 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
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20140114/819dc04c/attachment-0001.html 


More information about the Kernelnewbies mailing list