I’ve created import-kernel-symbols,
which is a tiny python script to generate headers importing non-exported (non EXPORT_SYMBOL
decorated) kernel symbols.
Motivation
When crafting / testing / experimenting kernel modules, occationally you need to call non-exported kernel symbols.
If you can call non-exported symbols without attaching EXPORT_SYMBOL
to those symbols, you can try using these functions without modifying / recompiling the kernel.
In addition to this benefit, you can keep your kernel module simple, loadable and external. It’s a desirable feature for in-house kernel modules. (When you to upstream it, you simply modify the kernel :))
This python script generates references to the specified non-exported symbols.
It extracts symbol kernel space address from System.map
, and generates header for easy use.
Usage
First you need to create the importing header template, imported.h.in
. This sample is located under example/
directory.
1 2 3 4 5 6 7 8 9 10 11 |
|
Next, passing it and appropriate System.map
to import-kernel-symbols.py
script.
System.map
is a file containing symbols and addresses in kernel itself. Typically (in Ubuntu case) it is located under /boot/System.map-$(uname -r)
, or /lib/modules/$(uname -r)/build/System.map
.
Note that this System.map
file permission is sometimes set as -rw-------
with owner root
. In this case, you need to sudo
to read System.map
or change permission of this file.
After hitting the command such as python import-kernel-symbols.py imported.h.in System.map
, it will dump the generated header. The example is below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
OK! Now, since all symbols are resolved by this header correctly, you can call the hidden symbol via special syntax.
In the case of handle_mm_fault
,
1
|
|
Note that since it skips EXPORT_SYMBOL_GPL
license check, take care of the license of your module.
In this case, maybe, releasing code as GPL
is the most conservative approach I think.
Happy Hacking ;)