Leaner Binaries
Suppose that you are building a C or C++ Linux program that is going to
be installed on tens or hundreds of your production machines. Since
this software is not shipped to customers, you may as well leave the
debug information in, to help you later with troubleshooting.
For
complex programs, the size of the debug information (especially for C++
programs) may be considerable, and it may impact your deployment time.
Hopefully
you will not need the debug symbols as often. What if you could store
the debug information on only one server instead of N?
Turns out
you can pull this trick easily, with the following bash script, which
you can include in your Makefile as a post-build step:
#! /bin/bash
DBGFILE=DebugInfoServerNetworkMountedPath/$1.dbg
if objcopy --only-keep-debug $1 $DBGFILE; then
#strip -d $1 # strip debug info, or strip everything:
strip $1
objcopy --add-gnu-debuglink=$DBGFILE $1
fi
That's it.
"But how is the debugger going to know how to locate the debug information, since we stripped it out?" one may ask.
Simple. This
objcopy --add-gnu-debuglink
step creates a special section inside the ELF executable, which will
point to the (network) location of the debug information. Both GDB and ZeroBUGS know how to handle it transparently.