我正在努力将内核地址清理程序(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
工具链生成的代码?或者只是为进一步搜索设置方向。
谢谢。
您不需要任何特殊函数调用堆栈检测 - 阴影内存在函数序言中通过内联存储中毒(并且在结尾中未被中毒)。
您使用哪个GCC版本?全球化的仪器仅在GCC 5.0(在this patch中)进行,并且没有向后移植到4.9分支。另一种选择是你忘了使用-fno-common
这是necessary to instrument common symbols。