編輯:如果它的TLDR,只是跳到底部。其中我問:如何配置autotools項目使用靜態庫?在靜態庫配置中使用Clang消毒器配置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/...
。第二,文件名是由從靜態庫轉變到動態的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'
而且從LIBS
結果丟棄lib
前綴和.a
後綴:
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'來獲取更新的版本,但這會有所幫助。 –