Можно ли скомпилировать Deal.II с защитой clang-cfi?

Я хотел создать несколько тестов, оценивающих влияние Clang CFI на производительность. Мои первоначальные попытки не увенчались успехом, так как я пытался скомпилировать Deal.II (версия 9.2.0) с помощью clang-11 cfi, но у меня было несколько проблем со сборкой. (deal.II меня заинтересовал, поскольку он выполняет тысячи приведений типов в некоторых примерах программ, поставляемых вместе со сборкой)

Здание

Я построил сделку.II со следующими дополнениями к файлу CMakeList.txt

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'

После поиска в Интернете это переполнение стека пост кажется решением. В этом посте рекомендуются сгенерированные статические библиотеки и добавление следующих макросов в файл 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) при запуске.

Я попробовал пару вещей, в основном изменив флаги компоновщика, используемые для сборки примеров, но пока ничего не работает. Похоже, что для компиляции библиотек Deal.II с CFI они должны быть статическими. Но чтобы связать их с любым из примеров, они должны быть динамическими. Поэтому кажется невозможным...

Было бы очень признательно, если бы кто-нибудь, кто лучше разбирается в статической/динамической компоновке и clang cfi, мог бы указать мне правильное направление. Даже если ответ в том, что это невозможно... Большое спасибо


person JustAnotherComputerScientist    schedule 26.01.2021    source источник