启用LLVM的MemorySanitizer是否会更改库的ABI

LLVM项目MemorySanitizer很难满足约束,即所有系统库也必须使用MemorySanitizer构建。

我一直在考虑为我正在从事的项目(已经使用ASAN和UBSAN)启用MSAN的一些方法,特别是针对此约束。我一直在考虑的一种可能的解决方案将导致以下情况:使用-fsanitize=memory编译项目时,它将链接到诸如libc和{{1}之类的动态系统库的非仪器版本。 },然后说libstdc++(添加一个实际上不是“工具链”的一部分)。但是然后在运行时,检测到的二进制文件将在特殊的环境(基本上是不同的用户空间)中运行,在该环境中,所有系统动态库都是使用libcrypto构建的。

这样的方案可行吗?在我看来,这取决于是否使用-fsanitize=memory构建库是否更改了它的ABI,因为如果库ABI在测试版本和非测试版本之间有所不同,则针对非仪表系统动态库构建的映像就是在具有检测的系统库的环境中启动时,将在运行时灾难性地失败。

yangfengx 回答:启用LLVM的MemorySanitizer是否会更改库的ABI

  

如果库ABI在测试版本和非测试版本之间有所不同,则针对非仪表系统动态库构建的映像将在运行时严重崩溃

首先,使用-fsanitize=memory进行编译确实会更改ABI,例如通过向函数调用中添加其他(影子)操作数。这意味着在运行时将已清理和未清理的代码结合在一起可能会崩溃。

另一方面,Msan不会更改链接时库ABI,即它不会更改符号大小或名称,因此库的外部接口(即ELF符号表的内容)用{ {1}}不变。

这意味着链接到未经过消毒的版本,然后通过已消毒的版本进行运行即可。

本文链接:https://www.f2er.com/3049296.html

大家都在问