我有一个内核模块,需要访问内核的_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的导出,因此我不相信它们可供您使用。
你想完成什么?

09-05 00:18