Дезинфицирующее средство неопределенного поведения Clang в общей библиотеке (JNI): неопределенный символ: __ubsan_vptr_type_cache

Наша сборка исполняемых файлов clang++ с дезинфицирующим средством неопределенного поведения отлично работает для исполняемых файлов при компиляции следующим образом:

ccache clang++ -Qunused-arguments -fcolor-diagnostics -c -MMD -MP -std=c++11 --O1 -g3 -fPIC -fsanitize=address,undefined -fno-omit-frame-pointer -I /usr/lib/jvm/java-8-openjdk-amd64/include -I /usr/lib/jvm/java-8-openjdk-amd64/include/linux -o native/instrumen.o native/instrument.cpp

И связан с исполняемым файлом следующим образом:

ccache clang++ -Qunused-arguments -fcolor-diagnostics -fsanitize=address,undefined -o cegis -Wl,--start-group native/instrument.o -Wl,--end-group

Однако, если мы свяжем его в общей библиотеке следующим образом:

ccache clang++ -Qunused-arguments -fcolor-diagnostics -fsanitize=address,undefined -shared -o libsynth4j.so native/synth4j.o native/instrument.o ../lib/libinfo.a

Мы получаем следующую ошибку при попытке загрузить библиотеку из Java с помощью JNI:

libsynth4j.so: undefined symbol: __ubsan_vptr_type_cache

Есть ли какие-либо дополнительные соображения при создании разделяемых библиотек вместо исполняемых файлов с использованием дезинфицирующего средства Clang неопределенного поведения? Наша версия clang++ — 3.7, работающая на Ubuntu Linux.


person Pascal Kesseli    schedule 28.03.2018    source источник
comment
обходной путь для ошибки (на основе stackoverflow.com/a/50621267/104453) заключается в предварительной загрузке общей библиотеки с символ: LD_PRELOAD=$(clang -print-file-name=libclang_rt.ubsan_standalone-x86_64.so)   -  person marcin    schedule 19.03.2021