我知道我可以使用 -g 选项生成调试符号。但是,该符号嵌入在目标文件中。gcc 可以在结果可执行文件/库之外生成调试符号吗?就像 windows VC++ 编译器的 .pdb 文件一样。
您需要使用 objcopy 来分隔调试信息:
objcopy --only-keep-debug "${tostripfile}" "${debugdir}/${debugfile}" strip --strip-debug --strip-unneeded "${tostripfile}" objcopy --add-gnu-debuglink="${debugdir}/${debugfile}" "${tostripfile}"
我使用下面的 bash 脚本将调试信息分离到 .debug 目录中扩展名为 .debug 的文件中。这样,我可以将库和可执行文件 tar 放在一个 tar 文件中,将 .debug 目录放在另一个文件中。如果我想稍后添加调试信息,我只需提取调试 tar 文件,瞧,我有符号调试信息。
这是 bash 脚本:
#!/bin/bash scriptdir=`dirname ${0}` scriptdir=`(cd ${scriptdir}; pwd)` scriptname=`basename ${0}` set -e function errorexit() { errorcode=${1} shift echo $@ exit ${errorcode} } function usage() { echo "USAGE ${scriptname} <tostrip>" } tostripdir=`dirname "$1"` tostripfile=`basename "$1"` if [ -z ${tostripfile} ] ; then usage errorexit 0 "tostrip must be specified" fi cd "${tostripdir}" debugdir=.debug debugfile="${tostripfile}.debug" if [ ! -d "${debugdir}" ] ; then echo "creating dir ${tostripdir}/${debugdir}" mkdir -p "${debugdir}" fi echo "stripping ${tostripfile}, putting debug info into ${debugfile}" objcopy --only-keep-debug "${tostripfile}" "${debugdir}/${debugfile}" strip --strip-debug --strip-unneeded "${tostripfile}" objcopy --add-gnu-debuglink="${debugdir}/${debugfile}" "${tostripfile}" chmod -x "${debugdir}/${debugfile}"