2013-03-01 63 views
0

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

EXPORT_SYMBOL(__stack_chk_guard); 

因为我的内核是旧的,没有包含他们没有。但不幸的是我应该使用这个版本。

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

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

回答

1

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

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

+0

+1我想你理论上可以从文件加载代码,映射它,执行并重新启动:) – 2013-03-01 17:31:52

1

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

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

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

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

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

对Mats的回答+1。你可以使用一个static library只要它不依赖于标准的C库如libc

+0

谢谢,我用静态库成功构建了我的模块! – Jurasic 2013-03-05 08:52:03