我正在努力将内核地址清理程序(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
工具链生成的代码吗?
或者只是为进一步搜索设置方向。
感谢。
答案 0 :(得分:1)
您不需要对堆栈检测进行任何特殊函数调用 - 影子内存在函数序言中通过内联存储中毒(并且在结尾中未被中毒)。
您使用哪种GCC版本?全局变量的检测仅在GCC 5.0中进行(在this patch中)并且没有向后移植到4.9分支。另一个选项是忘记使用> 3,2,1
1
> "abc", "bca", "cba"
'cba'
> [1], [2], [3]
[ 3 ]
-fno-common
。{/ p>