summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorKai Germaschewski <kai@tp1.ruhr-uni-bochum.de>2003-02-03 03:00:34 -0600
committerKai Germaschewski <kai@tp1.ruhr-uni-bochum.de>2003-02-03 03:00:34 -0600
commitc99e695c30119b1f7e79ae8bb5c73ef5fa736e99 (patch)
treef3d4e2570a3e2325c9a9c83ba2e9e067a6089e0e /include
parentc92cacc2cc8d72a750fc0a5c2aed67f21eadc72b (diff)
parente24c9231f08a7b13ec2a126aa06a3210bd35c4f9 (diff)
Hand merged
Diffstat (limited to 'include')
-rw-r--r--include/asm-generic/vmlinux.lds.h22
-rw-r--r--include/linux/module.h51
2 files changed, 59 insertions, 14 deletions
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 7563b5730aaa..0f09f5b73a69 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -20,10 +20,24 @@
} \
\
/* Kernel symbol table: GPL-only symbols */ \
- __gpl_ksymtab : AT(ADDR(__gpl_ksymtab) - LOAD_OFFSET) { \
- __start___gpl_ksymtab = .; \
- *(__gpl_ksymtab) \
- __stop___gpl_ksymtab = .; \
+ __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \
+ __start___ksymtab_gpl = .; \
+ *(__ksymtab_gpl) \
+ __stop___ksymtab_gpl = .; \
+ } \
+ \
+ /* Kernel symbol table: Normal symbols */ \
+ __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \
+ __start___kcrctab = .; \
+ *(__kcrctab) \
+ __stop___kcrctab = .; \
+ } \
+ \
+ /* Kernel symbol table: GPL-only symbols */ \
+ __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) { \
+ __start___kcrctab_gpl = .; \
+ *(__kcrctab_gpl) \
+ __stop___kcrctab_gpl = .; \
} \
\
/* Kernel symbol table: strings */ \
diff --git a/include/linux/module.h b/include/linux/module.h
index 5b2fb9d19be3..53b4d2ea5987 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -33,12 +33,19 @@
#endif
#define MODULE_NAME_LEN (64 - sizeof(unsigned long))
+
struct kernel_symbol
{
unsigned long value;
const char *name;
};
+struct modversion_info
+{
+ unsigned long crc;
+ char name[MODULE_NAME_LEN];
+};
+
/* These are either module local, or the kernel's dummy ones. */
extern int init_module(void);
extern void cleanup_module(void);
@@ -92,7 +99,7 @@ extern const struct gtype##_id __mod_##gtype##_table \
*/
#define MODULE_LICENSE(license) \
static const char __module_license[] \
- __attribute__((section(".init.license"))) = license
+ __attribute__((section(".init.license"), unused)) = license
#else /* !MODULE */
@@ -119,6 +126,7 @@ struct kernel_symbol_group
unsigned int num_syms;
const struct kernel_symbol *syms;
+ const unsigned long *crcs;
};
/* Given an address, look for it in the exception tables */
@@ -134,29 +142,52 @@ struct exception_table
#ifdef CONFIG_MODULES
+
/* Get/put a kernel symbol (calls must be symmetric) */
void *__symbol_get(const char *symbol);
void *__symbol_get_gpl(const char *symbol);
#define symbol_get(x) ((typeof(&x))(__symbol_get(MODULE_SYMBOL_PREFIX #x)))
+#ifdef __GENKSYMS__
+
+/* genksyms doesn't handle GPL-only symbols yet */
+#define EXPORT_SYMBOL_GPL EXPORT_SYMBOL
+
+#else
+
+#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 \
+ __attribute__((section("__kcrctab" sec), 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) \
+#define __EXPORT_SYMBOL(sym, sec) \
+ __CRC_SYMBOL(sym, sec) \
static const char __kstrtab_##sym[] \
__attribute__((section("__ksymtab_strings"))) \
= MODULE_SYMBOL_PREFIX #sym; \
static const struct kernel_symbol __ksymtab_##sym \
- __attribute__((section("__ksymtab"))) \
+ __attribute__((section("__ksymtab" sec), unused)) \
= { (unsigned long)&sym, __kstrtab_##sym }
-#define EXPORT_SYMBOL_NOVERS(sym) EXPORT_SYMBOL(sym)
+#define EXPORT_SYMBOL(sym) \
+ __EXPORT_SYMBOL(sym, "")
#define EXPORT_SYMBOL_GPL(sym) \
- static const char __kstrtab_##sym[] \
- __attribute__((section("__ksymtab_strings"))) \
- = MODULE_SYMBOL_PREFIX #sym; \
- static const struct kernel_symbol __ksymtab_##sym \
- __attribute__((section("__gpl_ksymtab"))) \
- = { (unsigned long)&sym, __kstrtab_##sym }
+ __EXPORT_SYMBOL(sym, "_gpl")
+
+#endif
+
+/* We don't mangle the actual symbol anymore, so no need for
+ * special casing EXPORT_SYMBOL_NOVERS */
+#define EXPORT_SYMBOL_NOVERS(sym) EXPORT_SYMBOL(sym)
struct module_ref
{