linux – 如何使Unix二进制自包含?

前端之家收集整理的这篇文章主要介绍了linux – 如何使Unix二进制自包含?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个没有源代码Linux二进制文件,它可以在一台机器上工作,我想制作一个独立的软件包,运行在同一架构的不同机器上.什么是实现这一目标的方法

在我的情况下,这两台机器具有相同的架构,相同的Ubuntu内核,但目标机没有make,并且/ lib和/ usr下的文件版本不正确@H_403_3@

一个想法是使用chroot并重新创建二进制文件使用的文件系统的一个子集,可能使用strace来确定它需要什么.有没有这样做的工具?@H_403_3@

对于后代,这里是如何确定进程打开的文件@H_403_3@

#!/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问题是当我的命令行以java开头的时候,这不起作用,因为Java设置LD_LIBRARY_PATH,并重新启动自己,这就是旧的解释器.对我来说,一个解决方案是在文本编辑器中打开二进制文件,找到解释器(/lib/ld-linux-x86-64.so.2),并用相同长度的路径替换为修补的解释器@H_403_3@

解决方法

有一个 CDE的软件设计完成你想要的.这是一个谷歌技术的谈话
http://www.youtube.com/watch?v=6XdwHo1BWwY

猜你在找的Linux相关文章