Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

module: remove EXPORT_UNUSED_SYMBOL*

EXPORT_UNUSED_SYMBOL* is not actually used anywhere. Remove the
unused functionality as we generally just remove unused code anyway.

Reviewed-by: Miroslav Benes <mbenes@suse.cz>
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jessica Yu <jeyu@kernel.org>

authored by

Christoph Hellwig and committed by
Jessica Yu
36794822 f1c3d73e

+13 -193
-1
arch/arm/configs/bcm2835_defconfig
··· 177 177 CONFIG_DYNAMIC_DEBUG=y 178 178 CONFIG_DEBUG_INFO=y 179 179 # CONFIG_ENABLE_MUST_CHECK is not set 180 - CONFIG_UNUSED_SYMBOLS=y 181 180 CONFIG_DEBUG_MEMORY_INIT=y 182 181 CONFIG_LOCKUP_DETECTOR=y 183 182 CONFIG_SCHED_TRACER=y
-1
arch/arm/configs/mxs_defconfig
··· 164 164 CONFIG_PRINTK_TIME=y 165 165 CONFIG_DEBUG_INFO=y 166 166 CONFIG_FRAME_WARN=2048 167 - CONFIG_UNUSED_SYMBOLS=y 168 167 CONFIG_MAGIC_SYSRQ=y 169 168 CONFIG_DEBUG_KERNEL=y 170 169 CONFIG_SOFTLOCKUP_DETECTOR=y
-1
arch/mips/configs/nlm_xlp_defconfig
··· 549 549 CONFIG_DEBUG_INFO=y 550 550 # CONFIG_ENABLE_MUST_CHECK is not set 551 551 CONFIG_FRAME_WARN=1024 552 - CONFIG_UNUSED_SYMBOLS=y 553 552 CONFIG_DEBUG_MEMORY_INIT=y 554 553 CONFIG_DETECT_HUNG_TASK=y 555 554 CONFIG_SCHEDSTATS=y
-1
arch/mips/configs/nlm_xlr_defconfig
··· 500 500 CONFIG_PRINTK_TIME=y 501 501 CONFIG_DEBUG_INFO=y 502 502 # CONFIG_ENABLE_MUST_CHECK is not set 503 - CONFIG_UNUSED_SYMBOLS=y 504 503 CONFIG_DEBUG_MEMORY_INIT=y 505 504 CONFIG_DETECT_HUNG_TASK=y 506 505 CONFIG_SCHEDSTATS=y
-1
arch/parisc/configs/generic-32bit_defconfig
··· 22 22 CONFIG_MODULES=y 23 23 CONFIG_MODULE_UNLOAD=y 24 24 CONFIG_MODULE_FORCE_UNLOAD=y 25 - CONFIG_UNUSED_SYMBOLS=y 26 25 # CONFIG_BLK_DEV_BSG is not set 27 26 # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set 28 27 CONFIG_BINFMT_MISC=m
-1
arch/parisc/configs/generic-64bit_defconfig
··· 31 31 CONFIG_MODULE_UNLOAD=y 32 32 CONFIG_MODULE_FORCE_UNLOAD=y 33 33 CONFIG_MODVERSIONS=y 34 - CONFIG_UNUSED_SYMBOLS=y 35 34 CONFIG_BLK_DEV_INTEGRITY=y 36 35 CONFIG_BINFMT_MISC=m 37 36 # CONFIG_COMPACTION is not set
-1
arch/powerpc/configs/ppc6xx_defconfig
··· 1072 1072 CONFIG_NLS_KOI8_R=m 1073 1073 CONFIG_NLS_KOI8_U=m 1074 1074 CONFIG_DEBUG_INFO=y 1075 - CONFIG_UNUSED_SYMBOLS=y 1076 1075 CONFIG_HEADERS_INSTALL=y 1077 1076 CONFIG_MAGIC_SYSRQ=y 1078 1077 CONFIG_DEBUG_KERNEL=y
-1
arch/s390/configs/debug_defconfig
··· 71 71 CONFIG_MODVERSIONS=y 72 72 CONFIG_MODULE_SRCVERSION_ALL=y 73 73 CONFIG_MODULE_SIG_SHA256=y 74 - CONFIG_UNUSED_SYMBOLS=y 75 74 CONFIG_BLK_DEV_INTEGRITY=y 76 75 CONFIG_BLK_DEV_THROTTLING=y 77 76 CONFIG_BLK_WBT=y
-1
arch/s390/configs/defconfig
··· 66 66 CONFIG_MODVERSIONS=y 67 67 CONFIG_MODULE_SRCVERSION_ALL=y 68 68 CONFIG_MODULE_SIG_SHA256=y 69 - CONFIG_UNUSED_SYMBOLS=y 70 69 CONFIG_BLK_DEV_THROTTLING=y 71 70 CONFIG_BLK_WBT=y 72 71 CONFIG_BLK_CGROUP_IOLATENCY=y
-1
arch/sh/configs/edosk7760_defconfig
··· 102 102 CONFIG_PRINTK_TIME=y 103 103 # CONFIG_ENABLE_MUST_CHECK is not set 104 104 CONFIG_MAGIC_SYSRQ=y 105 - CONFIG_UNUSED_SYMBOLS=y 106 105 CONFIG_DEBUG_KERNEL=y 107 106 CONFIG_DEBUG_SHIRQ=y 108 107 CONFIG_DETECT_HUNG_TASK=y
-1
arch/sh/configs/sdk7780_defconfig
··· 130 130 CONFIG_NLS_UTF8=y 131 131 # CONFIG_ENABLE_MUST_CHECK is not set 132 132 CONFIG_MAGIC_SYSRQ=y 133 - CONFIG_UNUSED_SYMBOLS=y 134 133 CONFIG_DEBUG_KERNEL=y 135 134 CONFIG_DETECT_HUNG_TASK=y 136 135 # CONFIG_SCHED_DEBUG is not set
-1
arch/x86/configs/i386_defconfig
··· 50 50 CONFIG_MODULES=y 51 51 CONFIG_MODULE_UNLOAD=y 52 52 CONFIG_MODULE_FORCE_UNLOAD=y 53 - # CONFIG_UNUSED_SYMBOLS is not set 54 53 CONFIG_BINFMT_MISC=y 55 54 CONFIG_NET=y 56 55 CONFIG_PACKET=y
-1
arch/x86/configs/x86_64_defconfig
··· 48 48 CONFIG_MODULES=y 49 49 CONFIG_MODULE_UNLOAD=y 50 50 CONFIG_MODULE_FORCE_UNLOAD=y 51 - # CONFIG_UNUSED_SYMBOLS is not set 52 51 CONFIG_BINFMT_MISC=y 53 52 CONFIG_NET=y 54 53 CONFIG_PACKET=y
+2 -2
arch/x86/tools/relocs.c
··· 61 61 "(__iommu_table|__apicdrivers|__smp_locks)(|_end)|" 62 62 "__(start|end)_pci_.*|" 63 63 "__(start|end)_builtin_fw|" 64 - "__(start|stop)___ksymtab(|_gpl|_unused|_unused_gpl)|" 65 - "__(start|stop)___kcrctab(|_gpl|_unused|_unused_gpl)|" 64 + "__(start|stop)___ksymtab(|_gpl)|" 65 + "__(start|stop)___kcrctab(|_gpl)|" 66 66 "__(start|stop)___param|" 67 67 "__(start|stop)___modver|" 68 68 "__(start|stop)___bug_table|"
-28
include/asm-generic/vmlinux.lds.h
··· 481 481 __stop___ksymtab_gpl = .; \ 482 482 } \ 483 483 \ 484 - /* Kernel symbol table: Normal unused symbols */ \ 485 - __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \ 486 - __start___ksymtab_unused = .; \ 487 - KEEP(*(SORT(___ksymtab_unused+*))) \ 488 - __stop___ksymtab_unused = .; \ 489 - } \ 490 - \ 491 - /* Kernel symbol table: GPL-only unused symbols */ \ 492 - __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \ 493 - __start___ksymtab_unused_gpl = .; \ 494 - KEEP(*(SORT(___ksymtab_unused_gpl+*))) \ 495 - __stop___ksymtab_unused_gpl = .; \ 496 - } \ 497 - \ 498 484 /* Kernel symbol table: Normal symbols */ \ 499 485 __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \ 500 486 __start___kcrctab = .; \ ··· 493 507 __start___kcrctab_gpl = .; \ 494 508 KEEP(*(SORT(___kcrctab_gpl+*))) \ 495 509 __stop___kcrctab_gpl = .; \ 496 - } \ 497 - \ 498 - /* Kernel symbol table: Normal unused symbols */ \ 499 - __kcrctab_unused : AT(ADDR(__kcrctab_unused) - LOAD_OFFSET) { \ 500 - __start___kcrctab_unused = .; \ 501 - KEEP(*(SORT(___kcrctab_unused+*))) \ 502 - __stop___kcrctab_unused = .; \ 503 - } \ 504 - \ 505 - /* Kernel symbol table: GPL-only unused symbols */ \ 506 - __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \ 507 - __start___kcrctab_unused_gpl = .; \ 508 - KEEP(*(SORT(___kcrctab_unused_gpl+*))) \ 509 - __stop___kcrctab_unused_gpl = .; \ 510 510 } \ 511 511 \ 512 512 /* Kernel symbol table: strings */ \
-8
include/linux/export.h
··· 160 160 #define EXPORT_SYMBOL_NS(sym, ns) __EXPORT_SYMBOL(sym, "", #ns) 161 161 #define EXPORT_SYMBOL_NS_GPL(sym, ns) __EXPORT_SYMBOL(sym, "_gpl", #ns) 162 162 163 - #ifdef CONFIG_UNUSED_SYMBOLS 164 - #define EXPORT_UNUSED_SYMBOL(sym) _EXPORT_SYMBOL(sym, "_unused") 165 - #define EXPORT_UNUSED_SYMBOL_GPL(sym) _EXPORT_SYMBOL(sym, "_unused_gpl") 166 - #else 167 - #define EXPORT_UNUSED_SYMBOL(sym) 168 - #define EXPORT_UNUSED_SYMBOL_GPL(sym) 169 - #endif 170 - 171 163 #endif /* !__ASSEMBLY__ */ 172 164 173 165 #endif /* _LINUX_EXPORT_H */
-12
include/linux/module.h
··· 392 392 const s32 *gpl_crcs; 393 393 bool using_gplonly_symbols; 394 394 395 - #ifdef CONFIG_UNUSED_SYMBOLS 396 - /* unused exported symbols. */ 397 - const struct kernel_symbol *unused_syms; 398 - const s32 *unused_crcs; 399 - unsigned int num_unused_syms; 400 - 401 - /* GPL-only, unused exported symbols. */ 402 - unsigned int num_unused_gpl_syms; 403 - const struct kernel_symbol *unused_gpl_syms; 404 - const s32 *unused_gpl_crcs; 405 - #endif 406 - 407 395 #ifdef CONFIG_MODULE_SIG 408 396 /* Signature was verified. */ 409 397 bool sig_ok;
-17
init/Kconfig
··· 2262 2262 2263 2263 If unsure, say N. 2264 2264 2265 - config UNUSED_SYMBOLS 2266 - bool "Enable unused/obsolete exported symbols" 2267 - default y if X86 2268 - help 2269 - Unused but exported symbols make the kernel needlessly bigger. For 2270 - that reason most of these unused exports will soon be removed. This 2271 - option is provided temporarily to provide a transition period in case 2272 - some external kernel module needs one of these symbols anyway. If you 2273 - encounter such a case in your module, consider if you are actually 2274 - using the right API. (rationale: since nobody in the kernel is using 2275 - this in a module, there is a pretty good chance it's actually the 2276 - wrong interface to use). If you really need the symbol, please send a 2277 - mail to the linux kernel mailing list mentioning the symbol and why 2278 - you really need it, and what the merge plan to the mainline kernel for 2279 - your module is. 2280 - 2281 2265 config TRIM_UNUSED_KSYMS 2282 2266 bool "Trim unused exported kernel symbols" 2283 - depends on !UNUSED_SYMBOLS 2284 2267 help 2285 2268 The kernel and some modules make many symbols available for 2286 2269 other modules to use via EXPORT_SYMBOL() and variants. Depending
+6 -65
kernel/module.c
··· 410 410 extern const struct kernel_symbol __stop___ksymtab_gpl[]; 411 411 extern const s32 __start___kcrctab[]; 412 412 extern const s32 __start___kcrctab_gpl[]; 413 - #ifdef CONFIG_UNUSED_SYMBOLS 414 - extern const struct kernel_symbol __start___ksymtab_unused[]; 415 - extern const struct kernel_symbol __stop___ksymtab_unused[]; 416 - extern const struct kernel_symbol __start___ksymtab_unused_gpl[]; 417 - extern const struct kernel_symbol __stop___ksymtab_unused_gpl[]; 418 - extern const s32 __start___kcrctab_unused[]; 419 - extern const s32 __start___kcrctab_unused_gpl[]; 420 - #endif 421 413 422 414 #ifndef CONFIG_MODVERSIONS 423 415 #define symversion(base, idx) NULL ··· 424 432 NOT_GPL_ONLY, 425 433 GPL_ONLY, 426 434 } license; 427 - bool unused; 428 435 }; 429 436 430 437 struct find_symbol_arg { ··· 447 456 448 457 if (!fsa->gplok && syms->license == GPL_ONLY) 449 458 return false; 450 - 451 - #ifdef CONFIG_UNUSED_SYMBOLS 452 - if (syms->unused && fsa->warn) { 453 - pr_warn("Symbol %s is marked as UNUSED, however this module is " 454 - "using it.\n", fsa->name); 455 - pr_warn("This symbol will go away in the future.\n"); 456 - pr_warn("Please evaluate if this is the right api to use and " 457 - "if it really is, submit a report to the linux kernel " 458 - "mailing list together with submitting your code for " 459 - "inclusion.\n"); 460 - } 461 - #endif 462 - 463 459 fsa->owner = owner; 464 460 fsa->crc = symversion(syms->crcs, symnum); 465 461 fsa->sym = &syms->start[symnum]; ··· 513 535 { 514 536 static const struct symsearch arr[] = { 515 537 { __start___ksymtab, __stop___ksymtab, __start___kcrctab, 516 - NOT_GPL_ONLY, false }, 538 + NOT_GPL_ONLY }, 517 539 { __start___ksymtab_gpl, __stop___ksymtab_gpl, 518 540 __start___kcrctab_gpl, 519 - GPL_ONLY, false }, 520 - #ifdef CONFIG_UNUSED_SYMBOLS 521 - { __start___ksymtab_unused, __stop___ksymtab_unused, 522 - __start___kcrctab_unused, 523 - NOT_GPL_ONLY, true }, 524 - { __start___ksymtab_unused_gpl, __stop___ksymtab_unused_gpl, 525 - __start___kcrctab_unused_gpl, 526 - GPL_ONLY, true }, 527 - #endif 541 + GPL_ONLY }, 528 542 }; 529 543 struct module *mod; 530 544 unsigned int i; ··· 531 561 lockdep_is_held(&module_mutex)) { 532 562 struct symsearch arr[] = { 533 563 { mod->syms, mod->syms + mod->num_syms, mod->crcs, 534 - NOT_GPL_ONLY, false }, 564 + NOT_GPL_ONLY }, 535 565 { mod->gpl_syms, mod->gpl_syms + mod->num_gpl_syms, 536 566 mod->gpl_crcs, 537 - GPL_ONLY, false }, 538 - #ifdef CONFIG_UNUSED_SYMBOLS 539 - { mod->unused_syms, 540 - mod->unused_syms + mod->num_unused_syms, 541 - mod->unused_crcs, 542 - NOT_GPL_ONLY, true }, 543 - { mod->unused_gpl_syms, 544 - mod->unused_gpl_syms + mod->num_unused_gpl_syms, 545 - mod->unused_gpl_crcs, 546 - GPL_ONLY, true }, 547 - #endif 567 + GPL_ONLY }, 548 568 }; 549 569 550 570 if (mod->state == MODULE_STATE_UNFORMED) ··· 2234 2274 } arr[] = { 2235 2275 { mod->syms, mod->num_syms }, 2236 2276 { mod->gpl_syms, mod->num_gpl_syms }, 2237 - #ifdef CONFIG_UNUSED_SYMBOLS 2238 - { mod->unused_syms, mod->num_unused_syms }, 2239 - { mod->unused_gpl_syms, mod->num_unused_gpl_syms }, 2240 - #endif 2241 2277 }; 2242 2278 2243 2279 for (i = 0; i < ARRAY_SIZE(arr); i++) { ··· 3246 3290 &mod->num_gpl_syms); 3247 3291 mod->gpl_crcs = section_addr(info, "__kcrctab_gpl"); 3248 3292 3249 - #ifdef CONFIG_UNUSED_SYMBOLS 3250 - mod->unused_syms = section_objs(info, "__ksymtab_unused", 3251 - sizeof(*mod->unused_syms), 3252 - &mod->num_unused_syms); 3253 - mod->unused_crcs = section_addr(info, "__kcrctab_unused"); 3254 - mod->unused_gpl_syms = section_objs(info, "__ksymtab_unused_gpl", 3255 - sizeof(*mod->unused_gpl_syms), 3256 - &mod->num_unused_gpl_syms); 3257 - mod->unused_gpl_crcs = section_addr(info, "__kcrctab_unused_gpl"); 3258 - #endif 3259 3293 #ifdef CONFIG_CONSTRUCTORS 3260 3294 mod->ctors = section_objs(info, ".ctors", 3261 3295 sizeof(*mod->ctors), &mod->num_ctors); ··· 3426 3480 pr_warn("%s: module license taints kernel.\n", mod->name); 3427 3481 3428 3482 #ifdef CONFIG_MODVERSIONS 3429 - if ((mod->num_syms && !mod->crcs) 3430 - || (mod->num_gpl_syms && !mod->gpl_crcs) 3431 - #ifdef CONFIG_UNUSED_SYMBOLS 3432 - || (mod->num_unused_syms && !mod->unused_crcs) 3433 - || (mod->num_unused_gpl_syms && !mod->unused_gpl_crcs) 3434 - #endif 3435 - ) { 3483 + if ((mod->num_syms && !mod->crcs) || 3484 + (mod->num_gpl_syms && !mod->gpl_crcs)) { 3436 3485 return try_to_force_load(mod, 3437 3486 "no versions for exported symbols"); 3438 3487 }
+2 -4
scripts/checkpatch.pl
··· 4290 4290 if (defined $realline_next && 4291 4291 exists $lines[$realline_next - 1] && 4292 4292 !defined $suppress_export{$realline_next} && 4293 - ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ || 4294 - $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { 4293 + ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/)) { 4295 4294 # Handle definitions which produce identifiers with 4296 4295 # a prefix: 4297 4296 # XXX(foo); ··· 4317 4318 } 4318 4319 if (!defined $suppress_export{$linenr} && 4319 4320 $prevline =~ /^.\s*$/ && 4320 - ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ || 4321 - $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { 4321 + ($line =~ /EXPORT_SYMBOL.*\((.*)\)/)) { 4322 4322 #print "FOO B <$lines[$linenr - 1]>\n"; 4323 4323 $suppress_export{$linenr} = 2; 4324 4324 }
+3 -36
scripts/mod/modpost.c
··· 43 43 static bool error_occurred; 44 44 45 45 enum export { 46 - export_plain, export_unused, export_gpl, 47 - export_unused_gpl, export_unknown 46 + export_plain, 47 + export_gpl, 48 + export_unknown 48 49 }; 49 50 50 51 /* In kernel, this size is defined in linux/module.h; ··· 302 301 enum export export; 303 302 } export_list[] = { 304 303 { .str = "EXPORT_SYMBOL", .export = export_plain }, 305 - { .str = "EXPORT_UNUSED_SYMBOL", .export = export_unused }, 306 304 { .str = "EXPORT_SYMBOL_GPL", .export = export_gpl }, 307 - { .str = "EXPORT_UNUSED_SYMBOL_GPL", .export = export_unused_gpl }, 308 305 { .str = "(unknown)", .export = export_unknown }, 309 306 }; 310 307 ··· 361 362 362 363 if (strstarts(secname, "___ksymtab+")) 363 364 return export_plain; 364 - else if (strstarts(secname, "___ksymtab_unused+")) 365 - return export_unused; 366 365 else if (strstarts(secname, "___ksymtab_gpl+")) 367 366 return export_gpl; 368 - else if (strstarts(secname, "___ksymtab_unused_gpl+")) 369 - return export_unused_gpl; 370 367 else 371 368 return export_unknown; 372 369 } ··· 371 376 { 372 377 if (sec == elf->export_sec) 373 378 return export_plain; 374 - else if (sec == elf->export_unused_sec) 375 - return export_unused; 376 379 else if (sec == elf->export_gpl_sec) 377 380 return export_gpl; 378 - else if (sec == elf->export_unused_gpl_sec) 379 - return export_unused_gpl; 380 381 else 381 382 return export_unknown; 382 383 } ··· 576 585 info->modinfo_len = sechdrs[i].sh_size; 577 586 } else if (strcmp(secname, "__ksymtab") == 0) 578 587 info->export_sec = i; 579 - else if (strcmp(secname, "__ksymtab_unused") == 0) 580 - info->export_unused_sec = i; 581 588 else if (strcmp(secname, "__ksymtab_gpl") == 0) 582 589 info->export_gpl_sec = i; 583 - else if (strcmp(secname, "__ksymtab_unused_gpl") == 0) 584 - info->export_unused_gpl_sec = i; 585 590 586 591 if (sechdrs[i].sh_type == SHT_SYMTAB) { 587 592 unsigned int sh_link_idx; ··· 2128 2141 error("GPL-incompatible module %s.ko uses GPL-only symbol '%s'\n", 2129 2142 m, s); 2130 2143 break; 2131 - case export_unused_gpl: 2132 - error("GPL-incompatible module %s.ko uses GPL-only symbol marked UNUSED '%s'\n", 2133 - m, s); 2134 - break; 2135 2144 case export_plain: 2136 - case export_unused: 2137 2145 case export_unknown: 2138 - /* ignore */ 2139 - break; 2140 - } 2141 - } 2142 - 2143 - static void check_for_unused(enum export exp, const char *m, const char *s) 2144 - { 2145 - switch (exp) { 2146 - case export_unused: 2147 - case export_unused_gpl: 2148 - warn("module %s.ko uses symbol '%s' marked UNUSED\n", 2149 - m, s); 2150 - break; 2151 - default: 2152 2146 /* ignore */ 2153 2147 break; 2154 2148 } ··· 2165 2197 2166 2198 if (!mod->gpl_compatible) 2167 2199 check_for_gpl_usage(exp->export, basename, exp->name); 2168 - check_for_unused(exp->export, basename, exp->name); 2169 2200 } 2170 2201 } 2171 2202
-2
scripts/mod/modpost.h
··· 139 139 Elf_Sym *symtab_start; 140 140 Elf_Sym *symtab_stop; 141 141 Elf_Section export_sec; 142 - Elf_Section export_unused_sec; 143 142 Elf_Section export_gpl_sec; 144 - Elf_Section export_unused_gpl_sec; 145 143 char *strtab; 146 144 char *modinfo; 147 145 unsigned int modinfo_len;
-4
scripts/module.lds.S
··· 11 11 12 12 __ksymtab 0 : { *(SORT(___ksymtab+*)) } 13 13 __ksymtab_gpl 0 : { *(SORT(___ksymtab_gpl+*)) } 14 - __ksymtab_unused 0 : { *(SORT(___ksymtab_unused+*)) } 15 - __ksymtab_unused_gpl 0 : { *(SORT(___ksymtab_unused_gpl+*)) } 16 14 __kcrctab 0 : { *(SORT(___kcrctab+*)) } 17 15 __kcrctab_gpl 0 : { *(SORT(___kcrctab_gpl+*)) } 18 - __kcrctab_unused 0 : { *(SORT(___kcrctab_unused+*)) } 19 - __kcrctab_unused_gpl 0 : { *(SORT(___kcrctab_unused_gpl+*)) } 20 16 21 17 .init_array 0 : ALIGN(8) { *(SORT(.init_array.*)) *(.init_array) } 22 18
-2
tools/include/linux/export.h
··· 3 3 4 4 #define EXPORT_SYMBOL(sym) 5 5 #define EXPORT_SYMBOL_GPL(sym) 6 - #define EXPORT_UNUSED_SYMBOL(sym) 7 - #define EXPORT_UNUSED_SYMBOL_GPL(sym) 8 6 9 7 #endif