forked from mirrors/linux
		
	module: Sort exported symbols
This patch places every exported symbol in its own section (i.e. "___ksymtab+printk"). Thus the linker will use its SORT() directive to sort and finally merge all symbol in the right and final section (i.e. "__ksymtab"). The symbol prefixed archs use an underscore as prefix for symbols. To avoid collision we use a different character to create the temporary section names. This work was supported by a hardware donation from the CE Linux Forum. Signed-off-by: Alessio Igor Bogani <abogani@kernel.org> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> (folded in '+' fixup) Tested-by: Dirk Behme <dirk.behme@googlemail.com>
This commit is contained in:
		
							parent
							
								
									de4d8d5346
								
							
						
					
					
						commit
						f02e8a6596
					
				
					 3 changed files with 23 additions and 12 deletions
				
			
		|  | @ -274,70 +274,70 @@ | |||
| 	/* Kernel symbol table: Normal symbols */			\ | ||||
| 	__ksymtab         : AT(ADDR(__ksymtab) - LOAD_OFFSET) {		\ | ||||
| 		VMLINUX_SYMBOL(__start___ksymtab) = .;			\ | ||||
| 		*(__ksymtab)						\ | ||||
| 		*(SORT(___ksymtab+*))					\ | ||||
| 		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)					\ | ||||
| 		*(SORT(___ksymtab_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)					\ | ||||
| 		*(SORT(___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)					\ | ||||
| 		*(SORT(___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)					\ | ||||
| 		*(SORT(___ksymtab_gpl_future+*))			\ | ||||
| 		VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .;	\ | ||||
| 	}								\ | ||||
| 									\ | ||||
| 	/* Kernel symbol table: Normal symbols */			\ | ||||
| 	__kcrctab         : AT(ADDR(__kcrctab) - LOAD_OFFSET) {		\ | ||||
| 		VMLINUX_SYMBOL(__start___kcrctab) = .;			\ | ||||
| 		*(__kcrctab)						\ | ||||
| 		*(SORT(___kcrctab+*))					\ | ||||
| 		VMLINUX_SYMBOL(__stop___kcrctab) = .;			\ | ||||
| 	}								\ | ||||
| 									\ | ||||
| 	/* Kernel symbol table: GPL-only symbols */			\ | ||||
| 	__kcrctab_gpl     : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) {	\ | ||||
| 		VMLINUX_SYMBOL(__start___kcrctab_gpl) = .;		\ | ||||
| 		*(__kcrctab_gpl)					\ | ||||
| 		*(SORT(___kcrctab_gpl+*))				\ | ||||
| 		VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .;		\ | ||||
| 	}								\ | ||||
| 									\ | ||||
| 	/* Kernel symbol table: Normal unused symbols */		\ | ||||
| 	__kcrctab_unused  : AT(ADDR(__kcrctab_unused) - LOAD_OFFSET) {	\ | ||||
| 		VMLINUX_SYMBOL(__start___kcrctab_unused) = .;		\ | ||||
| 		*(__kcrctab_unused)					\ | ||||
| 		*(SORT(___kcrctab_unused+*))				\ | ||||
| 		VMLINUX_SYMBOL(__stop___kcrctab_unused) = .;		\ | ||||
| 	}								\ | ||||
| 									\ | ||||
| 	/* Kernel symbol table: GPL-only unused symbols */		\ | ||||
| 	__kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \ | ||||
| 		VMLINUX_SYMBOL(__start___kcrctab_unused_gpl) = .;	\ | ||||
| 		*(__kcrctab_unused_gpl)					\ | ||||
| 		*(SORT(___kcrctab_unused_gpl+*))			\ | ||||
| 		VMLINUX_SYMBOL(__stop___kcrctab_unused_gpl) = .;	\ | ||||
| 	}								\ | ||||
| 									\ | ||||
| 	/* Kernel symbol table: GPL-future-only symbols */		\ | ||||
| 	__kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \ | ||||
| 		VMLINUX_SYMBOL(__start___kcrctab_gpl_future) = .;	\ | ||||
| 		*(__kcrctab_gpl_future)					\ | ||||
| 		*(SORT(___kcrctab_gpl_future+*))			\ | ||||
| 		VMLINUX_SYMBOL(__stop___kcrctab_gpl_future) = .;	\ | ||||
| 	}								\ | ||||
| 									\ | ||||
|  |  | |||
|  | @ -224,7 +224,7 @@ struct module_use { | |||
| 	extern void *__crc_##sym __attribute__((weak));		\ | ||||
| 	static const unsigned long __kcrctab_##sym		\ | ||||
| 	__used							\ | ||||
| 	__attribute__((section("__kcrctab" sec), unused))	\ | ||||
| 	__attribute__((section("___kcrctab" sec "+" #sym), unused))	\ | ||||
| 	= (unsigned long) &__crc_##sym; | ||||
| #else | ||||
| #define __CRC_SYMBOL(sym, sec) | ||||
|  | @ -239,7 +239,7 @@ struct module_use { | |||
| 	= MODULE_SYMBOL_PREFIX #sym;                    	\ | ||||
| 	static const struct kernel_symbol __ksymtab_##sym	\ | ||||
| 	__used							\ | ||||
| 	__attribute__((section("__ksymtab" sec), unused))	\ | ||||
| 	__attribute__((section("___ksymtab" sec "+" #sym), unused))	\ | ||||
| 	= { (unsigned long)&sym, __kstrtab_##sym } | ||||
| 
 | ||||
| #define EXPORT_SYMBOL(sym)					\ | ||||
|  |  | |||
|  | @ -5,4 +5,15 @@ | |||
|  */ | ||||
| SECTIONS { | ||||
| 	/DISCARD/ : { *(.discard) } | ||||
| 
 | ||||
| 	__ksymtab		: { *(SORT(___ksymtab+*)) } | ||||
| 	__ksymtab_gpl		: { *(SORT(___ksymtab_gpl+*)) } | ||||
| 	__ksymtab_unused	: { *(SORT(___ksymtab_unused+*)) } | ||||
| 	__ksymtab_unused_gpl	: { *(SORT(___ksymtab_unused_gpl+*)) } | ||||
| 	__ksymtab_gpl_future	: { *(SORT(___ksymtab_gpl_future+*)) } | ||||
| 	__kcrctab		: { *(SORT(___kcrctab+*)) } | ||||
| 	__kcrctab_gpl		: { *(SORT(___kcrctab_gpl+*)) } | ||||
| 	__kcrctab_unused	: { *(SORT(___kcrctab_unused+*)) } | ||||
| 	__kcrctab_unused_gpl	: { *(SORT(___kcrctab_unused_gpl+*)) } | ||||
| 	__kcrctab_gpl_future	: { *(SORT(___kcrctab_gpl_future+*)) } | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Alessio Igor Bogani
						Alessio Igor Bogani