एक प्राचीन लिनक्स वितरण पर बिल्डिंग गिट


2

मेरे पास मांडवीए 2010.1 वितरण पर आधारित एक पुरानी प्रणाली है जिसे अब कोई अपडेट नहीं मिलता है।

कुछ समय पहले तक, मैं बिल गेट गिट बायनेरिज़ का उपयोग करने में सक्षम था, जो कि गिटहब के साथ संवाद करने के लिए ठीक था, लेकिन जैसा कि उन्होंने असुरक्षित प्रोटोकॉल के बारे में अपनी नीति बदल दी है, मुझे अब यह त्रुटि संदेश मिल रहा है:

fatal: unable to access 'https://github.com/user/repo.git/': error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

उस संदेश से संबंधित बहुत सारे उत्तर हैं, उनमें से ज्यादातर "अपने ग्राहक को अपडेट करें" जो मेरे लिए ठीक होगा यदि मैं भविष्य के भविष्य के लिए उस प्राचीन प्रणाली के साथ फंस नहीं गया था।

मेरे लिए सौभाग्य से, मेरे पास उस मशीन पर सभी आवश्यक निर्माण उपकरण हैं, और इसलिए मैंने गिट के लिए स्रोतों को डाउनलोड किया 2.16.2, उन्हें अंदर निकाला /usr/src/git-2.16.2और भोलेपन से उन कमांडों को चलाया:

./configure
make
./git --exec-path=/usr/src/git-2.16.2 clone https://github.com/user/repo.git

लेकिन, जैसा कि आपके लिए काफी स्पष्ट होगा, इससे समस्या हल नहीं हुई।

मैंने इस तरह आगे देखा कि कैसे git-remote-httpsबनाया जाता है और यह पता लगाया जाता है कि मुझे हाल ही में libcurlऔर अधिक हाल के open-sslपुस्तकालय की भी आवश्यकता होगी ।

इसलिए, मैंने ओपनएसएसएल के साथ शुरुआत की /usr/src/openssl-1.1.0gऔर इसे इन कमांड्स के साथ बनाया और बनाया:

./config enable-shared enable-egd
make

यह बिलकुल ठीक है, इसलिए मैं curlयह सुनिश्चित करने की कोशिश में निर्माण करने के लिए आगे बढ़ा कि यह उस निर्माण का उपयोग करेगा opensslजिसे मैंने अभी बनाया है। मैंने अपने स्रोतों को अंदर स्थापित किया /usr/src/curl-7.58.0और परीक्षण और त्रुटि के बाद, विभिन्न संसाधनों को देखते हुए, मैं निम्नलिखित आदेशों के साथ आया:

LDFLAGS="-L/usr/src/openssl-1.1.0g -Wl,-rpath,/usr/src/openssl-1.1.0g" LIBS="-ldl" ./configure --with-ssl=/usr/src/openssl-1.1.0g --with-libssl-prefix=/usr/src/openssl-1.1.0g --disable-ldap
make

यह सिर्फ ठीक बनाता है और मैं libcurl.so.4अंदर पा सकता हूं/usr/src/curl-7.58.0/lib/.libs

मैं इस प्रकार अंतिम चरण में चला गया, जो /usr/src/git-2.16.2निम्नलिखित कमांड के साथ अंदर स्थित स्रोतों से गिट बना रहा है :

LDFLAGS="-L/usr/src/openssl-1.1.0g -L/usr/src/curl-7.58.0 -Wl,-rpath,/usr/src/openssl-1.1.0g,-rpath,/usr/src/curl-7.58.0/lib/.libs" LIBS="-ldl" ./configure --with-curl=/usr/src/curl-7.58.0 --with-openssl=/usr/src/openssl-1.1.0g
make

इस सब के साथ, मुझे गिट बायनेरिज़ का एक सेट मिलता है और यदि इसका उपयोग readelfकिया जाता है git-remote-https, तो यह सही प्रतीत होता है:

