summaryrefslogtreecommitdiffstats
path: root/include/linux/symtab_begin.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/symtab_begin.h')
-rw-r--r--include/linux/symtab_begin.h57
1 files changed, 43 insertions, 14 deletions
diff --git a/include/linux/symtab_begin.h b/include/linux/symtab_begin.h
index c6f693687..65a87008c 100644
--- a/include/linux/symtab_begin.h
+++ b/include/linux/symtab_begin.h
@@ -1,16 +1,45 @@
-#ifdef CONFIG_MODVERSIONS /* CONFIG_MODVERSIONS */
-#undef _set_ver
-#undef X
-#ifndef __GENKSYMS__
-#ifdef MODULE
-#define _set_ver(sym,ver) { (void *) & sym ## _R ## ver, "_" #sym "_R" #ver }
-#else /* MODULE */
-#define _set_ver(sym,ver) { (void *) & sym, "_" #sym "_R" #ver }
-#endif /* MODULE */
-#define X(a) a
-#endif /* __GENKSYMS__ */
-#else /* CONFIG_MODVERSIONS */
-#define X(sym) { (void *) & sym, "_" #sym }
-#endif /* CONFIG_MODVERSIONS */
+#include <linux/linkage.h>
+
+#ifdef MODVERSIONS
+# undef _set_ver
+# undef X
+/*
+ * These two macros _will_ get enough arguments from the X* macros
+ * since "sym" expands to "symaddr, symstr" from the #define in *.ver
+ */
+# define _basic_version(symaddr,symstr) symaddr, symstr
+# define _alias_version(really,symaddr,symstr) (void *) & really , symstr
+
+# ifndef __GENKSYMS__
+# ifdef MODULE
+# define _set_ver(sym,ver) \
+ (void *) & sym ## _R ## ver, SYMBOL_NAME_STR(sym) "_R" #ver
+# else /* !MODULE */
+# define _set_ver(sym,ver) \
+ (void *) & sym, SYMBOL_NAME_STR(sym) "_R" #ver
+# endif /* !MODULE */
+# define X(sym) { _basic_version(sym) }
+/*
+ * For _really_ stacked modules:
+ *
+ * Use "Xalias(local_symbol, symbol_from_other_module)"
+ * to make subsequent modules really use "local_symbol"
+ * when they think that they are using "symbol_from_other_module"
+ *
+ * The "aliasing" module can still use "symbol_from_other_module",
+ * but can now replace and/or modify the behaviour of that symbol.
+ */
+# define Xalias(really,sym) { _alias_version(really,sym) }
+# endif /* !__GENKSYMS__ */
+#else /* !MODVERSIONS */
+# define X(sym) { (void *) & sym, SYMBOL_NAME_STR(sym)}
+# define Xalias(really,sym) { (void *) & really, SYMBOL_NAME_STR(sym)}
+#endif /* MODVERSIONS */
+/*
+ * Some symbols always need to be unversioned. This includes
+ * compiler generated calls to functions.
+ */
+#define XNOVERS(sym) { (void *) & sym, SYMBOL_NAME_STR(sym)}
+
#define EMPTY {0,0}
0, 0, 0, {