क्या कोई ओपन-सोर्स तरीका है जो किसी डायनामिक एक्ज़ीक्यूटेबल से स्टैटिक बनाने के लिए कोई सोर्स कोड उपलब्धता नहीं है?


20

मैं एक उदाहरण के साथ समस्या की व्याख्या करता हूं। मैं अपने दिन के काम में कुछ पुराने कार्यक्रम का उपयोग करता हूं, उदाहरण के लिए xfig और pdfedit

अब, ये कार्यक्रम काफी पुराने हैं और बहुत बार अपडेट नहीं किए जाते हैं; मेरा डर यह है कि एक दिन या दूसरे वे कुछ पुस्तकालय या कुछ असंगत अद्यतन की कमी के लिए काम नहीं करेंगे।

यदि प्रोग्राम को अब संकलित करना आसान है , एक रनिंग सिस्टम पर, समाधान आसान है: स्रोत को थोड़ा हैक करने और इसे स्टेटिक रूप से संकलित करने का प्रयास करें --- परिणामस्वरूप निष्पादन योग्य बड़ा होगा और इतना कुशल नहीं होगा, लेकिन यह काम करेगा निकट भविष्य (1)। यह मामला लगता है xfigऔर मैं इसे जल्द से जल्द आजमाऊंगा।

लेकिन, उदाहरण के लिए, pdfeditक्यूटी 3 पर निर्भर करता है, और इसे संकलित करने के लिए एक प्रणाली स्थापित करना इस समय काफी जटिल है। सौभाग्य से यह अभी चलाया जा सकता है , इस तथ्य के लिए धन्यवाद कि पुस्तकालय को किसी भी चीज के साथ संघर्ष करने की आवश्यकता नहीं है। लेकिन यह भविष्य में बदल सकता है, इसलिए मैं इस समस्या को हल करना चाहूंगा:

अगर मैं उबंटू पर एक गतिशील एक और सभी पुस्तकालयों, लेकिन कोई स्रोत कोड नहीं है, तो मैं एक स्थिर बाइनरी (या समान चीज) कैसे बना सकता हूं?

मैंने आसपास खोज की। एक संभावना स्टेटिफ़ायर (2) है, लेकिन इसमें एड्रेस रैंडमाइजेशन के साथ बहुत सारी समस्याएं हैं , इसलिए यह एक नहीं-नहीं है। गैर-मुक्त संस्करण, Ermine , काम करने लगता है, लेकिन मैं वास्तव में एक खुला स्रोत विकल्प पसंद करूंगा।

एक अन्य संभावना यह है कि docker या समान पैकेजिंग प्रणाली का उपयोग करें। लेकिन मैंने पाया सभी ट्यूटोरियल काफी RedHat- उन्मुख हैं ; और, ईमानदारी से, पालन करने के लिए काफी जटिल है।


फ़ुटनोट्स :

(१) इतना पागल नहीं है। मैं उदाहरण के लिए एक स्थिर ffmpeg का उपयोग करता हूं , ठीक काम करता है और किसी भी संगतता समस्याओं के बिना ...

(२) संकलन करने के लिए statifier, /programming/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-fatal-error देखें

जवाबों:


19

आप अपनी समस्या को दूसरे और अधिक सरल तरीके से हल कर सकते हैं:

lddउदाहरण के लिए, लिंक किए गए पुस्तकालयों को देखने के लिए अपने निष्पादन योग्य पर उपयोग करें :

$ ldd /bin/bash
linux-vdso.so.1 =>  (0x00007fffb2fd4000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fac9ef91000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fac9ed8d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac9e9c6000)
/lib64/ld-linux-x86-64.so.2 (0x00007fac9f1e1000)

फिर सभी लाइब्रेरीज़ को एक फ़ोल्डर में इकट्ठा करें और इस प्रोग्राम को इंगित करने के लिए अपना प्रोग्राम चलाने से पहले LD_LIBRARY_PATH पर्यावरण चर सेट करें:

$ LD_LIBRARY_PATH="/opt/my_program/lib" /opt/my_program/start

वैकल्पिक रूप से आप lib फ़ोल्डर के लिए प्रविष्टि जोड़ सकते हैं /etc/ld.so.conf.d/। लेकिन यह बदलाव को लागू करेगा।


यह एक अच्छा विचार है --- हालांकि मैं वास्तव में एक निष्पादन योग्य में यह सब पैकेज करने का एक तरीका खोजना चाहता हूं; यह समाधान लोडर में परिवर्तन से प्रभावित हो सकता है (हालांकि मुझे आशा है कि कोई भी गैर-पिछड़े संगत तरीके से ऐसा काम नहीं करेगा)। अगर कोई बेहतर समाधान नहीं होता है तो इनाम इनाम में मिलेगा --- धन्यवाद
रमनो

वैसे आप इसे थोड़ी स्थापना स्क्रिप्ट में जोड़ सकते हैं और इसे स्थानीय पथ से जोड़ सकते हैं। मुझे यह समाधान पसंद है, मैं इसे एक समय पहले इस्तेमाल कर सकता था।
वॉल्केयू

1
@ मत करो, linux-vdso.so.1 कहीं नहीं देखा जा सकता है, मुझे लगता है कि यह कर्नेल में है, सही है?
रमनो

1
हाँ। से man 7 vdso: "" vDSO "(वर्चुअल डायनेमिक शेयर्ड ऑब्जेक्ट) एक छोटा सा साझा पुस्तकालय है जो कर्नेल स्वचालित रूप से सभी उपयोगकर्ता-स्पेस एप्लिकेशन के एड्रेस स्पेस में मैप करता है।"
क्लॉस डी।

हालांकि यह सख्ती से सवाल का जवाब नहीं है , यह एक उचित समाधान है। धन्यवाद।
रमनो

2

सांख्यिकीय के बारे में एक सुझाव :

यदि पता स्थान लेआउट रेंडमाइजेशन (ASLR) इसे विफल कर रहा है तो आपको इसे पूरी मशीन के लिए बंद नहीं करना पड़ेगा। आप इसे उस प्रक्रिया के लिए बंद कर सकते हैं:

$ setarch `uname -m` -R statified_pdfedit [args...]

यह बेतरतीब लेआउट अक्षम (रूट होने की कोई जरूरत नहीं) के साथ उस कमांड को चलाएगा।


दिलचस्प। अब अगर मैं सिर्फ संकलन कर सकता हूं statifier...
रमानो

संकलित और जाँच की गई। xfig_statifiedअभी भी कोर डंप ... एक दया। फिर भी धन्यवाद।
रमानो

हाँ, एक दया। मैं सोच रहा था कि यह एक 64 बिट मुद्दा नहीं होगा, एक 32bit सेटअप पर सांख्यिकीय चलाने की कोशिश हो सकती है?
नींबू

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