作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
正如我们所知,__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
有一行:“attribute((section("_kcrctab"sec "+"#sym), unused))"我相信这意味着这个变量(unsigned long _kcrctab##sym)将被放置在一个特殊的部分,它的名字是(“_kcrctab”sec“+”#sym)。不是说最后的elf文件会有很多section吗?但是,我使用 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。
关于c - 为什么我使用 __EXPORT_SYMBOL 时只得到一个部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19763350/
正如我们所知,__EXPORT_SYMBOL 在我们想要导出我们的符号时使用。我发现里面有个宏 exort.h如下所示: #ifdef CONFIG_MODVERSIONS /* Mark the C
我是一名优秀的程序员,十分优秀!