diff options
Diffstat (limited to 'target/linux/generic-2.6/patches-2.6.31/028-module_exports.patch')
-rw-r--r-- | target/linux/generic-2.6/patches-2.6.31/028-module_exports.patch | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/target/linux/generic-2.6/patches-2.6.31/028-module_exports.patch b/target/linux/generic-2.6/patches-2.6.31/028-module_exports.patch new file mode 100644 index 000000000..1af1a5036 --- /dev/null +++ b/target/linux/generic-2.6/patches-2.6.31/028-module_exports.patch @@ -0,0 +1,212 @@ +--- a/include/asm-generic/vmlinux.lds.h ++++ b/include/asm-generic/vmlinux.lds.h +@@ -55,6 +55,27 @@ + #define LOAD_OFFSET 0 + #endif + ++#ifndef SYMTAB_KEEP_STR ++#define SYMTAB_KEEP_STR *(__ksymtab_strings.*) ++#define SYMTAB_DISCARD_STR ++#else ++#define SYMTAB_DISCARD_STR *(__ksymtab_strings.*) ++#endif ++ ++#ifndef SYMTAB_KEEP ++#define SYMTAB_KEEP *(__ksymtab.*) ++#define SYMTAB_DISCARD ++#else ++#define SYMTAB_DISCARD *(__ksymtab.*) ++#endif ++ ++#ifndef SYMTAB_KEEP_GPL ++#define SYMTAB_KEEP_GPL *(__ksymtab_gpl.*) ++#define SYMTAB_DISCARD_GPL ++#else ++#define SYMTAB_DISCARD_GPL *(__ksymtab_gpl.*) ++#endif ++ + #ifndef VMLINUX_SYMBOL + #define VMLINUX_SYMBOL(_sym_) _sym_ + #endif +@@ -256,35 +277,35 @@ + /* Kernel symbol table: Normal symbols */ \ + __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ + VMLINUX_SYMBOL(__start___ksymtab) = .; \ +- *(__ksymtab) \ ++ SYMTAB_KEEP \ + VMLINUX_SYMBOL(__stop___ksymtab) = .; \ + } \ + \ + /* Kernel symbol table: GPL-only symbols */ \ + __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ + VMLINUX_SYMBOL(__start___ksymtab_gpl) = .; \ +- *(__ksymtab_gpl) \ ++ SYMTAB_KEEP_GPL \ + VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \ + } \ + \ + /* Kernel symbol table: Normal unused symbols */ \ + __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \ + VMLINUX_SYMBOL(__start___ksymtab_unused) = .; \ +- *(__ksymtab_unused) \ ++ *(__ksymtab_unused.*) \ + VMLINUX_SYMBOL(__stop___ksymtab_unused) = .; \ + } \ + \ + /* Kernel symbol table: GPL-only unused symbols */ \ + __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \ + VMLINUX_SYMBOL(__start___ksymtab_unused_gpl) = .; \ +- *(__ksymtab_unused_gpl) \ ++ *(__ksymtab_unused_gpl.*) \ + VMLINUX_SYMBOL(__stop___ksymtab_unused_gpl) = .; \ + } \ + \ + /* Kernel symbol table: GPL-future-only symbols */ \ + __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \ + VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .; \ +- *(__ksymtab_gpl_future) \ ++ *(__ksymtab_gpl_future.*) \ + VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .; \ + } \ + \ +@@ -325,7 +346,13 @@ + \ + /* Kernel symbol table: strings */ \ + __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ +- *(__ksymtab_strings) \ ++ SYMTAB_KEEP_STR \ ++ } \ ++ \ ++ /DISCARD/ : { \ ++ SYMTAB_DISCARD \ ++ SYMTAB_DISCARD_GPL \ ++ SYMTAB_DISCARD_STR \ + } \ + \ + /* __*init sections */ \ +--- a/include/linux/module.h ++++ b/include/linux/module.h +@@ -188,16 +188,24 @@ void *__symbol_get_gpl(const char *symbo + #define __CRC_SYMBOL(sym, sec) + #endif + ++#ifdef MODULE ++#define __EXPORT_SUFFIX(sym) ++#else ++#define __EXPORT_SUFFIX(sym) "." #sym ++#endif ++ + /* For every exported symbol, place a struct in the __ksymtab section */ + #define __EXPORT_SYMBOL(sym, sec) \ + extern typeof(sym) sym; \ + __CRC_SYMBOL(sym, sec) \ + static const char __kstrtab_##sym[] \ +- __attribute__((section("__ksymtab_strings"), aligned(1))) \ ++ __attribute__((section("__ksymtab_strings" \ ++ __EXPORT_SUFFIX(sym)), aligned(1))) \ + = MODULE_SYMBOL_PREFIX #sym; \ + static const struct kernel_symbol __ksymtab_##sym \ + __used \ +- __attribute__((section("__ksymtab" sec), unused)) \ ++ __attribute__((section("__ksymtab" sec \ ++ __EXPORT_SUFFIX(sym)), unused)) \ + = { (unsigned long)&sym, __kstrtab_##sym } + + #define EXPORT_SYMBOL(sym) \ +--- a/Makefile ++++ b/Makefile +@@ -986,7 +986,7 @@ prepare: prepare0 + # Leave this as default for preprocessing vmlinux.lds.S, which is now + # done in arch/$(ARCH)/kernel/Makefile + +-export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH) ++export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH) $(EXTRA_LDSFLAGS) + + # The asm symlink changes when $(ARCH) changes. + # Detect this and ask user to run make mrproper +--- a/arch/arm/kernel/vmlinux.lds.S ++++ b/arch/arm/kernel/vmlinux.lds.S +@@ -79,26 +79,6 @@ SECTIONS + #endif + } + +- /DISCARD/ : { /* Exit code and data */ +- EXIT_TEXT +- EXIT_DATA +- *(.exitcall.exit) +- *(.ARM.exidx.exit.text) +- *(.ARM.extab.exit.text) +-#ifndef CONFIG_HOTPLUG_CPU +- *(.ARM.exidx.cpuexit.text) +- *(.ARM.extab.cpuexit.text) +-#endif +-#ifndef CONFIG_HOTPLUG +- *(.ARM.exidx.devexit.text) +- *(.ARM.extab.devexit.text) +-#endif +-#ifndef CONFIG_MMU +- *(.fixup) +- *(__ex_table) +-#endif +- } +- + .text : { /* Real text segment */ + _text = .; /* Text and read-only data */ + __exception_text_start = .; +@@ -205,6 +185,28 @@ SECTIONS + __bss_stop = .; + _end = .; + } ++ ++ /DISCARD/ : { /* Exit code and data */ ++ EXIT_TEXT ++ EXIT_DATA ++ *(.discard) ++ *(.exitcall.exit) ++ *(.ARM.exidx.exit.text) ++ *(.ARM.extab.exit.text) ++#ifndef CONFIG_HOTPLUG_CPU ++ *(.ARM.exidx.cpuexit.text) ++ *(.ARM.extab.cpuexit.text) ++#endif ++#ifndef CONFIG_HOTPLUG ++ *(.ARM.exidx.devexit.text) ++ *(.ARM.extab.devexit.text) ++#endif ++#ifndef CONFIG_MMU ++ *(.fixup) ++ *(__ex_table) ++#endif ++ } ++ + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } +--- a/arch/powerpc/kernel/vmlinux.lds.S ++++ b/arch/powerpc/kernel/vmlinux.lds.S +@@ -37,12 +37,6 @@ jiffies = jiffies_64 + 4; + #endif + SECTIONS + { +- /* Sections to be discarded. */ +- /DISCARD/ : { +- *(.exitcall.exit) +- EXIT_DATA +- } +- + . = KERNELBASE; + + /* +@@ -295,6 +289,12 @@ SECTIONS + __bss_stop = .; + } + ++ /* Sections to be discarded. */ ++ /DISCARD/ : { ++ *(.exitcall.exit) ++ EXIT_DATA ++ } ++ + . = ALIGN(PAGE_SIZE); + _end = . ; + PROVIDE32 (end = .); |