Commit 707f853d authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Masahiro Yamada
Browse files

module: Provide EXPORT_SYMBOL_GPL_FOR_MODULES() helper



Helper macro to more easily limit the export of a symbol to a given
list of modules.

Eg:

  EXPORT_SYMBOL_GPL_FOR_MODULES(preempt_notifier_inc, "kvm");

will limit the use of said function to kvm.ko, any other module trying
to use this symbol will refure to load (and get modpost build
failures).

Requested-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
Requested-by: default avatarChristoph Hellwig <hch@infradead.org>
Signed-off-by: default avatarPeter Zijlstra <peterz@infradead.org>
Reviewed-by: default avatarPetr Pavlu <petr.pavlu@suse.com>
Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
parent 0267cbf2
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -28,6 +28,9 @@ kernel. As of today, modules that make use of symbols exported into namespaces,
are required to import the namespace. Otherwise the kernel will, depending on
its configuration, reject loading the module or warn about a missing import.

Additionally, it is possible to put symbols into a module namespace, strictly
limiting which modules are allowed to use these symbols.

2. How to define Symbol Namespaces
==================================

@@ -83,6 +86,22 @@ unit as preprocessor statement. The above example would then read::
within the corresponding compilation unit before the #include for
<linux/export.h>. Typically it's placed before the first #include statement.

2.3 Using the EXPORT_SYMBOL_GPL_FOR_MODULES() macro
===================================================

Symbols exported using this macro are put into a module namespace. This
namespace cannot be imported.

The macro takes a comma separated list of module names, allowing only those
modules to access this symbol. Simple tail-globs are supported.

For example:

  EXPORT_SYMBOL_GPL_FOR_MODULES(preempt_notifier_inc, "kvm,kvm-*")

will limit usage of this symbol to modules whoes name matches the given
patterns.

3. How to use Symbols exported in Namespaces
============================================

@@ -154,3 +173,6 @@ in-tree modules::
You can also run nsdeps for external module builds. A typical usage is::

	$ make -C <path_to_kernel_src> M=$PWD nsdeps

Note: it will happily generate an import statement for the module namespace;
which will not work and generates build and runtime failures.
+10 −2
Original line number Diff line number Diff line
@@ -24,11 +24,17 @@
	.long sym
#endif

#define ___EXPORT_SYMBOL(sym, license, ns)		\
/*
 * LLVM integrated assembler cam merge adjacent string literals (like
 * C and GNU-as) passed to '.ascii', but not to '.asciz' and chokes on:
 *
 *   .asciz "MODULE_" "kvm" ;
 */
#define ___EXPORT_SYMBOL(sym, license, ns...)		\
	.section ".export_symbol","a"		ASM_NL	\
	__export_symbol_##sym:			ASM_NL	\
		.asciz license			ASM_NL	\
		.asciz ns			ASM_NL	\
		.ascii ns "\0"			ASM_NL	\
		__EXPORT_SYMBOL_REF(sym)	ASM_NL	\
	.previous

@@ -85,4 +91,6 @@
#define EXPORT_SYMBOL_NS(sym, ns)	__EXPORT_SYMBOL(sym, "", ns)
#define EXPORT_SYMBOL_NS_GPL(sym, ns)	__EXPORT_SYMBOL(sym, "GPL", ns)

#define EXPORT_SYMBOL_GPL_FOR_MODULES(sym, mods) __EXPORT_SYMBOL(sym, "GPL", "module:" mods)

#endif /* _LINUX_EXPORT_H */