我有一個Linux二進制文件,沒有來源,即一臺機器上工作,我想提出一個自包含的包,會在不同的機器相同的架構上運行。什麼是實現這個的方法?如何使Unix二進制獨立?
在我的情況下,兩臺機器具有相同的結構,相同的Ubuntu的內核,但目標機器沒有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
是硬編碼到解釋,並優先於LD_LIBRARY_PATH
,使原生版本將先加載。解釋器被硬編碼到二進制文件中。一種方法可能是修補解釋器和運行的二進制爲patched_interpreter mycommandline
問題是,當mycommandline
是java
開始,這不起作用因爲Java將向上LD_LIBRARY_PATH
並重新啓動本身,它求助於老的解釋。對我而言,解決方案是在文本編輯器中打開二進制文件,找到解釋器(/lib/ld-linux-x86-64.so.2
),並用相同長度的路徑替換爲打補丁的解釋器。
聽起來像你想要一個靜態二進制。它建立在它使用的所有庫中。 –
@VLC說什麼,你必須將它標記爲靜態鏈接,儘管這可能有點痛苦。 –
您是否構建了有問題的二進制文件?如果你這樣做了,你或許可以靜態重建它。 – Cascabel