为什么当我使用__EXPORT_SYMBOL时只有一个部分?

我们知道,当我们想要导出我们的符号时使用__ EXPORT_SYMBOL。 我发现exort.h中有一个macros,如下所示:

#ifdef CONFIG_MODVERSIONS /* Mark the CRC weak since genksyms apparently decides not to * generate a checksums for some symbols */ #define __CRC_SYMBOL(sym, sec) \ extern void *__crc_##sym __attribute__((weak)); \ static const unsigned long __kcrctab_##sym \ __used \ __attribute__((section("___kcrctab" sec "+" #sym), unused)) \ = (unsigned long) &__crc_##sym; #else #define __CRC_SYMBOL(sym, sec) #endif 

有一行:“ 属性 ((section(” _kcrctab“sec”+“#sym),unused))”我相信这意味着这个variables(unsigned long _kcrctab ## sym)将被放置在一个特殊的部分,名字是(“ _kcrctab”sec“+”#sym)。这不是说最终的精灵文件中会有很多部分吗? 但是,我使用readelf实用程序来检查vmlinux,我发现只有一个部分。 __kcrctab_gpl。它的大小是0x3F40。 你可以帮我吗。 我是一个新来的人。

它们被链接器脚本映射回.rodata。

从arm版本:./arch/arm/kernel/vmlinux.lds

  __kcrctab : AT(ADDR(__kcrctab) - 0) { __start___kcrctab = .; *(SORT(___kcrctab+*)) __stop___kcrctab = .; } 

这些链接器脚本中有很多事情正在进行,但是这里的基本思想是,生命在'__kcrctab + *'部分的所有东西都被放到__kcrctab中。