是否可以使用 clang-cfi 保护来编译 deal.II?

问题描述

我想创建一些测试来查看 Clang CFI 的性能影响。我最初的尝试失败了,因为我试图用 clang-11 cfi 编译 deal.II(版本 9.2.0),但在构建时遇到了多个问题。 (deal.II 对我很感兴趣,因为它在构建提供的一些示例程序中执行了数千次转换)

建筑

我在 CMakeList.txt 文件添加了以下附加组件构建 deal.II

set(CMAKE_C_COMPILER /lib/llvm-11/bin/clang)
set(CMAKE_CXX_COMPILER /lib/llvm-11/bin/clang++)
set(CLANG11_CFI_FLAGS "-fsanitize=cfi -flto -fvisibility=hidden ")
set(DEAL_II_CXX_FLAGS "${CLANG11_CFI_FLAGS} ${DEAL_II_CXX_FLAGS} ")
set(DEAL_II_LINKER_FLAGS "${CLANG11_CFI_FLAGS}  ${DEAL_II_LINKER_FLAGS} ") 

这产生了多个未定义的参考错误。例如

/tmp/lto-llvm-8f380e.o(.rodata..L__unnamed_1+0x170): error: undefined reference to 'dealii::FiniteElement<2,2>::compare_for_face_domination(dealii::FiniteElement<2,2> const&) const'

在网上搜索后,this 堆栈溢出帖子似乎是一个解决方案。这篇文章推荐了生成的静态库并将以下宏添加到 CMakeList.txt 文件中:

SET(CMAKE_AR "llvm-ar")
SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> qcsO <TARGET> <LINK_FLAGS> <OBJECTS>")
SET(CMAKE_C_ARCHIVE_FINISH   true)
SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> qcsO <TARGET> <LINK_FLAGS> <OBJECTS>")
SET(CMAKE_CXX_ARCHIVE_FINISH   true)

并发现这确实会构建交易库,只要设置以下标志以静态生成它们:-DDEAL_II_STATIC_EXECUTABLE=ON

虽然现在已经构建了库,但我无法构建任何示例,因为尝试会生成以下警告

/tmp/lto-llvm-46b907.o:ld-temp.o:function tbb::internal::dynamic_link(char const*,tbb::internal::dynamic_link_descriptor const*,unsigned long,void**,int): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

并且在运行时会导致 Illegal instruction (core dumped)

我尝试了几件事,主要是更改用于构建示例的链接器标志,但到目前为止,没有任何效果。似乎要使用 CFI 编译 deal.II 库,它们必须是静态的。但是要将它们链接到任何示例,它们必须是动态的。因此似乎不可能...

如果有人对静态/动态链接和 clang cfi 有更好的了解,可以指出我正确的方向,我们将不胜感激。即使答案是不可能的...非常感谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)