सबसे पहले, एक छोटी सी पृष्ठभूमि: मैं जांच कर रहा हूं कि मेरी कंपनी का मैकोज़/एक्स एप्लिकेशन क्यों है (जो सभी खातों द्वारा सही ढंग से हस्ताक्षरित प्रतीत होता है; यह मैकोज़/एक्स 10.11.x और 10.12.x के तहत ठीक चलता है; गेटकीपर इसके साथ ठीक है सभी मैकोज़ संस्करणों पर; "spctl --assess", और "codeign -vvvv" सभी कहते हैं कि यह सभी ओएस संस्करणों पर इसकी आवश्यकता को पूरा करता है) फिर भी जब मैं कोशिश करता हूं तो 10.10.x के तहत ओएस/एक्स 10.10.x के तहत लॉन्च नहीं होगा। यह शुरू करने के लिए, मैं एक क्रैश रिपोर्ट जहां dyld शिकायत प्राप्त पुस्तकालयों में से कुछ सही ढंग से प्रवेश नहीं किया है कि:ऐप्पल की कोडलाइन उपयोगिता कैसे तय करती है कि एसएचए एल्गोरिदम किसके साथ साझा लाइब्रेरी पर हस्ताक्षर करने के लिए है?
Dyld Error Message:
Library not loaded: @executable_path/../Frameworks/libcrypto.1.0.0.dylib
Referenced from: /Applications/MyApplication v123/MyApplication.app/Contents/MacOS/MyApplication
Reason: no suitable image found. Did find:
/Applications/MyApplication v123/MyApplication.app/Contents/MacOS/../Frameworks/libcrypto.1.0.0.dylib: code signature invalid for '/Applications/MyApplication v123/MyApplication.app/Contents/MacOS/../Frameworks/libcrypto.1.0.0.dylib'
है कि समस्या की जांच करते समय, मैंने देखा है .app/सामग्री/फ्रेमवर्क में पुस्तकालयों कि - जो सभी हमारे ओएस/एक्स बिल्ड मशीन चलने पर बिल्ड/पैकेज स्क्रिप्ट के माध्यम से, सटीक कोड कोड कमांड का उपयोग करके हस्ताक्षरित हैं ओएस/एक्स 10.12 - उनके लिए गणना की गई विभिन्न प्रकार के हैंश हैं।
यही है, अगर मैं गैर क्यूटी .dylib फ़ाइलों में से एक कैसे हस्ताक्षर किए गए थे को देखो, मैं देख रहा हूँ यह केवल एक SHA256 हैश उस में दर्ज किया है:
sierrabuild-polaris:MyApp v123 autobuild$ codesign -vvvd ./MyApp.app/Contents/Frameworks/libsndfile.1.dylib
Executable=/Applications/MyApp v123/MyApp.app/Contents/Frameworks/libsndfile.1.dylib
Identifier=libsndfile.1
Format=Mach-O thin (x86_64)
CodeDirectory v=20200 size=4140 flags=0x0(none) hashes=125+2 location=embedded
Hash type=sha256 size=32
CandidateCDHash sha256=b4256e9bf0fac567bb8ac86f56964c066b93d069
Hash choices=sha256 <----------------------------- ONLY 256!?
CDHash=b4256e9bf0fac567bb8ac86f56964c066b93d069
Signature size=8846
Authority=Developer ID Application: MyCompany
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Timestamp=Jan 24, 2017, 1:39:58 AM
Info.plist=not bound
TeamIdentifier=5XD27G7646
Sealed Resources=none
Internal requirements count=1 size=172
... लेकिन अगर मैं देखो बंदी क्यूटी चौखटे के किसी भी कैसे हस्ताक्षर किए गए थे पर, OTOH, मैं देख रहा हूँ यह दोनों SHA1 और SHA256 हैश शामिल किया गया है:
sierrabuild-polaris:MyApp v123 autobuild$ codesign -vvvd ./MyApp.app/Contents/Frameworks/QtCore.framework/Versions/5/QtCore
Executable=/Applications/MyApp v123/MyApp.app/Contents/Frameworks/QtCore.framework/Versions/5/QtCore
Identifier=org.qt-project.QtCore
Format=bundle with Mach-O thin (x86_64)
CodeDirectory v=20200 size=42549 flags=0x0(none) hashes=1324+3 location=embedded
Hash type=sha256 size=32
CandidateCDHash sha1=09b5854f83091228f1baaad1455e7a30d6500c95
CandidateCDHash sha256=6dfdc74da06618e1b406a6e5fd0794fe43701def
Hash choices=sha1,sha256 <------------- BOTH sha1 and sha256, yay!
CDHash=6dfdc74da06618e1b406a6e5fd0794fe43701def
Signature size=8896
Authority=Developer ID Application: MyCompany
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Timestamp=Jan 24, 2017, 1:39:57 AM
Info.plist entries=8
TeamIdentifier=5XD27G7646
Sealed Resources version=2 rules=13 files=1
Internal requirements count=1 size=184
यह देखते हुए कि dyld की त्रुटि जब Yosemite के तहत मेरे अनुप्रयोग चलाने के लिए कोशिश कर रहा हमेशा पुस्तकालयों में से एक को संदर्भित करता है कि केवल sha256 हैश है, मेरा कामकाजी सिद्धांत यह है कि ओएस/एक्स 10.10.x का रंग प्राचीन है टी टोपी यह SHA-256 हैश के बारे में नहीं जानता है, और यही कारण है कि यह एक कैप्चर साझा लाइब्रेरी को लोड करने का प्रयास करता है जो केवल SHA-256 हैश के साथ हस्ताक्षरित है।
मेरा प्रश्न (मान लीजिए कि मैं यहां गलत पेड़ को पूरी तरह से भौंकने वाला नहीं हूं) यह है: कोडविन कैसे तय करता है कि शॉ 256 हैश के साथ फ़ाइल को मुद्रित करने के लिए, एक श्या 1 और sha256 हैश जोड़कर बनाम कैसे बनाते हैं? और मैं कोडशिन को हमेशा दोनों हैंश को शामिल करने के लिए कैसे मजबूर कर सकता हूं, ताकि मेरा ऐप फिर से 10.10.x के तहत लॉन्च हो सके (जैसे कि हमने अपनी बिल्ड मशीन को ओएसएक्स/सिएरा में अपग्रेड करने से पहले उपयोग किया था)?
रिकॉर्ड के लिए, यहां मैं अपनी बिल्ड स्क्रिप्ट में कोडलाइन का आविष्कार कर रहा हूं - आमंत्रण तर्क सभी पुस्तकालयों के लिए बिल्कुल समान हैं (दोनों क्यूटी फ्रेमवर्क लाइब्रेरी जो शा 1, sha256 और गैर-क्यूटी के साथ समाप्त होते हैं पुस्तकालयों कि केवल SHA256 अंत), उदाहरण के लिए:
codesign -f -v -s "Developer ID Application: MyCompanyName" "./Frameworks/libcrypto.1.0.0.dylib"
codesign -f -v -s "Developer ID Application: MyCompanyName" "./Frameworks/QtCore.framework/Versions/5/QtCore"
हैलो मैं वर्तमान में कर रहा हूँ एक ही मुद्दे का सामना करना पड़ रहा है, और मेरे लिए कुछ स्पष्ट नहीं है क्या आपको अपनी खुद की ऐप बनाने के लिए इस्तेमाल की गई अपनी स्क्रिप्ट के शीर्ष पर अपनी निर्यात लाइन जोड़नी है, या आपने तीसरे पक्ष के पुनर्निर्माण से पहले, उन निर्यात लाइनों को कमांड लाइन में जोड़ा था libsndfile की तरह libs? – nmud
मुझे एक शीर्ष-स्तरीय बिल्ड स्क्रिप्ट मिली है जो लाइब्रेरी बनाने वाली निम्न-स्तरीय बिल्ड-स्क्रिप्ट्स को कॉल करती है, और फिर अंतिम निचली-स्तर वाली बिल्ड-स्क्रिप्ट जो मेरे ऐप को बनाता है जो उन पुस्तकालयों का उपयोग करती है। मैंने उपरोक्त निर्यात-आदेशों को इस शीर्ष-स्तरीय बिल्ड-स्क्रिप्ट के शीर्ष पर रखा है ताकि एलडीएफएलजीएस, सीएफएलएजीएस, और सीओएफएफएलजीएस पर्यावरण चर सभी बिल्ड स्क्रिप्ट्स (पुस्तकालयों और ऐप) के लिए पर्यावरण में मौजूद हों। –
ठीक है। मेरे मामले में, मैं एक क्यूटी ऐप बना रहा हूं, इसलिए मुझे उन निर्यातित झंडे के साथ तीसरे पक्ष के libs को पुनर्निर्माण करना होगा, और फिर libs ठीक होने के बाद अपने स्वयं के ऐप का पुनर्निर्माण करना होगा। बात यह है कि मैंने ब्रूड के साथ libsndfile की तरह तीसरे पक्ष की libs बनाई है, इसलिए मुझे नहीं पता कि मैं कुछ ऐसा कर सकता हूं ./configure CFLAGS = "..." या – nmud