I am trying to split debug symbols out of final binary, to reduce its size. But I would like to preserve at least line numbers in the stacktraces from
Linux, amd64. gdc 12.2.0 on Debian testing.
Binary is compiled using
-O3 -g -g3 (and possibly -gz).
I then use
objcopy to split debug info from final ELF binary file into .exe and .debug files.
objcopy --only-keep-debug --compress-debug-sections=zlib binary binary.debug to produce .debug file.
Then I use normally
objcopy --strip-debug binary binary.exe (possibly with --compress-debug-sections=zlib) to produce binary.
This makes it possibly to use in gdb without issues (using
gdb -s binary.debug -e binary for example, or by utilizing
--add-gnu-debuglink= option in
But this causes stacktraces to miss line numbers (and columns). (function names are still there, as these are derived from symbol tables instead).
I tried selectively removing DWARF debug sections, but it looks that at least these are required:
So, I can only remove these:
objcopy -R .debug_loc -R .debug_macro -R .debug_ranges -R .debug_loclists
.debug_ranges are not even generated by gcc, so it does not matter probably).
The issue is, this saves me very little space.
.debug_loclists are rather small.
The bulk of information is in
.debug_info. But I believe it contains way more information than is really needed to just produce line numbers.
I did inspect final binaries , and it is using DWARF version 5.
I also tried
-gas-loc-support , but no change.
-g1 makes stack traces work nicely, by making
.debug_info smaller, but then debugging in
gdb is very limited. One option would be to compile application twice, once with
-g1 and once with
-g3. But I really do not think this is supported, or reliable, even if I enable deterministic builds.
In one article ( https://support.backtrace.io/hc/en-us/articles/360040105792-DWARF#RemovingDebugInformation ) I read that for C/C++ in GCC, it is enough to preserve only
.debug_line to get function, source filenames and line numbers. But that is not true for gdc and its stacktrace handler.
I did read about this gdb extension, which is interesting, https://sourceware.org/gdb/onlinedocs/gdb/MiniDebugInfo.html , but I did not try, and it is probably only supported in gdb (i.e. addr2libe, Phobos, libunwind do not support it).