内核模块中的符号

时间:2013-03-01 16:50:34

标签: linux linker linux-kernel kernel

我构建了Linux内核模块,支持mips架构的SSP。我将 -fstack-protector-all 添加到编译标志中。但是在加载这个模块之后,我得到了对 __ stack_chk_guard __ stack_chk_fail 的未定义引用。但我将 libssp.so 添加到链接器。看起来我应该在内核中导出这些符号:

EXPORT_SYMBOL(__stack_chk_guard);

因为我的内核很旧而且还没有包含它们。但不幸的是我应该使用这个版本。

我的问题是:为什么用户空间可以使用工具链库中的这个符号,但内核空间不能?

我想,我错过了一些Linux内核要领。

2 个答案:

答案 0 :(得分:1)

您无法将内核链接到共享库。如果你有一个libssp的静态库,它可以工作 - 但是它要求库不会调用会导致内核出现问题的其他东西。

一般来说,堆栈检查不是你应该在内核上做的事情 - 我很确定它没有特别好的用途[我也非常确定内核使用“保护页面”每个内核堆栈]。

答案 1 :(得分:1)

您不能在内核空间的任何位置使用共享库(包括作为内核模块的一部分)。

您可以将内核模块本身视为内核空间中的共享库的等价物,但存在很多差异。

内核模块可以依赖于来自其他内核模块的exported symbols

  

我的问题是:为什么用户空间可以使用工具链中的这个符号   库,但内核空间不?

内核空间中没有任何内容可以访问libc C库。内核有自己的内置标准字符串操作函数等,您可以使用它们。工具链库建立在libc之上。

关于Mats的答案+1。您可以使用static library,只要它不依赖于标准C库,例如libc