Debe usar objcopy para separar la información de depuración :
objcopy --only-keep-debug "${tostripfile}" "${debugdir}/${debugfile}"
strip --strip-debug --strip-unneeded "${tostripfile}"
objcopy --add-gnu-debuglink="${debugdir}/${debugfile}" "${tostripfile}"
Utilizo el script bash a continuación para separar la información de depuración en archivos con una extensión .debug en un directorio .debug. De esta manera puedo tar las bibliotecas y ejecutables en un archivo tar y los directorios .debug en otro. Si deseo agregar la información de depuración más adelante, simplemente extraigo el archivo tar de depuración y listo, tengo información de depuración simbólica.
Este es el script 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}"
--build-id
opción de enlazador ?Compilar con información de depuración:
Separe la información de depuración:
o
Elimine la información de depuración del archivo de origen:
o
depuración por modo de enlace de depuración:
También puede usar el archivo exec y el archivo de símbolos por separado:
o
Para detalles:
Ref:
https://sourceware.org/gdb/onlinedocs/gdb/Files.html#Files https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html
fuente
objcopy --add-gnu-debuglink main main.debug
para incrustar el nombre del archivo de depuración creado y una suma de verificación. En este caso, gdb intentará encontrar el código de depuración en algunas ubicaciones dependientes de distribución, ya no se necesita ninguna opción.Consulte la opción "--only-keep-debug" del comando strip .
Desde el enlace:
fuente
NOTA: Los programas compilados con niveles de alta optimización (-O3, -O4) no pueden generar muchos símbolos de depuración para variables optimizadas, funciones alineadas y bucles desenrollados, independientemente de los símbolos que se incrustan (-g) o se extraen (objcopy) en un archivo '.debug'.
Los enfoques alternativos son
La primera opción proporciona un medio para reconstruir el código de producción con depuración completa y símbolos en una fecha posterior. Poder reconstruir el código de producción original sin optimizaciones es una gran ayuda para la depuración. (NOTA: Esto supone que las pruebas se realizaron con la versión optimizada del programa).
Su sistema de compilación puede crear un archivo .c cargado con la fecha de compilación, el compromiso y otros detalles de VCS. Aquí hay un ejemplo de 'make + git':
Después de compilar el programa, puede ubicar el 'commit' original para su código utilizando el comando:
strings -a my_program | grep VCS
Todo lo que queda es verificar el código original, volver a compilar sin optimizaciones y comenzar a depurar.
fuente
-O4
Ni siquiera existe.Ninguna respuesta hasta ahora menciona
eu-strip --strip-debug -f <out.debug> <input>
.elfutils
paquete.<input>
archivo ha sido despojado de símbolos de depuración que ahora están todos dentro<out.debug>
.fuente