我有一个内核模块,需要访问内核的_stext
和_etext
符号。出于某种原因,即使内核有这些符号的定义(/proc/kallsyms
),每当我加载模块时
mymodule: Unknown symbol _etext (err 0)
mymodule: Unknown symbol _stext (err 0)
我没有运行受污染的内核,模块中的其他内容似乎都链接正常。链接到
_stext
和_etext
是否有模块或许可证限制?内核中是否有可用于代码内存开始和结束的替换定义?更新:
我正在查看内核源代码,在
kallsyms.c
中,有这样一个:static int read_symbol_tr(const char *sym, unsigned long long addr)
{
size_t i;
struct text_range *tr;
for (i = 0; i < ARRAY_SIZE(text_ranges); ++i) {
tr = &text_ranges[i];
if (strcmp(sym, tr->stext) == 0) {
tr->start = addr;
return 0;
} else if (strcmp(sym, tr->etext) == 0) {
tr->end = addr;
return 0;
}
}
return 1;
}
这是否意味着我看到的
_etext
和_stext
条目是内核模块实际上无法链接到的伪符号? 最佳答案
内核模块链接器将只链接通过附加机制“导出”的符号:必须使用EXPORT_SYMBOL()
或EXPORT_SYMBOL_GPL()
导出符号。(变量_GPL
表示内核开发人员正在标记一个内部接口,因此仅对gpl许可代码可用。)我在内核源代码上找不到_stext
或_etext
的导出,因此我不相信它们可供您使用。
你想完成什么?