编辑 :如果是TLDR,请跳到底部。我问的地方:如何配置autotools项目以使用静态库?
我正在使用几个开源库,我正在尝试在Clang的清洁剂下运行他们的测试套件。要在Clang清理程序下运行,我们需要(1)指定一些选项,以及(2)根据需要链接Clang的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
(或Linux上的libclang_rt.full-x86_64.a
和libclang_rt.ubsan-x86_64.a
。
要提供库,我然后导出以下内容。 注意:它是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/...
来切换路径。第二,通过从静态库更改为动态库来对文件名进行屠宰:
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项目以使用静态库?
奖励积分:为什么这么容易变得如此困难?
答案 0 :(得分:5)
您还需要将-fsanitize标志添加到LDFLAGS。
答案 1 :(得分:2)
GNU libtool的传送版本不会将-fsanitize = ...参数传递给链接器。您需要使用http://savannah.gnu.org/patch/?8775中的补丁更新libtool。具体来说:
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
之类的选项。但是,一旦libtool告诉它使用-fsanitize = ...进行链接,cfe应该为你处理库魔法。
答案 2 :(得分: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
使用了clang而不是clang ++,因为automake
认为你想要链接一组C对象(它不理解链接libtool存档({{ 1)})使用C ++意味着需要一个C ++链接器(注意libfreeswitch.la
)。另见https://lists.debian.org/debian-mentors/2003/06/msg00004.html。
要解决此问题,请按照https://www.gnu.org/software/automake/manual/html_node/Libtool-Convenience-Libraries.html上的说明操作,并在--tag=CC
中为您的来源添加(虚拟/真实)C ++来源:
Makefile.am