小编典典

如何在构建目标之外生成 gcc 调试符号?

all

我知道我可以使用 -g 选项生成调试符号。但是,该符号嵌入在目标文件中。gcc 可以在结果可执行文件/库之外生成调试符号吗?就像 windows VC++
编译器的 .pdb 文件一样。


阅读 59

收藏
2022-07-07

共1个答案

小编典典

您需要使用 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}"
2022-07-07