2

我正在将内核地址清理程序(KASan)从 linux 移植到另一个操作系统(我们称之为操作系统)。该操作系统使用工具链编译,arm-none-eabi我将以下与 asan 相关的标志传递给编译器:

-fsanitize=kernel-address --param asan-globals=1 --param asan-stack=1 --param asan-instrumentation-with-call-threshold=0

我还实现了不同的__asan_*功能,包括__asan_register_globals__asan_unregister_globals

我的问题是编译器只插入__asan_load*,__asan_store*__asan_handle_no_return函数并忽略全局变量和堆栈。

我进行了调查,发现在 Linux 编译器中插入了全局和堆栈的检测,但 Linux 使用arm-linux-gnueabi工具链。

任何人都可以解释为什么--param asan-globals=1并且--param asan-stack=1不影响使用arm-none-eabi工具链生成的代码吗?或者只是为进一步搜索设定方向。

谢谢。

4

1 回答 1

1

您不需要任何特殊的函数调用来进行堆栈检测 - 影子内存通过函数序言中的内联存储中毒(并且在结尾处未中毒)。

您使用哪个 GCC 版本?全局变量的检测仅在 GCC 5.0(在此补丁中)中完成,并且没有向后移植到 4.9 分支。另一个选项选项是您忘记使用检测常用符号-fno-common所必需的选项。

于 2017-07-19T16:32:57.230 回答