Commit | Line | Data |
---|---|---|
f5016932 PG |
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 | * | |
b92021b0 RR |
8 | * Try not to add #includes here. It slows compilation and makes kernel |
9 | * hackers place grumpy comments in header files. | |
f5016932 PG |
10 | */ |
11 | ||
12 | /* Some toolchains use a `_' prefix for all user symbols. */ | |
b92021b0 RR |
13 | #ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX |
14 | #define __VMLINUX_SYMBOL(x) _##x | |
15 | #define __VMLINUX_SYMBOL_STR(x) "_" #x | |
f5016932 | 16 | #else |
b92021b0 RR |
17 | #define __VMLINUX_SYMBOL(x) x |
18 | #define __VMLINUX_SYMBOL_STR(x) #x | |
f5016932 PG |
19 | #endif |
20 | ||
b92021b0 RR |
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__ | |
f5016932 PG |
26 | struct kernel_symbol |
27 | { | |
28 | unsigned long value; | |
29 | const char *name; | |
30 | }; | |
31 | ||
32 | #ifdef MODULE | |
33 | extern 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) \ | |
e0f244c6 | 46 | extern __visible void *__crc_##sym __attribute__((weak)); \ |
f5016932 PG |
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))) \ | |
b92021b0 | 61 | = VMLINUX_SYMBOL_STR(sym); \ |
7b4ec8dd | 62 | extern const struct kernel_symbol __ksymtab_##sym; \ |
e0f244c6 | 63 | __visible const struct kernel_symbol __ksymtab_##sym \ |
f5016932 PG |
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 */ | |
b92021b0 | 96 | #endif /* !__ASSEMBLY__ */ |
f5016932 PG |
97 | |
98 | #endif /* _LINUX_EXPORT_H */ |