#ifndef __MODULE_H #define __MODULE_H #include #include #include #ifndef MODULE_SYMBOL_PREFIX #define MODULE_SYMBOL_PREFIX #endif #define MODULE_NAME_LEN (64 - sizeof(unsigned long)) #define THIS_MODULE 0 #ifdef CONFIG_MODULES #include struct kernel_symbol { unsigned long value; const char *name; }; struct module * load_module(void *mod_image, unsigned long len); /* For every exported symbol, place a struct in the __ksymtab section */ #define __EXPORT_SYMBOL(sym, sec) \ extern typeof(sym) sym; \ static const char __ustrtab_##sym[] \ __attribute__((section("__usymtab_strings"))) \ = MODULE_SYMBOL_PREFIX #sym; \ static const struct kernel_symbol __usymtab_##sym \ __used \ __attribute__((section("__usymtab" sec), unused)) \ = { (unsigned long)&sym, __ustrtab_##sym } #define EXPORT_SYMBOL(sym) \ __EXPORT_SYMBOL(sym, "") #define EXPORT_SYMBOL_GPL(sym) \ __EXPORT_SYMBOL(sym, "") struct module { /* Unique handle for this module */ char name[MODULE_NAME_LEN]; /* Startup function. */ int (*init)(void); /* Here is the actual code + data, free'd on unload. */ void *module_core; /* Arch-specific module values */ struct mod_arch_specific arch; unsigned long core_size; struct list_head list; }; /* Apply the given relocation to the (simplified) ELF. Return -error or 0. */ int apply_relocate(Elf_Shdr *sechdrs, const char *strtab, unsigned int symindex, unsigned int relsec, struct module *mod); /* Apply the given add relocation to the (simplified) ELF. Return -error or 0 */ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab, unsigned int symindex, unsigned int relsec, struct module *mod); #else #define EXPORT_SYMBOL(sym) #define EXPORT_SYMBOL_GPL(sym) #endif /* CONFIG_MODULES */ extern struct list_head module_list; #define for_each_module(m) \ list_for_each_entry(m, &module_list, list) #endif /* __MODULE_H */