asan 库失败,影子内存范围与现有内存映射交错

问题描述 投票:0回答:3

当您加载 lib asan 时,它会失败并出现以下错误: 影子内存范围与现有内存映射交错。 ASan 无法正确进行。正在流产。

我使用 LD_PRELOAD 加载库,然后启动该过程,但失败,如上述错误。

提前致谢。

debugging memory compilation
3个回答
2
投票

我发现 32 位目标出现此问题的原因在 AddressSanitizer FAQ 中未提及。如果你的堆栈大小是无限的(即你已经运行了

ulimit -s unlimited
),那么在进程映射的顶部会保留大量的地址空间,供堆栈增长。这意味着动态链接器、vdso、libasan.so 和其他共享库加载在 0x2aaab000 及以下(对于我来说在 x86 上),这与 ASAN 希望使用的地址范围冲突。

这种情况并不常见,因为 Linux 上的默认软堆栈限制是 8192,这在 ASAN 的共享库下方留下了充足的地址空间。解决方法是设置更合适的堆栈大小限制。


2
投票

对于任何其他通过谷歌搜索并在此结束的人:在我的情况下,错误是类似的(Ubuntu 22.04 / kernel 5.15),根本原因是该程序与 libasan.so.6 和 libasan.so 链接。 8.

加载两者的原因是无效的编译器设置——我不小心混合了(系统默认)gcc-11和更新的g++-12。

编译器很高兴,启动时东西就爆炸了。

当我强制使用 gcc-12 的 env CC 时,它被修复了。


0
投票

该问题也可能是由于在 Linux 上启用 KASLR 引起的,例如使用 linux-hardened:

https://github.com/google/sanitizers/issues/837

https://github.com/google/sanitizers/issues/820

在这种情况下,请从强化版本切换内核或使用“nokaslr”启动选项禁用 KASLR:

https://github.com/google/sanitizers/issues/820#issuecomment-1162655994

© www.soinside.com 2019 - 2024. All rights reserved.