0

我为 mips 架构构建了带有 SSP 支持的 linux 内核模块。我将-fstack-protector-all添加到编译标志中。但是在加载这个模块后,我对__stack_chk_guard__stack_chk_fail有未定义的引用。但是我将libssp.so添加到链接器中。看起来我应该在内核中导出这些符号,如下所示:

EXPORT_SYMBOL(__stack_chk_guard);

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

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

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

4

2 回答 2

1

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

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

于 2013-03-01T17:28:48.873 回答
1

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

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

内核模块可以依赖于exported symbols其他内核模块。

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

内核空间中没有任何东西可以访问libcC 库。内核有自己的一组内置标准字符串操作函数等,您可以使用它们来代替。工具链库建立在libc.

+1 对 Mats 的回答。static library只要它不依赖于标准 C 库,您就可以使用libc

于 2013-03-01T17:38:09.420 回答