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

如何为TSDuck项目生成dbgsym格式的Debian调试符号包

如何为TSDuck项目生成dbgsym格式的Debian调试符号包

看起来你已经在尝试拆分TSDuck的调试符号包了,不过遇到了Debian打包的小问题,我来帮你梳理下问题根源和解决办法:

首先,你碰到的dpkg-deb错误,原因很直接:你在同一个control文件里写了两个包的条目,但你的打包流程是按单包方式调用dpkg-deb的,它默认只允许一个包的信息。Debian多包打包需要特定的处理逻辑,不能直接把多个包的条目塞到同一个control里就交给dpkg-deb。

下面给你两种可行的解决思路,你可以根据TSDuck的现有打包流程来选:


方法一:用Debian官方的dh工具链自动生成(推荐)

如果你的TSDuck可以适配标准Debian打包流程,这是最省心的方式:

  1. 确保项目里有debian目录,里面放好control(只保留主包tsduck的条目就行,不用手动加tsduck-dbgsym)、rules等基础文件。
  2. 在debian/rules里添加这段规则,告诉dh工具要生成自定义的dbgsym包:
    override_dh_strip:
        dh_strip --dbg-package=tsduck-dbgsym
    
  3. 然后用dpkg-buildpackage -us -uc命令构建包,dh工具会自动帮你生成tsduck-dbgsym.deb,包括自动生成对应的control信息、处理调试符号的拆分和路径,完全不用手动操心。

方法二:手动拆分调试符号(适合自定义打包流程)

如果TSDuck用的是自己写的makefile打包逻辑,不想改dh工具链,可以手动处理:

  1. 保持你原来的编译命令,确保生成带-g调试符号的二进制文件。
  2. 剥离主二进制的调试符号,同时保留调试链接(这样gdb能找到符号文件):
    # 假设你的二进制都在build/bin目录下
    for bin in build/bin/*; do
        # 提取调试符号到单独的.debug文件
        objcopy --only-keep-debug "$bin" "$bin.debug"
        # 剥离主二进制的调试符号,缩小体积
        objcopy --strip-debug "$bin"
        # 添加调试链接,让gdb能关联到.debug文件
        objcopy --add-gnu-debuglink="$bin.debug" "$bin"
    done
    
  3. 分别准备两个包的文件结构:
    • 主包(tsduck.deb):把剥离后的二进制放到对应的系统路径(比如/usr/bin),用你原来的主包control文件。
    • dbgsym包(tsduck-dbgsym.deb):把.debug文件放到/usr/lib/debug/usr/bin/路径下(对应主二进制的位置),用你写的tsduck-dbgsym的control条目。
  4. 用dpkg-deb --build分别打包两个包,注意要给每个包单独准备临时目录,各自放对应的control文件,不要混在一起。

解决你当前的报错

如果你想先快速解决眼前的dpkg-deb错误,核心就是不要让单包打包的命令处理多包的control文件:

  • 要么把你写的多包control拆成两个单独的control文件,分别对应主包和dbgsym包。
  • 要么调整makefile里的打包逻辑,生成两个独立的临时目录,各自放入对应包的文件和control,再分别调用dpkg-deb --build。

举个简单的makefile片段示例(你可以根据自己的路径调整):

# 构建主包临时目录
mkdir -p tmp-tsduck/usr/bin
cp build/bin/* tmp-tsduck/usr/bin/
# 剥离主包二进制符号(用上面的objcopy命令)
# 清理主包的control,只保留tsduck条目
cp tsduck.control tmp-tsduck/DEBIAN/control
sed -i '/Package: tsduck-dbgsym/,/Description:/d' tmp-tsduck/DEBIAN/control
# 替换版本和架构变量
sed -i "s/{{VERSION}}/${VERSION}/g" tmp-tsduck/DEBIAN/control
sed -i "s/{{ARCH}}/${ARCH}/g" tmp-tsduck/DEBIAN/control
# 打包主包
dpkg-deb --build tmp-tsduck tsduck_${VERSION}_${ARCH}.deb

# 构建dbgsym包临时目录
mkdir -p tmp-tsduck-dbgsym/usr/lib/debug/usr/bin
cp tmp-tsduck/usr/bin/*.debug tmp-tsduck-dbgsym/usr/lib/debug/usr/bin/
# 清理dbgsym包的control,只保留tsduck-dbgsym条目
cp tsduck.control tmp-tsduck-dbgsym/DEBIAN/control
sed -i '/Package: tsduck/,/Description:/d' tmp-tsduck-dbgsym/DEBIAN/control
# 替换变量
sed -i "s/{{VERSION}}/${VERSION}/g" tmp-tsduck-dbgsym/DEBIAN/control
sed -i "s/{{ARCH}}/${ARCH}/g" tmp-tsduck-dbgsym/DEBIAN/control
# 打包dbgsym包
dpkg-deb --build tmp-tsduck-dbgsym tsduck-dbgsym_${VERSION}_${ARCH}.deb

这样就能生成两个符合要求的deb包,主包体积变小,调试符号单独放在dbgsym包里,和Debian官方的包结构一致。

备注:内容来源于stack exchange,提问作者ZeroDefect

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 13:19:58