来自 Debian 的调试包,我知道在创建两部分可执行文件时,可执行文件的调试信息文件会进入/usr/lib/debug
(即,剥离可执行文件的符号并将它们放在单独的文件中)。
但是,符号文件将引用源文件,并且我不知道源文件应该放置在哪里。在 Red Hat/Fedora 上,我知道它们位于/usr/src/debug
(根据 Fedora 的打包:调试信息)。
在 Debian 上进行调试的源文件应该放在哪里?
一个具体的例子是 Crypto++。我有一个补丁,GNUMakefile
添加了以下内容:
IS_DEBIAN = $(shell uname -a 2>&1 | $(EGREP) -i -c "debian|ubuntu|mint")
...
# https://wiki.debian.org/DebugPackage
ifeq ($(IS_DEBIAN),1)
DEBUG_SYM_DIR ?= /usr/lib/debug/cryptopp
DEBUG_SRC_DIR ?= /usr/src/debug/cryptopp
endif
...
然后有一个符号配方,如下所示:
symbol symbols:
$(MKDIR) -p $(DEBUG_SYM_DIR) $(DEBUG_SRC_DIR)
-objcopy --only-keep-debug cryptest.exe cryptest.exe.debug
-objcopy --only-keep-debug libcryptopp.so libcryptopp.so.debug
-strip --strip-debug --strip-unneeded cryptest.exe
-strip --strip-debug --strip-unneeded libcryptopp.so
-$(CP) cryptest.exe.debug $(DEBUG_SYM_DIR)/
-$(CP) libcryptopp.so.debug $(DEBUG_SYM_DIR)/
-objcopy --add-gnu-debuglink=$(DEBUG_SYM_DIR)/cryptest.exe.debug cryptest.exe
-objcopy --add-gnu-debuglink=$(DEBUG_SYM_DIR)/libcryptopp.so.debug libcryptopp.so
-$(CP) *.h *.cpp $(DEBUG_SRC_DIR)/
所以工作流程是:
cd cryptopp
make static dynamic test
sudo make symbols
sudo make install
相关,但不相关(以防有人想发表评论):我无法将符号添加为另一个食谱的依赖项,或者只是make symbols
因为其中的错误objcopy
(我相信它是一个错误 - 请参阅Binutil Bug 18064 - objcopy、add-gnu-debuglink 和“无法填充调试链接部分”)。
答案1
Debian 二进制包不包含源代码,除非在少数情况下源代码可用于构建其他包(例如 liblzo2-dev
for minilzo.c
、 或binutils-source
等gcc-4.9-source
用于构建工具链),或者许多用户希望能够轻松安装源代码(例如内核源代码)。源代码以源代码包形式提供,该源代码由dpkg-buildpackage
.
安装 Debian 软件包源代码的方法是使用apt-get source
;在你的情况下
apt-get source cryptopp
用户可以在任何有写入权限的地方执行此操作,这意味着没有规范的源位置。此外,由于包可以在任何地方构建,所以存储的源位置也可能会改变...(Debian 中有一个有趣的功能可以提供帮助:/usr/src
属于组并且是组可写的,因此组src
中的任何用户src
可以使用该目录,而无需将root
提供源代码的二进制包安装在 中/usr/src
。)
因此,要在 Debian 中使用带有相应源代码的调试包,您需要安装调试包,获取如上匹配的源代码,并告诉gdb
如何使用directory
和set substitute-path
语句进行匹配(请参阅gdb文档了解详情)。
在打包方面,源包会自行处理,如果您使用debhelper
,调试包也会自行处理(自版本 9.20151219 起)。