我有一个内核模块需要访问内核的 _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;
}
这是否意味着我在 /proc/kallsyms
中看到的 _etext
和 _stext
条目是内核模块的假符号实际上不能链接到?
最佳答案
内核模块链接器将仅链接已通过附加机制“导出”的符号:必须使用 EXPORT_SYMBOL()
或 EXPORT_SYMBOL_GPL()
导出符号。 (_GPL
变体表示内核开发人员正在标记一个内部 接口(interface),因此仅可用于 GPL 许可代码。)我找不到任何一个 _stext 的导出
或 _etext
在我的内核源代码中,所以我不相信它们可供您使用。
你想完成什么?
关于c - 2.6 Linux 内核中的 _stext 和 _etext - 为什么我的内核模块不能链接到它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8423792/