diff options
Diffstat (limited to 'include/linux/export.h')
| -rw-r--r-- | include/linux/export.h | 89 | 
1 files changed, 89 insertions, 0 deletions
diff --git a/include/linux/export.h b/include/linux/export.h new file mode 100644 index 00000000000..696c0f48afc --- /dev/null +++ b/include/linux/export.h @@ -0,0 +1,89 @@ +#ifndef _LINUX_EXPORT_H +#define _LINUX_EXPORT_H +/* + * Export symbols from the kernel to modules.  Forked from module.h + * to reduce the amount of pointless cruft we feed to gcc when only + * exporting a simple symbol or two. + * + * If you feel the need to add #include <linux/foo.h> to this file + * then you are doing something wrong and should go away silently. + */ + +/* Some toolchains use a `_' prefix for all user symbols. */ +#ifdef CONFIG_SYMBOL_PREFIX +#define MODULE_SYMBOL_PREFIX CONFIG_SYMBOL_PREFIX +#else +#define MODULE_SYMBOL_PREFIX "" +#endif + +struct kernel_symbol +{ +	unsigned long value; +	const char *name; +}; + +#ifdef MODULE +extern struct module __this_module; +#define THIS_MODULE (&__this_module) +#else +#define THIS_MODULE ((struct module *)0) +#endif + +#ifdef CONFIG_MODULES + +#ifndef __GENKSYMS__ +#ifdef CONFIG_MODVERSIONS +/* Mark the CRC weak since genksyms apparently decides not to + * generate a checksums for some symbols */ +#define __CRC_SYMBOL(sym, sec)					\ +	extern void *__crc_##sym __attribute__((weak));		\ +	static const unsigned long __kcrctab_##sym		\ +	__used							\ +	__attribute__((section("___kcrctab" sec "+" #sym), unused))	\ +	= (unsigned long) &__crc_##sym; +#else +#define __CRC_SYMBOL(sym, sec) +#endif + +/* For every exported symbol, place a struct in the __ksymtab section */ +#define __EXPORT_SYMBOL(sym, sec)				\ +	extern typeof(sym) sym;					\ +	__CRC_SYMBOL(sym, sec)					\ +	static const char __kstrtab_##sym[]			\ +	__attribute__((section("__ksymtab_strings"), aligned(1))) \ +	= MODULE_SYMBOL_PREFIX #sym;				\ +	static const struct kernel_symbol __ksymtab_##sym	\ +	__used							\ +	__attribute__((section("___ksymtab" sec "+" #sym), unused))	\ +	= { (unsigned long)&sym, __kstrtab_##sym } + +#define EXPORT_SYMBOL(sym)					\ +	__EXPORT_SYMBOL(sym, "") + +#define EXPORT_SYMBOL_GPL(sym)					\ +	__EXPORT_SYMBOL(sym, "_gpl") + +#define EXPORT_SYMBOL_GPL_FUTURE(sym)				\ +	__EXPORT_SYMBOL(sym, "_gpl_future") + +#ifdef CONFIG_UNUSED_SYMBOLS +#define EXPORT_UNUSED_SYMBOL(sym) __EXPORT_SYMBOL(sym, "_unused") +#define EXPORT_UNUSED_SYMBOL_GPL(sym) __EXPORT_SYMBOL(sym, "_unused_gpl") +#else +#define EXPORT_UNUSED_SYMBOL(sym) +#define EXPORT_UNUSED_SYMBOL_GPL(sym) +#endif + +#endif	/* __GENKSYMS__ */ + +#else /* !CONFIG_MODULES... */ + +#define EXPORT_SYMBOL(sym) +#define EXPORT_SYMBOL_GPL(sym) +#define EXPORT_SYMBOL_GPL_FUTURE(sym) +#define EXPORT_UNUSED_SYMBOL(sym) +#define EXPORT_UNUSED_SYMBOL_GPL(sym) + +#endif /* CONFIG_MODULES */ + +#endif /* _LINUX_EXPORT_H */  |