为什么 clang sanitizer 在链接共享库时不链接 sanitizer 运行时

acm*_*acm 5 c++ linker shared-libraries address-sanitizer ubsan

在地址清理程序的文档中(https://releases.llvm.org/7.0.0/tools/clang/docs/AddressSanitizer.html),它指出:

链接共享库时,AddressSanitizer运行时未链接,因此-Wl,-z,defs可能会导致链接错误

不仅 ASAN 如此,UBSAN 也是如此。事实证明,这对于 UBSAN 来说特别不方便,因为清理程序可以在库之间引入新的类型信息依赖关系( https://jira.mongodb.org/browse/SERVER-49798vptr中有很多详细信息)。

我真的更喜欢使用-Wl,-z,defsUBSAN 构建。实际上,我可以通过手动将诸如-lclang_rt.ubsan_standalone-x86_64共享库的链接行之类的内容注入到编译过程中的 ubsan 构建中来实现这一点。

但这给我留下了一个棘手的问题:为什么链接驱动程序在链接共享库时不clang根据显式文档自动执行此操作?它显然可以做到这一点,因为它已经为自动获取运行时的程序做到了这一点。事实上,它明确并没有让我怀疑这样做是否存在某种问题。

  • 由于某种原因,将运行时库强制ubsan到所有共享库的链接线上是否是一个坏主意?
  • 它是否会以某种方式削弱消毒剂的有效性?
  • 还有其他我没有看到的可怕的缺点吗?