Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os 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>

authored by

Alessio Igor Bogani and committed by
Rusty Russell
f02e8a65 de4d8d53

+23 -12
+10 -10
include/asm-generic/vmlinux.lds.h
··· 274 274 /* Kernel symbol table: Normal symbols */ \ 275 275 __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ 276 276 VMLINUX_SYMBOL(__start___ksymtab) = .; \ 277 - *(__ksymtab) \ 277 + *(SORT(___ksymtab+*)) \ 278 278 VMLINUX_SYMBOL(__stop___ksymtab) = .; \ 279 279 } \ 280 280 \ 281 281 /* Kernel symbol table: GPL-only symbols */ \ 282 282 __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ 283 283 VMLINUX_SYMBOL(__start___ksymtab_gpl) = .; \ 284 - *(__ksymtab_gpl) \ 284 + *(SORT(___ksymtab_gpl+*)) \ 285 285 VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \ 286 286 } \ 287 287 \ 288 288 /* Kernel symbol table: Normal unused symbols */ \ 289 289 __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \ 290 290 VMLINUX_SYMBOL(__start___ksymtab_unused) = .; \ 291 - *(__ksymtab_unused) \ 291 + *(SORT(___ksymtab_unused+*)) \ 292 292 VMLINUX_SYMBOL(__stop___ksymtab_unused) = .; \ 293 293 } \ 294 294 \ 295 295 /* Kernel symbol table: GPL-only unused symbols */ \ 296 296 __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \ 297 297 VMLINUX_SYMBOL(__start___ksymtab_unused_gpl) = .; \ 298 - *(__ksymtab_unused_gpl) \ 298 + *(SORT(___ksymtab_unused_gpl+*)) \ 299 299 VMLINUX_SYMBOL(__stop___ksymtab_unused_gpl) = .; \ 300 300 } \ 301 301 \ 302 302 /* Kernel symbol table: GPL-future-only symbols */ \ 303 303 __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \ 304 304 VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .; \ 305 - *(__ksymtab_gpl_future) \ 305 + *(SORT(___ksymtab_gpl_future+*)) \ 306 306 VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .; \ 307 307 } \ 308 308 \ 309 309 /* Kernel symbol table: Normal symbols */ \ 310 310 __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \ 311 311 VMLINUX_SYMBOL(__start___kcrctab) = .; \ 312 - *(__kcrctab) \ 312 + *(SORT(___kcrctab+*)) \ 313 313 VMLINUX_SYMBOL(__stop___kcrctab) = .; \ 314 314 } \ 315 315 \ 316 316 /* Kernel symbol table: GPL-only symbols */ \ 317 317 __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) { \ 318 318 VMLINUX_SYMBOL(__start___kcrctab_gpl) = .; \ 319 - *(__kcrctab_gpl) \ 319 + *(SORT(___kcrctab_gpl+*)) \ 320 320 VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .; \ 321 321 } \ 322 322 \ 323 323 /* Kernel symbol table: Normal unused symbols */ \ 324 324 __kcrctab_unused : AT(ADDR(__kcrctab_unused) - LOAD_OFFSET) { \ 325 325 VMLINUX_SYMBOL(__start___kcrctab_unused) = .; \ 326 - *(__kcrctab_unused) \ 326 + *(SORT(___kcrctab_unused+*)) \ 327 327 VMLINUX_SYMBOL(__stop___kcrctab_unused) = .; \ 328 328 } \ 329 329 \ 330 330 /* Kernel symbol table: GPL-only unused symbols */ \ 331 331 __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \ 332 332 VMLINUX_SYMBOL(__start___kcrctab_unused_gpl) = .; \ 333 - *(__kcrctab_unused_gpl) \ 333 + *(SORT(___kcrctab_unused_gpl+*)) \ 334 334 VMLINUX_SYMBOL(__stop___kcrctab_unused_gpl) = .; \ 335 335 } \ 336 336 \ 337 337 /* Kernel symbol table: GPL-future-only symbols */ \ 338 338 __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \ 339 339 VMLINUX_SYMBOL(__start___kcrctab_gpl_future) = .; \ 340 - *(__kcrctab_gpl_future) \ 340 + *(SORT(___kcrctab_gpl_future+*)) \ 341 341 VMLINUX_SYMBOL(__stop___kcrctab_gpl_future) = .; \ 342 342 } \ 343 343 \
+2 -2
include/linux/module.h
··· 224 224 extern void *__crc_##sym __attribute__((weak)); \ 225 225 static const unsigned long __kcrctab_##sym \ 226 226 __used \ 227 - __attribute__((section("__kcrctab" sec), unused)) \ 227 + __attribute__((section("___kcrctab" sec "+" #sym), unused)) \ 228 228 = (unsigned long) &__crc_##sym; 229 229 #else 230 230 #define __CRC_SYMBOL(sym, sec) ··· 239 239 = MODULE_SYMBOL_PREFIX #sym; \ 240 240 static const struct kernel_symbol __ksymtab_##sym \ 241 241 __used \ 242 - __attribute__((section("__ksymtab" sec), unused)) \ 242 + __attribute__((section("___ksymtab" sec "+" #sym), unused)) \ 243 243 = { (unsigned long)&sym, __kstrtab_##sym } 244 244 245 245 #define EXPORT_SYMBOL(sym) \
+11
scripts/module-common.lds
··· 5 5 */ 6 6 SECTIONS { 7 7 /DISCARD/ : { *(.discard) } 8 + 9 + __ksymtab : { *(SORT(___ksymtab+*)) } 10 + __ksymtab_gpl : { *(SORT(___ksymtab_gpl+*)) } 11 + __ksymtab_unused : { *(SORT(___ksymtab_unused+*)) } 12 + __ksymtab_unused_gpl : { *(SORT(___ksymtab_unused_gpl+*)) } 13 + __ksymtab_gpl_future : { *(SORT(___ksymtab_gpl_future+*)) } 14 + __kcrctab : { *(SORT(___kcrctab+*)) } 15 + __kcrctab_gpl : { *(SORT(___kcrctab_gpl+*)) } 16 + __kcrctab_unused : { *(SORT(___kcrctab_unused+*)) } 17 + __kcrctab_unused_gpl : { *(SORT(___kcrctab_unused_gpl+*)) } 18 + __kcrctab_gpl_future : { *(SORT(___kcrctab_gpl_future+*)) } 8 19 }