问题描述
我想创建一些测试来查看 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 (将#修改为@)