如我们所知,当我们想要导出符号时,使用__ EXPORT_SYMBOL。 我发现有一个宏 exort.h 如下所示:
#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
有一行:“属性((( _kcrctab”sec“+”#sym),未使用))“ 我相信这意味着这个变量(unsigned long _ kcrctab ## sym)将被放置在一个特殊的部分中,其名称为(“ _kcrctab”sec“+”#sym)。这不意味着最终的精灵文件中会有很多部分吗? 但是,我使用readelf实用程序来检查vmlinux,我发现只有一个部分。 __kcrctab_gpl。它的大小是0x3F40。 请你帮助我好吗。我是新来的人。
答案 0 :(得分:1)
它们被链接描述文件映射回.rodata。
来自arm版本:./ arch / arm / kernel / vmlinux.lds
__kcrctab : AT(ADDR(__kcrctab) - 0) {
__start___kcrctab = .;
*(SORT(___kcrctab+*)) __stop___kcrctab = .;
}
这些链接描述文件中有很多内容,但这里的基本思想是将'__kcrctab + *'部分中的所有内容放入__kcrctab。