linux/include/linux/export.h
<<
>>
Prefs
   1#ifndef _LINUX_EXPORT_H
   2#define _LINUX_EXPORT_H
   3/*
   4 * Export symbols from the kernel to modules.  Forked from module.h
   5 * to reduce the amount of pointless cruft we feed to gcc when only
   6 * exporting a simple symbol or two.
   7 *
   8 * Try not to add #includes here.  It slows compilation and makes kernel
   9 * hackers place grumpy comments in header files.
  10 */
  11
  12/* Some toolchains use a `_' prefix for all user symbols. */
  13#ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX
  14#define __VMLINUX_SYMBOL(x) _##x
  15#define __VMLINUX_SYMBOL_STR(x) "_" #x
  16#else
  17#define __VMLINUX_SYMBOL(x) x
  18#define __VMLINUX_SYMBOL_STR(x) #x
  19#endif
  20
  21/* Indirect, so macros are expanded before pasting. */
  22#define VMLINUX_SYMBOL(x) __VMLINUX_SYMBOL(x)
  23#define VMLINUX_SYMBOL_STR(x) __VMLINUX_SYMBOL_STR(x)
  24
  25#ifndef __ASSEMBLY__
  26struct kernel_symbol
  27{
  28        unsigned long value;
  29        const char *name;
  30};
  31
  32#ifdef MODULE
  33extern struct module __this_module;
  34#define THIS_MODULE (&__this_module)
  35#else
  36#define THIS_MODULE ((struct module *)0)
  37#endif
  38
  39#ifdef CONFIG_MODULES
  40
  41#ifndef __GENKSYMS__
  42#ifdef CONFIG_MODVERSIONS
  43/* Mark the CRC weak since genksyms apparently decides not to
  44 * generate a checksums for some symbols */
  45#define __CRC_SYMBOL(sym, sec)                                  \
  46        extern __visible void *__crc_##sym __attribute__((weak));               \
  47        static const unsigned long __kcrctab_##sym              \
  48        __used                                                  \
  49        __attribute__((section("___kcrctab" sec "+" #sym), unused))     \
  50        = (unsigned long) &__crc_##sym;
  51#else
  52#define __CRC_SYMBOL(sym, sec)
  53#endif
  54
  55/* For every exported symbol, place a struct in the __ksymtab section */
  56#define __EXPORT_SYMBOL(sym, sec)                               \
  57        extern typeof(sym) sym;                                 \
  58        __CRC_SYMBOL(sym, sec)                                  \
  59        static const char __kstrtab_##sym[]                     \
  60        __attribute__((section("__ksymtab_strings"), aligned(1))) \
  61        = VMLINUX_SYMBOL_STR(sym);                              \
  62        extern const struct kernel_symbol __ksymtab_##sym;      \
  63        __visible const struct kernel_symbol __ksymtab_##sym    \
  64        __used                                                  \
  65        __attribute__((section("___ksymtab" sec "+" #sym), unused))     \
  66        = { (unsigned long)&sym, __kstrtab_##sym }
  67
  68#define EXPORT_SYMBOL(sym)                                      \
  69        __EXPORT_SYMBOL(sym, "")
  70
  71#define EXPORT_SYMBOL_GPL(sym)                                  \
  72        __EXPORT_SYMBOL(sym, "_gpl")
  73
  74#define EXPORT_SYMBOL_GPL_FUTURE(sym)                           \
  75        __EXPORT_SYMBOL(sym, "_gpl_future")
  76
  77#ifdef CONFIG_UNUSED_SYMBOLS
  78#define EXPORT_UNUSED_SYMBOL(sym) __EXPORT_SYMBOL(sym, "_unused")
  79#define EXPORT_UNUSED_SYMBOL_GPL(sym) __EXPORT_SYMBOL(sym, "_unused_gpl")
  80#else
  81#define EXPORT_UNUSED_SYMBOL(sym)
  82#define EXPORT_UNUSED_SYMBOL_GPL(sym)
  83#endif
  84
  85#endif  /* __GENKSYMS__ */
  86
  87#else /* !CONFIG_MODULES... */
  88
  89#define EXPORT_SYMBOL(sym)
  90#define EXPORT_SYMBOL_GPL(sym)
  91#define EXPORT_SYMBOL_GPL_FUTURE(sym)
  92#define EXPORT_UNUSED_SYMBOL(sym)
  93#define EXPORT_UNUSED_SYMBOL_GPL(sym)
  94
  95#endif /* CONFIG_MODULES */
  96#endif /* !__ASSEMBLY__ */
  97
  98#endif /* _LINUX_EXPORT_H */
  99