--- 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 = .);