2013-11-22 9 views
6

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' 

और में -lLIBS के लिए परिणामों को जोड़ने:

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 

सभी पृष्ठभूमि के बाद: मैं स्थिर पुस्तकालय का उपयोग करने के लिए एक ऑटोोटूल प्रोजेक्ट को कैसे कॉन्फ़िगर कर सकता हूं?

बोनस अंक: इतना आसान क्यों इतना आसान बना दिया गया है?

उत्तर

1

जीएनयू libtool के शिपिंग संस्करणों को पास नहीं किया जाता है = ... लिंकर के लिए तर्क। आप 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 इसे जोड़ने के लिए कहता है - cff को जोड़ने के लिए कैफे को पुस्तकालय जादू का ख्याल रखना चाहिए।

+0

आह, सही। आपका बहुत बहुत धन्यवाद। मैं उन बदलावों को नहीं बनाऊंगा, लेकिन यह स्पष्ट रूप से एक ऑटोटूल समस्या और sanitizers के लिए समाधान दिखाता है। उन्हें शायद "कोई सैनिजर" भी जांचना चाहिए। उदाहरण के लिए, मैं 'CXXFLAGS' के लिए निम्न का उपयोग करता हूं:' -fsanitize = undefined -fno-sanitize = vptr'। – jww

+0

यदि आप मैकपॉर्ट्स का उपयोग करते हैं, तो आप केवल libtool पोर्ट इंस्टॉल कर सकते हैं। यह पहले से ही पैच है। नए संस्करण को चुनने के लिए आपको अपने प्रोजेक्ट में उपयुक्त 'autoreconf' या' glibtoolize' को फिर से चालू करना होगा, लेकिन इससे मदद मिलनी चाहिए। –

5

आपको एलडीएफएलजीएस में झंडे को जोड़ने की जरूरत है।

+1

एक छोटा सा नोट: मेरे लिए जब मैंने इसे किया, तो «libubsan» गतिशील रूप से जुड़े हुए थे, भले ही मैंने स्पष्ट रूप से इसे स्थिर रूप से लिंक करने की ओर इशारा किया।समाधान LDFLAGS में '-fsanitize' का उपयोग नहीं करना था, बल्कि स्थिर पुस्तकालय 'libubsan.a' के लिए एक पूर्ण पथ जोड़ें। –

+1

@ हाय-एंजेल जीसीसी के लिए कैननिकल समाधान '-स्टैटिक-लिबब्सन' का उपयोग करना है। – yugr

0

अपरिभाषित प्रतीक समस्या के लिए, यदि आप सी ++ ऑब्जेक्ट्स को जोड़ रहे हैं, तो आपको के बजाय 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) 

ऊपर मामले में, बजना के बजाय ++ क्योंकि automake सोचा था कि आप (सी वस्तुओं का एक सेट यह समझ नहीं है कि एक libtool जोड़ने से जोड़ने के लिए चाहते थे नृशंस libtool इस्तेमाल किया बजना (ध्यान दें --tag=CC) संग्रह (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 पर निर्देशों का पालन करें और करने के लिए एक (डमी/वास्तविक) सी ++ स्रोत को जोड़ने के लिए अपने आपके 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 \ 
    … 
संबंधित मुद्दे