如何创建包含a.out及其所有依赖(含符号链接)的tar.gz文件
打包二进制文件及其依赖的正确方法
我尝试创建包含some-proj/build/a.out及其所有依赖(包括符号链接)的tar.gz包,执行了以下命令:
ldd some-proj/build/a.out | tar -hcvf some-proj.tar.gz -T -
ldd输出内容:
linux-vdso.so.1 (0x00007ffd54a88000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007faa62b15000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007faa62ae7000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007faa628d3000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007faa62651000) /lib64/ld-linux-x86-64.so.2 (0x00007faa633b7000)
执行后报错:
tar: \tlinux-vdso.so.1 (0x00007ffefeae7000): Cannot stat: No such file or directory tar: \tlibstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f09e249b000): Cannot stat: No such file or directory tar: \tlibgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f09e246d000): Cannot stat: No such file or directory tar: \tlibc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f09e2259000): Cannot stat: No such file or directory tar: \tlibm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f09e1fd7000): Cannot stat: No such file or directory tar: \t/lib64/ld-linux-x86-64.so.2 (0x00007f09e2d3d000): Cannot stat: No such file or directory tar: Exiting with failure status due to previous errors
问题原因
ldd的输出包含空格、箭头符号和内存地址,tar无法直接识别这些内容为有效文件路径linux-vdso.so.1是虚拟动态共享对象,仅存在于进程内存中,没有对应的磁盘文件,无法被打包
解决方法
需要先过滤ldd的输出,提取真实存在的依赖文件路径,再和原二进制文件一起打包。
方法一:用awk精准提取路径
(ldd some-proj/build/a.out | awk '/=>/ {print $3}; /^\/lib/ {print $1}') | grep -v 'linux-vdso.so.1' | tar -hcvf some-proj.tar.gz some-proj/build/a.out -T -
awk '/=>/ {print $3}':提取带=>行的第三列,也就是实际依赖文件的路径awk '/^\/lib/ {print $1}':提取以/lib开头行的第一列,处理像/lib64/ld-linux-x86-64.so.2这类直接显示路径的条目grep -v 'linux-vdso.so.1':排除不存在的虚拟DSO文件tar -hcvf ... some-proj/build/a.out -T -:先指定原二进制文件,再从标准输入读取过滤后的依赖路径,-h选项会跟随符号链接,打包链接指向的实际文件
方法二:用grep简化过滤
ldd some-proj/build/a.out | grep -o '/.*' | grep -v 'linux-vdso.so.1' | tar -hcvf some-proj.tar.gz some-proj/build/a.out -T -
grep -o '/.*':直接提取所有以/开头的字符串,快速获取有效文件路径- 后续步骤和方法一一致,最终完成包含原二进制和所有依赖的打包
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

