启动错误:Shadow memory range interleaves with an existing memory mapping. ASan cannot proceed correctly. ABORTING
ASan shadow was supposed to be located in the [0x1ffff000-0x3fffffff] range.
地址消毒使用影子内存判断读写越界问题,影子内存在地址消毒初始化时被分配,
x86程序,地址消毒需要的影子内存从[0x1ffff000-0x3fffffff] ,一旦这部分内存被其他人占用,地址消毒则启动失败
0x08048000-0x19c7e000 /home/HiDisk/l00167020/br_test_modem_llt_on_linux_20170527/vendor/hisi/llt/gas/ut/utproj_test_v7
0x19c7e000-0x212cf000 /home/HiDisk/l00167020/br_test_modem_llt_on_linux_20170527/vendor/hisi/llt/gas/ut/utproj_test_v7
0x212cf000-0x23773000
可以看到,程序进程代码加载从0x08048000开始,那么到地址消毒要求的内存0x1ffff000中间共有402354176大约400M空间,那么x86程序加上地址消毒编译好的进程占用的空间如果超过400M则地址消毒就会报上边的错误
一般占用这么大空间的程序主要是有大的全局变量声明,把全局变量改成用堆分配就能解决。
asan的编译开关 -fsanitize=undefined 对进程的内存占用影响非常大,会占用很多的内存,增大text段、data段和BSS段,也可能导致王浩贴子里说的这个问题。如果有遇到这个问题的话,建议先关闭 -fsanitize=undefined 这个开关试试。
同时 -fsanitize=undefined 对编译出来的二进制文件大小影响也很大,在我的测试中,打开和去除这个编译选项,生成的二进制文件大小差了一倍。
一般程序过大都是有些大的全局变量,找到后用malloc分配可以解决