2013-11-04 50 views
2

我们知道,当我们想要导出符号时使用__ EXPORT_SYMBOL。 我发现存在 exort.h 宏正如你可以看到它下面:当我使用__EXPORT_SYMBOL时为什么只有一个部分

#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”秒 “+” #sym),未使用))“ 我相信这意味着这个变量(无符号long _ kcrctab ## sym)将被放置在一个特殊的部分,其名称是(” _kcrctab“sec”+“#sym).Doesn't这意味着最终的精灵文件中会有很多部分? 但是,我使用readelf实用程序检查vmlinux,我发现只有一个部分。 __kcrctab_gpl。它的大小是0x3F40。 你能帮我吗。我是一个新来的人。

回答

1

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

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

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

有很多事情在这些链接脚本怎么回事,但这里的基本思想是,这一切生活在'__kcrctab + *'部分放入__kcrctab。

相关问题