EDIT: यदि इसका टीएलडीआर है, तो बस नीचे जाएं। जहां मैं पूछता हूं: मैं स्थिर पुस्तकालय का उपयोग करने के लिए एक ऑटोोटूल प्रोजेक्ट को कैसे कॉन्फ़िगर कर सकता हूं?एक स्थिर lib कॉन्फ़िगरेशन में क्लैंग sanitizers के साथ एक autotools परियोजना को कॉन्फ़िगर करें?
मैं खुले स्रोत संग्रहालय के एक जोड़े के साथ काम कर रहा हूँ, और मैं बजना के sanitizers के तहत अपने टेस्ट स्वीट चलाने के लिए कोशिश कर रहा हूँ। क्लैंग सैनिटाइजर्स के तहत चलाने के लिए, हमें (1) कुछ विकल्प निर्दिष्ट करने की आवश्यकता है, और (2) क्लैंग के कंपाइलर-आरटी से आवश्यक स्थिर पुस्तकालयों को आवश्यकतानुसार लिंक करें। नोट: कोई गतिशील पुस्तकालय या साझा ऑब्जेक्ट्स नहीं हैं।
विकल्प निर्धारित करना आसान है:
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'
मुझे उन पुस्तकालयों को पता है जिन्हें लिंक करने की आवश्यकता है। मेरे द्वारा उपयोग किए जाने वाले sanitizers के लिए, वे libclang_rt.asan_osx.a
और libclang_rt.ubsan_osx.a
(या 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 से एक गतिशील lib को बदलकर butchered किया जा रहा है:
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
सभी पृष्ठभूमि के बाद: मैं स्थिर पुस्तकालय का उपयोग करने के लिए एक ऑटोोटूल प्रोजेक्ट को कैसे कॉन्फ़िगर कर सकता हूं?
बोनस अंक: इतना आसान क्यों इतना आसान बना दिया गया है?
आह, सही। आपका बहुत बहुत धन्यवाद। मैं उन बदलावों को नहीं बनाऊंगा, लेकिन यह स्पष्ट रूप से एक ऑटोटूल समस्या और sanitizers के लिए समाधान दिखाता है। उन्हें शायद "कोई सैनिजर" भी जांचना चाहिए। उदाहरण के लिए, मैं 'CXXFLAGS' के लिए निम्न का उपयोग करता हूं:' -fsanitize = undefined -fno-sanitize = vptr'। – jww
यदि आप मैकपॉर्ट्स का उपयोग करते हैं, तो आप केवल libtool पोर्ट इंस्टॉल कर सकते हैं। यह पहले से ही पैच है। नए संस्करण को चुनने के लिए आपको अपने प्रोजेक्ट में उपयुक्त 'autoreconf' या' glibtoolize' को फिर से चालू करना होगा, लेकिन इससे मदद मिलनी चाहिए। –