Dynamic section at offset 0x125448 contains 27 entries:

  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libcurl.so.4]
 0x0000000000000001 (NEEDED)             Shared library: [libssl.so.1.1]
 0x0000000000000001 (NEEDED)             Shared library: [libexpat.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libz.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000f (RPATH)              Library rpath: [/usr/src/openssl-1.1.0g:/usr/src/curl-7.58.0/lib/.libs:/usr/src/curl-7.58.0/lib]
 0x000000000000000c (INIT)               0x403870
 0x000000000000000d (FINI)               0x4e7448
 0x000000006ffffef5 (GNU_HASH)           0x400240
 0x0000000000000005 (STRTAB)             0x401838
 0x0000000000000006 (SYMTAB)             0x4002a8
 0x000000000000000a (STRSZ)              2411 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x725658
 0x0000000000000002 (PLTRELSZ)           5160 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x402448
 0x0000000000000007 (RELA)               0x4023d0
 0x0000000000000008 (RELASZ)             120 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x402370
 0x000000006fffffff (VERNEEDNUM)         2
 0x000000006ffffff0 (VERSYM)             0x4021a4
 0x0000000000000000 (NULL)               0x0

हालाँकि, यदि मैं समान रिपॉजिटरी को पुनः प्राप्त करने के लिए ऊपर एक ही कमांड शुरू करता हूं, तो मुझे एक बहुत अलग आउटपुट मिलता है:

Cloning into 'repo'...
warning: templates not found /usr/local/share/git-core/templates
kernel: git-remote-http[14950]: segfault at 0 ip 00007f027380ce66 sp 00007fffa34bf5f8 error 4 in libc-2.11.1.so[7f0273793000+163000]

इसलिए, स्पष्ट रूप से, मेरे गिट बायनेरिज़ के निर्माण के तरीके में कुछ गड़बड़ है, लेकिन मैं वास्तव में क्या समझ सकता हूं।

makeGit का निर्माण करते समय लॉग से निरीक्षण करते हुए , मैंने निम्नलिखित चेतावनी संदेश पर ध्यान दिया:

/usr/bin/ld: warning: libssl.so.1.0.0, needed by /usr/lib/gcc/x86_64-manbo-linux-gnu/4.4.3/../../../../lib64/libcurl.so, may conflict with libssl.so.1.1

यह कई git-remoteनिष्पादन योग्य के लिए दोहराया जाता है और मुझे यह थोड़ा अजीब लगता है। मेरा मतलब है, readelfमुझे बताता libcurl.so.4है कि इसका उपयोग किया जाता है, और फिर भी ऐसा प्रतीत होता है जैसे लिंकर अभी भी मेरे पुराने सिस्टम लाइब्रेरी से एक पुराने संस्करण का आयात कर रहा है।

यह अच्छी तरह से उन segfaults की व्याख्या कर सकता है जो मैं देख रहा हूं, लेकिन फिर, मुझे इस पूरी श्रृंखला का निर्माण कैसे करना चाहिए?

किसी भी तरह की सहायता का स्वागत किया जाएगा।

जवाबों:


2

आगे दुर्घटना की उत्पत्ति का पता लगाने के लिए, मैंने उपयोग ldd -aकिया git-remote-httpsऔर यह दिखाया कि यह libcurl.so.4सिस्टम फ़ोल्डर से उपयोग कर रहा था , मेरे libcurlफ़ोल्डर से नहीं । परिणामस्वरूप, लोडर को दो संस्करणों का libcryptoउपयोग करने की अनुमति दे रहा था, जिससे मुझे निश्चित रूप से सीगफॉल्ट की ओर अग्रसर किया गया था।

हालांकि, यह सुनिश्चित करने के बाद कि make cleanप्रत्येक निर्देशिका में मुझे बुलाया गया था, अब मैं एक कार्यशील स्थिति में हूं, निम्नलिखित आदेशों के साथ:

ओपनएसएसएल के लिए

./config enable-shared enable-egd
make

फिर CURL के लिए

LDFLAGS="-L/usr/src/openssl-1.1.0g -Wl,-rpath,/usr/src/openssl-1.1.0g" LIBS="-ldl" ./configure --with-ssl=/usr/src/openssl-1.1.0g --with-libssl-prefix=/usr/src/openssl-1.1.0g --disable-ldap --enable-libcurl-option
make

उस बिंदु पर, सुनिश्चित करें कि अंदर libcurl.so.4मौजूद है /usr/src/curl-7.58.0/lib/.libs। ऐसा लगता है कि यह --enable-libcurl-optionसुनिश्चित करता है कि यह मामला है जबकि ऊपर इस्तेमाल की जाने वाली कमांड लाइन हमेशा ऐसा नहीं करती है।

फिर अंत में, खुद के लिए:

LDFLAGS="-L/usr/src/openssl-1.1.0g -L/usr/src/curl-7.58.0 -Wl,-rpath,/usr/src/openssl-1.1.0g,-rpath,/usr/src/curl-7.58.0/lib/.libs" LIBS="-ldl" ./configure --with-curl=/usr/src/curl-7.58.0 --with-openssl=/usr/src/openssl-1.1.0g
make

अब, lddआप का उपयोग करते हुए देखेंगे कि /usr/src/curl-7.58.0/lib/.libs/libcurl.so.4सिस्टम निर्देशिका से एक का उपयोग किया जाता है और नहीं। इसका मतलब है कि निम्नलिखित git कमांड ठीक से काम करता है:

./git --exec-path=/usr/src/git-2.16.2 clone https://github.com/user/repo.git

यह प्रत्येक बिट --exec-pathकमांड के उपयोग की आवश्यकता के लिए थोड़ा बोझिल है , लेकिन aliasइस मामले में कमांड काफी सुविधाजनक है।


क्या? मैंने -aldd पर स्विच के बारे में कभी नहीं सुना है , आप किस ldd कार्यान्वयन के बारे में बात कर रहे हैं? GNU ldd समर्थन नहीं करता है -a, OpenBSD ldd समर्थन नहीं करता है -a, Cygwin ldd समर्थन नहीं करता है -a, जो कार्यान्वयन करता है?
हंसेनक्रिक

खैर, यह एक मांडवी 2010.2 स्थापना पर था, इसलिए शायद यह एक विकल्प है जो बाद के संस्करण में हटा दिया गया। बात यह है कि, 2018 के अंत में उस प्रणाली की मृत्यु हो गई है और तब से एक और वितरण का उपयोग करके एक नए द्वारा प्रतिस्थापित किया गया है, इसलिए मेरे पास यह परीक्षण करने का कोई तरीका नहीं है कि यह विकल्प क्या करता है। आज तक, ऐसा लगता lddहै कि निष्पादन योग्य द्वारा उपयोग किए जाने वाले पुस्तकालयों के लिए मार्ग प्राप्त करने के लिए एक सरल कॉल पर्याप्त है।
ओबोन

वैसे भी जवाब देने के लिए अच्छी तरह से धन्यवाद ^ ^
hanshenrik
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.