【问题标题】:Why does ASAN_SYMBOLIZER_PATH no longer work with version adorned binaries为什么 ASAN_SYMBOLIZER_PATH 不再适用于版本修饰的二进制文件
【发布时间】:2016-10-30 23:46:29
【问题描述】:

在 Ubuntu 14.10 上,llvm-symbolizer 程序安装为 /usr/bin/llvm-symbolizer-3.5。通常,地址清理程序希望在PATH 中找到一个名为llvm-symbolizer 的二进制文件。但是,作为一种解决方法,可以显式设置ASAN_SYMBOLIZER_PATH。因此,在环境中设置 ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.5 将使地址净化器检测程序打印符号化错误。

在 Ubuntu 16.04 上,llvm-symbolizer 程序再次以版本后缀安装,现在为 /usr/bin/llvm-symbolizer-3.8。但是,ASAN_SYMBOLIZER_PATH 设置似乎不再起作用。当 ASAN 检测到错误时,在环境中运行设置了 ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.8 的 ASAN 检测程序会生成以下错误:

==18718==ERROR: External symbolizer path is set to '/usr/bin/llvm-symbolizer-3.8' which isn't a known symbolizer. Please set the path to the llvm-symbolizer binary or other known tool.

有谁知道为什么这种行为会改变,或者如何恢复旧的行为?这似乎是不合理的限制。我指向 ASAN 的符号程序绝对是一个已知的符号程序,它恰好在末尾有一个 Ubuntu 强制版本标记。

请注意,调整 PATH 在这里没有帮助,因为 Ubuntu 不会提供没有版本修饰的 llvm-symbolizer 二进制文件。

【问题讨论】:

  • 对于遇到此问题的任何其他人,这似乎是 [compiler_rt 中的此更改][1] 的结果。我已经对评论进行了 ping 操作,试图确定这种行为变化是否是有意的,或者这是否是一种回归 [1]:reviews.llvm.org/D8285
  • 解决此问题的最简单方法:sudo ln -s /usr/bin/llvm-symbolizer-3.8 /usr/bin/llvm-symbolizer
  • @Eraden 当然,这在我的开发盒上运行良好,但这是针对我无法更改 /usr/bin 的 CI 系统。

标签: ubuntu clang ubuntu-16.04 address-sanitizer


【解决方案1】:

事实证明,在 Ubuntu 的 LLVM 打包中,可以从路径 /usr/lib/llvm-3.x/bin 获取未经修饰的 llvm-symbolizer 二进制文件,因此 PATH=/usr/lib/llvm-3.x/bin:$PATH [COMMAND] 可以解决问题。我仍然认为这种变化是 compiler_rt 的回归。

【讨论】:

    【解决方案2】:

    以下

    sudo ln -s /usr/bin/llvm-symbolizer-3.8 /usr/bin/llvm-symbolizer
    

    也适用于llvm-symbolizer-4.0

    (复制自@Eraden 评论)

    【讨论】:

      【解决方案3】:

      当我不小心将一个不必要的换行符写入ASAN_SYMBOLIZER_PATH env var 时,我遇到了这个错误。所以我在将其写入环境变量之前使用 strip() 函数对其进行了修复。

      【讨论】:

        猜你喜欢
        • 2018-05-23
        • 2010-12-10
        • 1970-01-01
        • 2016-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-25
        • 2020-06-06
        相关资源
        最近更新 更多