2013-11-04 71 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。

相關問題