我构建了Linux内核模块,支持mips架构的SSP。我将 -fstack-protector-all 添加到编译标志中。但是在加载这个模块之后,我得到了对 __ stack_chk_guard 和 __ stack_chk_fail 的未定义引用。但我将 libssp.so 添加到链接器。看起来我应该在内核中导出这些符号:
EXPORT_SYMBOL(__stack_chk_guard);
因为我的内核很旧而且还没有包含它们。但不幸的是我应该使用这个版本。
我的问题是:为什么用户空间可以使用工具链库中的这个符号,但内核空间不能?
我想,我错过了一些Linux内核要领。
答案 0 :(得分:1)
您无法将内核链接到共享库。如果你有一个libssp的静态库,它可以工作 - 但是它要求库不会调用会导致内核出现问题的其他东西。
一般来说,堆栈检查不是你应该在内核上做的事情 - 我很确定它没有特别好的用途[我也非常确定内核使用“保护页面”每个内核堆栈]。
答案 1 :(得分:1)
您不能在内核空间的任何位置使用共享库(包括作为内核模块的一部分)。
您可以将内核模块本身视为内核空间中的共享库的等价物,但存在很多差异。
内核模块可以依赖于来自其他内核模块的exported symbols
。
我的问题是:为什么用户空间可以使用工具链中的这个符号 库,但内核空间不?
内核空间中没有任何内容可以访问libc
C库。内核有自己的内置标准字符串操作函数等,您可以使用它们。工具链库建立在libc
之上。
static library
,只要它不依赖于标准C库,例如libc