如何为TSDuck项目生成dbgsym格式的Debian调试符号包
如何为TSDuck项目生成dbgsym格式的Debian调试符号包
看起来你已经在尝试拆分TSDuck的调试符号包了,不过遇到了Debian打包的小问题,我来帮你梳理下问题根源和解决办法:
首先,你碰到的dpkg-deb错误,原因很直接:你在同一个control文件里写了两个包的条目,但你的打包流程是按单包方式调用dpkg-deb的,它默认只允许一个包的信息。Debian多包打包需要特定的处理逻辑,不能直接把多个包的条目塞到同一个control里就交给dpkg-deb。
下面给你两种可行的解决思路,你可以根据TSDuck的现有打包流程来选:
方法一:用Debian官方的dh工具链自动生成(推荐)
如果你的TSDuck可以适配标准Debian打包流程,这是最省心的方式:
- 确保项目里有
debian目录,里面放好control(只保留主包tsduck的条目就行,不用手动加tsduck-dbgsym)、rules等基础文件。 - 在
debian/rules里添加这段规则,告诉dh工具要生成自定义的dbgsym包:override_dh_strip: dh_strip --dbg-package=tsduck-dbgsym - 然后用
dpkg-buildpackage -us -uc命令构建包,dh工具会自动帮你生成tsduck-dbgsym.deb,包括自动生成对应的control信息、处理调试符号的拆分和路径,完全不用手动操心。
方法二:手动拆分调试符号(适合自定义打包流程)
如果TSDuck用的是自己写的makefile打包逻辑,不想改dh工具链,可以手动处理:
- 保持你原来的编译命令,确保生成带
-g调试符号的二进制文件。 - 剥离主二进制的调试符号,同时保留调试链接(这样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 - 分别准备两个包的文件结构:
- 主包(tsduck.deb):把剥离后的二进制放到对应的系统路径(比如
/usr/bin),用你原来的主包control文件。 - dbgsym包(tsduck-dbgsym.deb):把
.debug文件放到/usr/lib/debug/usr/bin/路径下(对应主二进制的位置),用你写的tsduck-dbgsym的control条目。
- 主包(tsduck.deb):把剥离后的二进制放到对应的系统路径(比如
- 用
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
相关产品推荐
相关产品推荐

