解决 clang-3.7 缺少 Asan 错误的解决方法

解决 clang-3.7 缺少 Asan 错误的解决方法

有一个已知错误,因为 Debian libclang 包似乎是用 autotools 编译的,但只有库的 cmake 构建才会生成用于清理器的库。

该漏洞影响 libclang-common-3.7。它会导致以下链接错误:

/usr/bin/ld.gold: error: cannot open /usr/lib/llvm-3.7/bin/../lib/clang/3.7.0/lib/linux/libclang_rt.asan-x86_64.a: No such file or directory
/usr/bin/ld.gold: error: cannot open /usr/lib/llvm-3.7/bin/../lib/clang/3.7.0/lib/linux/libclang_rt.asan_cxx-x86_64.a: No such file or directory
error: undefined reference to '__asan_option_detect_stack_use_after_return'
error: undefined reference to '__asan_stack_malloc_5'
error: undefined reference to '__asan_report_load4'
error: undefined reference to '__asan_report_load8'
error: undefined reference to '__asan_report_load8'
error: undefined reference to '__asan_handle_no_return'
error: undefined reference to '__asan_report_store_n'
...

我只是想知道人们是如何解决这个问题的。

对我来说,这是一件大事。我很惊讶这个错误几个月都没修复,而且似乎没有引起太多关注。

答案1

我也对这个错误存在了这么久感到惊讶。我认为它实际上现在已经修复了,但似乎没有任何计划更新旧软件包。幸运的是,事实证明,安装后修复损坏的软件包相当容易。您只需下载正确的库,并将它们放在正确的目录中。

首先,转到http://llvm.org/releases/download.html并找到匹配的版本。我运行的是 64 位 Ubuntu 14.04,因此要修补 clang-3.8,我需要“Clang for x86_64 Ubuntu 14.04”。直接下载,或复制右键单击并“复制链接地址”并使用 wget:

wget http://llvm.org/releases/3.8.0/clang+llvm-3.8.0-x86_64-linux-gnu-ubuntu-14.04.tar.xz

解压缩:

tar -xf clang+llvm-3.8.0-x86_64-linux-gnu-ubuntu-14.04.tar.xz

然后复制库文件(使用 -n 以避免覆盖现有文件):

sudo cp -n clang+llvm-3.8.0-x86_64-linux-gnu/lib/clang/3.8.0/lib/linux/*.a /usr/lib/llvm-3.8/lib/clang/3.8.0/lib/linux/

如果需要,请对已安装的任何旧版本的 clang 重复此操作,但请注意,如果您使用的 Linux 内核比 4.1 更新,而 clang 版本早于 3.8,您可能会遇到 -fsanitize=memory 的另一个错误:https://llvm.org/bugs/show_bug.cgi?id=24155

答案2

我的解决方法是使用 Clang 3.6 软件包。如果您确实需要 3.7,则需要从源代码构建它。

好消息是,它已被确认为高优先级错误(见错误 22757)。

相关内容