Как я могу связать с потоком дезинфицирующее средство с более новой версией Clang, чем система? - PullRequest
0 голосов
/ 21 декабря 2018

Я обычно скачиваю последнюю версию clang с их сайта .Это помогает мне использовать последнюю версию C ++, так как это невозможно с помощью gcc.Я просто получаю двоичные файлы для своего Ubuntu / Debian, и я готов к работе.

Для меня соединение с библиотекой tsan (библиотекой потокового дезинфицирующего средства) никогда не было чем-то простым.Я использую безумные меры в cmake, чтобы заставить его работать.Ранее, когда я использовал gcc из системы, это то, что я делал в cmake, чтобы заставить ссылку работать правильно:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -ltsan")
set(CMAKE_LINK_LIBRARY_FLAG "-ltsan -l")

, которая в основном изменяет флаги связывания, чтобы связать каждую мелочь с tsan.Некоторое время это работало нормально, но чтобы заставить его работать, я должен использовать gcc, системный компилятор.Если я пытаюсь связать это с помощью clang 7, то при запуске моей программы я получаю ошибку segfault.

Поэтому я искал доступные библиотеки tsan, которые поставляются с clang, и вот что я нашел:

user@machine:/opt/clang7$ find -iname "*tsan*"
./lib/clang/7.0.0/lib/linux/libclang_rt.tsan_cxx-x86_64.a
./lib/clang/7.0.0/lib/linux/libclang_rt.tsan-x86_64.a
./lib/clang/7.0.0/lib/linux/libclang_rt.tsan_cxx-x86_64.a.syms
./lib/clang/7.0.0/lib/linux/libclang_rt.tsan-x86_64.a.syms
./lib/clang/7.0.0/include/sanitizer/tsan_interface_atomic.h
./lib/clang/7.0.0/include/sanitizer/tsan_interface.h

Кажется, там есть библиотеки цанов.Я полагаю, я должен связаться с ними.Как мне это сделать?

Это, похоже, не работает:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -L/opt/clang7/lib/clang/7.0.0/lib/linux/ -lclang_rt.tsan_cxx-x86_64")
set(CMAKE_LINK_LIBRARY_FLAG "-L/opt/clang7/lib/clang/7.0.0/lib/linux/ -lclang_rt.tsan_cxx-x86_64 -l")

Это тоже не работает:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -l:/opt/clang7/lib/clang/7.0.0/lib/linux/libclang_rt.tsan_cxx-x86_64.a")
set(CMAKE_LINK_LIBRARY_FLAG "-l:/opt/clang7/lib/clang/7.0.0/lib/linux/libclang_rt.tsan_cxx-x86_64.a -l")

Iперепробовал несколько других комбинаций.Но ни один из них, похоже, не работает.Ошибки, которые я получаю, связаны либо с ошибками, либо с неопределенными ссылками на некоторые компоненты tsan.

Как я могу ссылаться на tsan из готовых двоичных файлов новейшего клана?

1 Ответ

0 голосов
/ 21 декабря 2018

Установка флага ссылки для компиляции - это большое нет-нет:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread")

Тогда вам нужно сделать то же самое и для флагов ссылки:

SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread") 
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=thread")

Вытакже может изменять только целевые свойства:

set_target_properties(${TARGET} PROPERTIES
    LINK_FLAGS -fsanitizer=thread
    COMPILE_FLAGS -fsanitizer=thread)

Имейте в виду, что это переопределяет все флаги (я не помню, если CMAKE_CXX_FLAGS также есть, возможно, нет), вы можете получить текущиеи добавьте их вместо удаления всего.

clang знает, где находятся его вспомогательные библиотеки для санитарии (как вы сказали, они помечены тройной информацией и не находятся в обычных папках библиотеки, чтобы избежать любого загрязненияиз других установок), и полный флаг fsanitize=tsan заставит его поднять эти версии.Обратите внимание, что это не -ltsan, а полная опция, которая заставит clang подобрать правильный бэкэнд в пути, где находятся его собственные дезинфицирующие средства.

...