c - 2.6 Linux 内核中的 _stext 和 _etext - 为什么我的内核模块不能链接到它们?

标签 c linux module kernel driver

我有一个内核模块需要访问内核的 _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/

相关文章:

c - 在 c 头文件中使用 define

java - 重复的 Java 进程卡在 GNU/Linux 服务器的单个用户上

java - 大型企业 Java 应用程序 - 模块化

python - __init__.so(而不是 __init__.py)掩码子包

javascript - 可以卸载、删除或不需要 Nodejs 模块

c - OCaml:链接 C 和 OCaml 的问题

c - 确保释放锁的宏

c - 如何从Linux中的C获取当前时间(以毫秒为单位)?

arrays - Bash-SSH到关联数组中的主机

c++ - 异步的令人费解的行为