linux elf命令,实战:Linux上修改ELF文件的方法

7zip/bin/7za x -y -bd "-o/temp/94ac6fe8-1a16-43d8-8fa9-c4e2f2bd0445" "/downloadedPackageDir/package.zip"来解压

7zip/bin/7za -mm=lzma -mx9 -r -a mac64.zip来重新压缩,以符合某些内部规定。在linux上,只找到32位版本的7zip,有可能有64位,没找到,-mx9报错,ERROR: Can't allocate required memory! 于是把-mx9改成-mmt4暂时work around.

curl -o localPath https://serverPath来下载

curl -u ****:**** -X PUT https://serverPath -T localPath来上传。

解决这些问题后。本地Linux跑过,尝试AWS机器,发现不行,报错。

14:09:13/mnt/data/jenkins/workspace/3PUploadLinux/7zip/bin/7za x -y -bd "-o/mnt/data/jenkins/workspace/3PUploadLinux/temp/984fa08a-a187-434b-bb7a-666b22c86526" "/mnt/data/jenkins/workspace/3PUploadLinux/downloadedPackageDir/package.zip"

14:09:13Traceback (most recent call last):

14:09:13 File "/mnt/data/jenkins/workspace/3PUploadLinux/upload.py", line 124, in

14:09:13 ret_code = main()

14:09:13 File "/mnt/data/jenkins/workspace/3PUploadLinux/upload.py", line 84, in main

14:09:13 ret_code = subprocess.call(shlex.split(commandline), stdout = outputfile)

14:09:13 File "/usr/lib64/python2.7/subprocess.py", line 524, in call

14:09:13 return Popen(*popenargs, **kwargs).wait()

14:09:13 File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__

14:09:13 errread, errwrite)

14:09:13 File "/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child

14:09:13 raise child_exception

14:09:13OSError: [Errno 2] No such file or directory

也不知道哪个文件找不到,怀颖很多问题,还有权限,后来干脆直接调命令。

7zip/bin/7za: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

发现问题在于/lib/ld-linux.so.2没有。这个网上说yum install glibc.i686就可以解决,但是远端的AWS机器,根本没有权限,怎么办。于是想到把本地Linux上的文件弄出来.lld binary可以看到目标加载的文件在哪里。在Linux上,有叫SHARE LIBRARY的库,也有一个叫解释器的。可能类似MAC上的dyld,但是还没完全搞透。暂且当成是普通的library吧。在一台Linux上操作git没有UI也难受,把文件传上来以后,需要7zip能加载同路径的新文件。这涉及到Linux上有ELF格式修改。一直都没涉猎这块,之前只有PE和MACHO的经验。又不想读文件自己写工具,于是找一下有没有Linux版本的install_name_tool。于是在

找到了我要的,patchelf工具。这个是带源码的,自己编译。

wget https://nixos.org/releases/patchelf/patchelf-0.9/patchelf-0.9.tar.gz

tar -zxf patchelf-0.9.tar.gz

cd patchelf-0.9

./configure --prefix=/usr

make && make install

这样patchelf 就可以用了.

patchelf --print-interpreter 可以得到和readelf -l类似的结果,得到解释器的路径

patchelf --print-rpath可以得到rpath路径。

于是用patchelf --set-rpath和 patchelf --set-interpreter来修改解释器和查找路径。最后终于能得到一个在AWS机器上能跑的版本。lld 可以在本地测试,但是发现还是用的/lib/ld-linux.so.2,远端不让运行lld命令,只好直接试。最后成功完成任务。

查看RPATH

对于任意的elf文件,可以使用$ readelf -d xxx | grep 'R*PATH'来查看。

结果有两类,一个是RPATH,另一个是RUNPATH。前文也说了,一般情况下,RPATH为空,而RUNPATH不为空。

RPATH中有个特殊的标识符$ORIGIN。这个标识符代表elf文件自身所在的目录。当希望使用相对位置寻找.so文件,就需要利用$ORIGIN设置RPATH。多个路径之间使用冒号:隔开。

还未进行尝试,先记录一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值