To reduce the size of shipped binaries it can be useful to separate the debug information into a separate file. This procedure is covered in the dbx manual. We can use objdump
to extract the debug information and then to link the executable with the extracted data.
Here's a short example executable:
#include <stdio.h> #include <math.h> int main() { double d=1.0; d = sin(d); printf("sin(1.0) = %f\n",d); }
Compiled with debug:
$ cc -g hello.c -lm $ ./a.out sin(1.0) = 0.841471
We can debug this executable with dbx. Note that, in this case, we compiled without optimisation in order to get the best debug information. Doing this does potentially sacrifice some performance. We can follow the same procedure with optimised code.
$ dbx ./a.out Reading ld.so.1 Reading libm.so.2 Reading libc.so.1 (dbx) stop in main (2) stop in main (dbx) run Running: a.out (process id 53296) stopped in main at line 6 in file "hello.c" 6 double d=1.0; (dbx) step stopped in main at line 7 in file "hello.c" 7 d = sin(d); (dbx) print d d = 1.0 (dbx) cont Reading libc_psr.so.1 sin(1.0) = 0.841471
First of all we are going to use objcopy to extract the debug information from ./a.out and place it into ./a.out.debug:
$ /usr/sfw/bin/gobjcopy --only-keep-debug ./a.out ./a.out.debug
Now we can strip a.out of debug information:
$ strip ./a.out
To prove that this has removed the debug information we can try running under dbx:
$ dbx ./a.out Reading ld.so.1 Reading libm.so.2 Reading libc.so.1 (dbx) stop in main dbx: warning: 'main' has no debugger info -- will trigger on first instruction (2) stop in main (dbx) quit
Now we want to use objcopy to make a link between the executable and its debug information:
$ /usr/sfw/bin/gobjcopy --add-gnu-debuglink=./a.out.debug ./a.out
Now when we debug the executable we are back to full debug:
$ dbx ./a.out Reading ld.so.1 Reading libm.so.2 Reading libc.so.1 (dbx) stop in main (2) stop in main (dbx) run Running: a.out (process id 58837) stopped in main at line 6 in file "hello.c" 6 double d=1.0; (dbx) next stopped in main at line 7 in file "hello.c" 7 d = sin(d); (dbx) print d d = 1.0 (dbx) cont Reading libc_psr.so.1 sin(1.0) = 0.841471 execution completed, exit code is 0 (dbx) quit