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。多个路径之间使用冒号:隔开。
还未进行尝试,先记录一下。