You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:04:54