Commit 10e68b02 authored by Nick Desaulniers's avatar Nick Desaulniers Committed by Masahiro Yamada
Browse files

Makefile: support compressed debug info



As debug information gets larger and larger, it helps significantly save
the size of vmlinux images to compress the information in the debug
information sections. Note: this debug info is typically split off from
the final compressed kernel image, which is why vmlinux is what's used
in conjunction with GDB. Minimizing the debug info size should have no
impact on boot times, or final compressed kernel image size.

All of the debug sections will have a `C` flag set.
$ readelf -S <object file>

$ bloaty vmlinux.gcc75.compressed.dwarf4 -- \
    vmlinux.gcc75.uncompressed.dwarf4

    FILE SIZE        VM SIZE
 --------------  --------------
  +0.0%     +18  [ = ]       0    [Unmapped]
 -73.3%  -114Ki  [ = ]       0    .debug_aranges
 -76.2% -2.01Mi  [ = ]       0    .debug_frame
 -73.6% -2.89Mi  [ = ]       0    .debug_str
 -80.7% -4.66Mi  [ = ]       0    .debug_abbrev
 -82.9% -4.88Mi  [ = ]       0    .debug_ranges
 -70.5% -9.04Mi  [ = ]       0    .debug_line
 -79.3% -10.9Mi  [ = ]       0    .debug_loc
 -39.5% -88.6Mi  [ = ]       0    .debug_info
 -18.2%  -123Mi  [ = ]       0    TOTAL

$ bloaty vmlinux.clang11.compressed.dwarf4 -- \
    vmlinux.clang11.uncompressed.dwarf4

    FILE SIZE        VM SIZE
 --------------  --------------
  +0.0%     +23  [ = ]       0    [Unmapped]
 -65.6%    -871  [ = ]       0    .debug_aranges
 -77.4% -1.84Mi  [ = ]       0    .debug_frame
 -82.9% -2.33Mi  [ = ]       0    .debug_abbrev
 -73.1% -2.43Mi  [ = ]       0    .debug_str
 -84.8% -3.07Mi  [ = ]       0    .debug_ranges
 -65.9% -8.62Mi  [ = ]       0    .debug_line
 -86.2% -40.0Mi  [ = ]       0    .debug_loc
 -42.0% -64.1Mi  [ = ]       0    .debug_info
 -22.1%  -122Mi  [ = ]       0    TOTAL

For x86_64 defconfig + LLVM=1 (before):
Elapsed (wall clock) time (h:mm:ss or m:ss): 3:22.03
Maximum resident set size (kbytes): 43856

For x86_64 defconfig + LLVM=1 (after):
Elapsed (wall clock) time (h:mm:ss or m:ss): 3:32.52
Maximum resident set size (kbytes): 1566776

Thanks to:
Nick Clifton helped us to provide the minimal binutils version.
Sedat Dilek found an increase in size of debug .deb package.

Cc: Nick Clifton <nickc@redhat.com>
Suggested-by: default avatarDavid Blaikie <blaikie@google.com>
Reviewed-by: default avatarFangrui Song <maskray@google.com>
Tested-by: default avatarSedat Dilek <sedat.dilek@gmail.com>
Signed-off-by: default avatarNick Desaulniers <ndesaulniers@google.com>
Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
parent 565587d8
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -825,6 +825,12 @@ DEBUG_CFLAGS += $(call cc-option, -femit-struct-debug-baseonly) \
		   $(call cc-option,-fno-var-tracking)
endif

ifdef CONFIG_DEBUG_INFO_COMPRESSED
DEBUG_CFLAGS	+= -gz=zlib
KBUILD_AFLAGS	+= -Wa,--compress-debug-sections=zlib
KBUILD_LDFLAGS	+= --compress-debug-sections=zlib
endif

KBUILD_CFLAGS += $(DEBUG_CFLAGS)
export DEBUG_CFLAGS

+17 −0
Original line number Diff line number Diff line
@@ -213,6 +213,23 @@ config DEBUG_INFO_REDUCED
	  DEBUG_INFO build and compile times are reduced too.
	  Only works with newer gcc versions.

config DEBUG_INFO_COMPRESSED
	bool "Compressed debugging information"
	depends on DEBUG_INFO
	depends on $(cc-option,-gz=zlib)
	depends on $(as-option,-Wa$(comma)--compress-debug-sections=zlib)
	depends on $(ld-option,--compress-debug-sections=zlib)
	help
	  Compress the debug information using zlib.  Requires GCC 5.0+ or Clang
	  5.0+, binutils 2.26+, and zlib.

	  Users of dpkg-deb via scripts/package/builddeb may find an increase in
	  size of their debug .deb packages with this config set, due to the
	  debug info being compressed with zlib, then the object files being
	  recompressed with a different compression scheme. But this is still
	  preferable to setting $KDEB_COMPRESS to "none" which would be even
	  larger.

config DEBUG_INFO_SPLIT
	bool "Produce split debuginfo in .dwo files"
	depends on DEBUG_INFO