मेरे पास एक लिनक्स बाइनरी है, स्रोतों के बिना, जो एक मशीन पर काम करता है, और मैं एक स्व-निहित पैकेज बनाना चाहता हूं जो एक ही वास्तुकला की एक अलग मशीन पर चलती है। इसे प्राप्त करने का एक तरीका क्या है?यूनिक्स बाइनरी स्वयं निहित कैसे करें?
मेरे मामले में, दोनों मशीनों एक ही वास्तुकला, एक ही उबंटू गिरी है, लेकिन लक्ष्य मशीन make
नहीं है और नीचे /lib
और /usr
एक विचार मैं था फ़ाइलों के गलत संस्करण है chroot
का इस्तेमाल किया गया और फाइल सिस्टम के सबसेट को फिर से बनाएं, जो कि बाइनरी का उपयोग करता है, संभवतः strace
का उपयोग करके इसकी आवश्यकता होती है। क्या कोई ऐसा उपकरण है जो पहले से ही करता है?
भावी पीढ़ी के लिए, यहाँ है कि कैसे मैं यह पता लगाने की जो फाइल एक प्रक्रिया खोलता है
#!/usr/bin/python
# source of trace_fileopen.py
# Runs command and prints all files that have been successfully opened with mode O_RDONLY
# example: trace_fileopen.py ls -l
import re, sys, subprocess, os
if __name__=='__main__':
strace_fn = '/tmp/strace.out'
strace_re = re.compile(r'([^(]+?)\((.*)\)\s*=\s*(\S+?)\s+(.*)$')
cmd = sys.argv[1]
nowhere = open('/dev/null','w')#
p = subprocess.Popen(['strace','-o', strace_fn]+sys.argv[1:], stdout=nowhere, stderr=nowhere)
sts = os.waitpid(p.pid, 0)[1]
output = []
for line in open(strace_fn):
# ignore lines like --- SIGCHLD (Child exited) @ 0 (0) ---
if not strace_re.match(line):
continue
(function,args,returnval,msg) = strace_re.findall(line)[0]
if function=='open' and returnval!='-1':
(fname,mode)=args.split(',',1)
if mode.strip()=='O_RDONLY':
if fname.startswith('"') and fname.endswith('"') and len(fname)>=2:
fname = fname[1:-1]
output.append(fname)
prev_line = ""
for line in sorted(output):
if line==prev_line:
continue
print line
prev_line = line
अद्यतन LD_LIBRARY_PATH
समाधान के साथ समस्या यह है कि /lib
दुभाषिया में hardcoded और LD_LIBRARY_PATH
पर पूर्वता लेता है, इसलिए देशी संस्करण जाएगा पहले लोड हो जाओ। दुभाषिया बाइनरी में हार्डकोड किया गया है। एक दृष्टिकोण दुभाषिया को पैच करना और patched_interpreter mycommandline
के रूप में द्विआधारी चलाने के लिए हो सकता है समस्या यह है कि mycommandline
java
के साथ शुरू होता है, यह काम नहीं करता है क्योंकि जावा सेट-अप LD_LIBRARY_PATH
और पुराने दुभाषिया के लिए रिसॉर्ट करता है। मेरे लिए काम करने वाला एक समाधान टेक्स्ट एडिटर में बाइनरी खोलना था, दुभाषिया (/lib/ld-linux-x86-64.so.2
) ढूंढें, और इसे पैच किए गए दुभाषिया
लगता है जैसे आप एक स्थिर बाइनरी चाहते हैं। यह सभी पुस्तकालयों में बनाता है जो इसका उपयोग करता है। –
क्या @ वीएलसी ने कहा, आपको इसे स्थिर लिंकिंग के लिए चिह्नित करना होगा, हालांकि यह दर्द का थोड़ा सा हो सकता है। –
क्या आपने सवाल में बाइनरी बनाई थी? यदि आपने किया है, तो आप इसे स्थिर रूप से पुनर्निर्माण करने में सक्षम हो सकते हैं। – Cascabel