2013-11-22 4 views
6

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 для использования статической библиотеки?

Бонусные баллы: почему что-то так легко сделать так сложно?

ответ

1

Отгрузочные версии GNU libtool не передают -fsanitize = ... аргументы компоновщику. Вам нужно будет обновить Libtool с патчем от http://savannah.gnu.org/patch/?8775 В частности:

diff --git a/build-aux/ltmain.in b/build-aux/ltmain.in 
index 0c40da0..b99b0cd 100644 
--- a/build-aux/ltmain.in 
+++ b/build-aux/ltmain.in 
@@ -5362,10 +5362,11 @@ func_mode_link() 
     # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization 
     # -specs=*    GCC specs files 
     # -stdlib=*   select c++ std lib with clang 
+  # -fsanitize=*   Clang memory and address sanitizer 
     -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ 
     -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ 
     -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ 
-  -specs=*) 
+  -specs=*|-fsanitize=*) 
     func_quote_for_eval "$arg" 
    arg=$func_quote_for_eval_result 
     func_append compile_command " $arg" 

Что касается получения Libtool принять статическую библиотеку, вы должны быть в состоянии просто включить полный путь к статической библиотеке в командной строке, или вы можете использовать такие опции, как -L/usr/local/lib/clang/3.3/lib/darwin/ -lclang_rt.ubsan_osx. Тем не менее, cfe должен заботиться о волшебстве библиотеки для вас, как только libtool говорит ему использовать -fsanitize = ... для связывания.

+0

Ах, отлично. Большое спасибо. Я не буду вносить эти изменения, но это ясно показывает его проблему с Autotools и решение для дезинфицирующих средств. Вероятно, они тоже должны проверить «без санитаров». Например, для 'CXXFLAGS' используется следующее:' -fsanitize = undefined -fno-sanitize = vptr'. – jww

+0

Если вы используете MacPorts, вы можете просто установить порт libtool. У него уже есть патч. Вам нужно будет повторно запустить 'autoreconf' или' glibtoolize' в соответствии с вашим проектом, чтобы он взял новую версию, но это должно помочь. –

5

Вам также нужно добавить флаги -fsanitize в LDFLAGS.

+1

Небольшое примечание: для меня, когда я это делал, «libubsan» были связаны динамически, хотя я явно указал на его статичное связывание.Решение заключалось в том, чтобы не использовать '-fsanitize' в LDFLAGS, а скорее добавить туда полный путь к статической библиотеке' libubsan.a'. –

+1

@ Hi-Angel Для GCC каноническим решением является использование '-static-libubsan'. – yugr

0

Что касается неопределенной проблемы с символом, если вы связываете объекты C++, то вы должны использовать clang++ вместо clang. В противном случае вы можете получить сообщение об ошибке, такие как:

/bin/bash libtool --tag=CC --mode=link clang-3.6 ... -fsanitize=undefined -o freeswitch ... 
libtool: link: clang-3.6 ... -fsanitize=undefined -o .libs/freeswitch ./.libs/libfreeswitch.so ... 
./.libs/libfreeswitch.so: undefined reference to `__ubsan_vptr_type_cache' 
./.libs/libfreeswitch.so: undefined reference to `__ubsan_handle_dynamic_type_cache_miss' 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

В приведенных выше случае, зверском libtool используются звон вместо лязга ++, потому что automake думал, что вы хотели связать набор объектов C (он не понимает, что связывающая Libtool архив (libfreeswitch.la) с использованием C++ означает, что C++ компоновщик требуется (обратите внимание на --tag=CC) См. также https://lists.debian.org/debian-mentors/2003/06/msg00004.html.

чтобы обойти эту проблему, следуйте инструкциям на https://www.gnu.org/software/automake/manual/html_node/Libtool-Convenience-Libraries.html и добавить (/ реальный манекен) C источник ++ для вашего источники в вашем Makefile.am:

SUBDIRS = sub1 sub2 … 
lib_LTLIBRARIES = libtop.la 
libtop_la_SOURCES = 
# Dummy C++ source to cause C++ linking. 
nodist_EXTRA_libtop_la_SOURCES = dummy.cxx 
libtop_la_LIBADD = \ 
    sub1/libsub1.la \ 
    sub2/libsub2.la \ 
    …