[英]symbols in kernel module
我构建了Linux内核模块,支持mips架构的SSP。 我在编译标志中添加了-fstack-protector-all 。 但是在加载这个模块后,我得到了对__stack_chk_guard和__stack_chk_fail的未定义引用。 但我将libssp.so添加到链接器。 看起来我应该在内核中导出这些符号,如下所示:
EXPORT_SYMBOL(__stack_chk_guard);
因为我的内核很旧而且还没有包含它们。 但不幸的是我应该使用这个版本。
我的问题是:为什么用户空间可以使用工具链库中的这个符号,但内核空间不行?
我想,我错过了一些Linux内核要领。
您无法将内核链接到共享库。 如果你有一个libssp的静态库,它可以工作 - 但是它要求库不会调用会导致内核出现问题的其他东西。
一般来说,堆栈检查不是你应该在内核上做的事情 - 我很确定它没有特别好的用途[我也很确定内核为每个内核堆栈使用“保护页面” ]。
您不能在内核空间中的任何位置使用共享库(包括作为内核模块的一部分)。
您可以将内核模块本身视为内核空间中的共享库的等价物,但存在很多差异。
内核模块可以依赖于来自其他内核模块的exported symbols
。
我的问题是:为什么用户空间可以使用工具链库中的这个符号,但内核空间不行?
内核空间中没有任何内容可以访问libc
C库。 内核有自己的内置标准字符串操作函数等,您可以使用它们。 工具链库建立在libc
之上。
Mats的回答是+1。 您可以使用static library
,只要它不依赖于像libc
这样的标准C库
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.