EDIT: Если его TLDR, просто перейдите к нижней части. Его где я спрашиваю: Как настроить проект autotools на использование статической библиотеки?Настроить проект autotools с помощью дезинфицирующих средств Clang в статической конфигурации lib?
Я работаю с несколькими библиотеками с открытым исходным кодом, и я пытаюсь запустить их набор тестов под дезинфицирующими устройствами Клана. Чтобы работать под дезинфицирующими веществами Clang, нам необходимо (1) указать некоторые параметры и (2) связать статические библиотеки от Clang's Compiler-RT по мере необходимости. Примечание: нет динамических библиотек или общих объектов.
Настройка параметров легко:
export DYLD_FALLBACK_LIBRARY_PATH=/usr/local/lib/clang/3.3/lib/darwin/
export CC=/usr/local/bin/clang
export CXX=/usr/local/bin/clang++
export CFLAGS="-g3 -fsanitize=address -fsanitize=undefined"
export CXXFLAGS="-g3 -fsanitize=address -fsanitize=undefined -fno-sanitize=vptr"
./configure
Однако, это создаст некоторые предупреждения архива (когда AR
запускается) и ошибки компоновки (когда LD
запускается) с неопределенными символами. Сообщение будет похоже на:
libjpeg.a(jmemmgr.o): In function `do_sarray_io':
/home/jwalton/jpeg-6b/jmemmgr.c:695: undefined reference to
`__ubsan_handle_type_mismatch'
/home/jwalton/jpeg-6b/jmemmgr.c:695: undefined reference to
`__ubsan_handle_type_mismatch'
/home/jwalton/jpeg-6b/jmemmgr.c:696: undefined reference to
`__ubsan_handle_type_mismatch'
Я знаю библиотеки, которые необходимо связать. Для дезинфицирующих средств, которые я использую, это libclang_rt.asan_osx.a
и libclang_rt.ubsan_osx.a
(или libclang_rt.full-x86_64.a
и libclang_rt.ubsan-x86_64.a
на Linux).
Чтобы предоставить библиотеки, я затем экспортирую следующее. Примечание: это LIBS
, а не LDLIBS
как и ожидалось большинством других make
связанных инструментов.
export LIBS="/usr/local/lib/clang/3.3/lib/darwin/libclang_rt.asan_osx.a \
/usr/local/lib/clang/3.3/lib/darwin/libclang_rt.ubsan_osx.a"
Это приводит к configure
проблеме:
configure: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
...
Глядя на config.log
, это выглядит как две проблемы происходят. Во-первых, путь забивается путем изменения от /usr/local/...
до /Users/jwalton/...
.И второе, имя файла будучи разделывали путем перехода от статического Lib к динамическому Lib:
configure:3346: ./conftest
dyld: Library not loaded: /Users/jwalton/clang-llvm/llvm-3.3.src/Release+Asserts/lib/clang/3.3/lib/darwin/libclang_rt.asan_osx_dynamic.dylib
Referenced from: /Users/jwalton/libpng-1.6.7/./conftest
Reason: image not found
В очередной попытке, я попытался с помощью LDFLAGS
:
export LDFLAGS="-L/usr/local/lib/clang/3.3/lib/darwin/"
export LIBS="libclang_rt.asan_osx.a libclang_rt.ubsan_osx.a"
Это приводит к подобной ошибки:
configure: error: in `/Users/jwalton/libpng-1.6.7':
configure: error: C compiler cannot create executables
И config.log
:
configure:3209: /usr/local/bin/clang -g3 -fsanitize=address -fsanitize=undefined -L/usr/local/lib/clang/3.3/lib/darwin/ conftest.c libclang_rt.asan_osx.a libclang_rt.ubsan_osx.a >&5
clang: error: no such file or directory: 'libclang_rt.asan_osx.a'
clang: error: no such file or directory: 'libclang_rt.ubsan_osx.a'
И сбросив суффикс lib
префикс и .a
из LIBS
результатов в:
configure:3209: /usr/local/bin/clang -g3 -fsanitize=address -fsanitize=undefined -L/usr/local/lib/clang/3.3/lib/darwin/ conftest.c clang_rt.asan_osx clang_rt.ubsan_osx >&5
clang: error: no such file or directory: 'clang_rt.asan_osx'
clang: error: no such file or directory: 'clang_rt.ubsan_osx'
И добавив -l
в LIBS
результаты:
configure:3335: /usr/local/bin/clang -o conftest -g3 -fsanitize=address -fsanitize=undefined
-L/usr/local/lib/clang/3.3/lib/darwin/ conftest.c -lclang_rt.asan_osx -lclang_rt.ubsan_osx >&5
configure:3339: $? = 0
configure:3346: ./conftest
dyld: could not load inserted library: /Users/jwalton/libpng-1.6.7/./conftest
./configure: line 3348: 38224 Trace/BPT trap: 5 ./conftest$ac_cv_exeext
Наконец, -L
рассуждение справедливо:
$ ls /usr/local/lib/clang/3.3/lib/darwin/
libclang_rt.10.4.a libclang_rt.ios.a
libclang_rt.asan_osx.a libclang_rt.osx.a
libclang_rt.asan_osx_dynamic.dylib libclang_rt.profile_ios.a
libclang_rt.cc_kext.a libclang_rt.profile_osx.a
libclang_rt.cc_kext_ios5.a libclang_rt.ubsan_osx.a
libclang_rt.eprintf.a
В конце концов: как мне настроить проект autotools для использования статической библиотеки?
Бонусные баллы: почему что-то так легко сделать так сложно?
Ах, отлично. Большое спасибо. Я не буду вносить эти изменения, но это ясно показывает его проблему с Autotools и решение для дезинфицирующих средств. Вероятно, они тоже должны проверить «без санитаров». Например, для 'CXXFLAGS' используется следующее:' -fsanitize = undefined -fno-sanitize = vptr'. – jww
Если вы используете MacPorts, вы можете просто установить порт libtool. У него уже есть патч. Вам нужно будет повторно запустить 'autoreconf' или' glibtoolize' в соответствии с вашим проектом, чтобы он взял новую версию, но это должно помочь. –