1. ホーム
  2. gcc

[解決済み] ビルドターゲットの外にgccのデバッグシンボルを生成する方法は?

2022-04-22 17:09:31

質問

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のファイルに分離しています。この方法で、ライブラリと実行ファイルを1つのtarファイルに、.debugディレクトリを別のtarファイルにすることができます。後でデバッグ情報を追加したい場合は、単にデバッグ 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}"