Commit 9f8fe647 authored by Nick Desaulniers's avatar Nick Desaulniers Committed by Masahiro Yamada
Browse files

Makefile.debug: support for -gz=zstd

Make DEBUG_INFO_COMPRESSED a choice; DEBUG_INFO_COMPRESSED_NONE is the
default, DEBUG_INFO_COMPRESSED_ZLIB uses zlib,
DEBUG_INFO_COMPRESSED_ZSTD uses zstd.

This renames the existing KConfig option DEBUG_INFO_COMPRESSED to
DEBUG_INFO_COMPRESSED_ZLIB so users upgrading may need to reset the new
Kconfigs.

Some quick N=1 measurements with du, /usr/bin/time -v, and bloaty:

clang-16, x86_64 defconfig plus
CONFIG_DEBUG_INFO=y CONFIG_DEBUG_INFO_COMPRESSED_NONE=y:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:55.43
488M vmlinux
27.6%   136Mi   0.0%       0    .debug_info
 6.1%  30.2Mi   0.0%       0    .debug_str_offsets
 3.5%  17.2Mi   0.0%       0    .debug_line
 3.3%  16.3Mi   0.0%       0    .debug_loclists
 0.9%  4.62Mi   0.0%       0    .debug_str

clang-16, x86_64 defconfig plus
CONFIG_DEBUG_INFO=y CONFIG_DEBUG_INFO_COMPRESSED_ZLIB=y:
Elapsed (wall clock) time (h:mm:ss or m:ss): 1:00.35
385M vmlinux
21.8%  85.4Mi   0.0%       0    .debug_info
 2.1%  8.26Mi   0.0%       0    .debug_str_offsets
 2.1%  8.24Mi   0.0%       0    .debug_loclists
 1.9%  7.48Mi   0.0%       0    .debug_line
 0.5%  1.94Mi   0.0%       0    .debug_str

clang-16, x86_64 defconfig plus
CONFIG_DEBUG_INFO=y CONFIG_DEBUG_INFO_COMPRESSED_ZSTD=y:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:59.69
373M vmlinux
21.4%  81.4Mi   0.0%       0    .debug_info
 2.3%  8.85Mi   0.0%       0    .debug_loclists
 1.5%  5.71Mi   0.0%       0    .debug_line
 0.5%  1.95Mi   0.0%       0    .debug_str_offsets
 0.4%  1.62Mi   0.0%       0    .debug_str

That's only a 3.11% overall binary size savings over zlib, but at no
performance regression.

Link: https://maskray.me/blog/2022-09-09-zstd-compressed-debug-sections
Link: https://maskray.me/blog/2022-01-23-compressed-debug-sections


Suggested-by: default avatarSedat Dilek (DHL Supply Chain) <sedat.dilek@dhl.com>
Reviewed-by: default avatarNathan Chancellor <nathan@kernel.org>
Signed-off-by: default avatarNick Desaulniers <ndesaulniers@google.com>
Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
parent 0d2573a2
Loading
Loading
Loading
Loading
+27 −2
Original line number Diff line number Diff line
@@ -312,8 +312,21 @@ 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"
choice
	prompt "Compressed Debug information"
	help
	  Compress the resulting debug info. Results in smaller debug info sections,
	  but requires that consumers are able to decompress the results.

	  If unsure, choose DEBUG_INFO_COMPRESSED_NONE.

config DEBUG_INFO_COMPRESSED_NONE
	bool "Don't compress debug information"
	help
	  Don't compress debug info sections.

config DEBUG_INFO_COMPRESSED_ZLIB
	bool "Compress debugging information with zlib"
	depends on $(cc-option,-gz=zlib)
	depends on $(ld-option,--compress-debug-sections=zlib)
	help
@@ -327,6 +340,18 @@ config DEBUG_INFO_COMPRESSED
	  preferable to setting $KDEB_COMPRESS to "none" which would be even
	  larger.

config DEBUG_INFO_COMPRESSED_ZSTD
	bool "Compress debugging information with zstd"
	depends on $(cc-option,-gz=zstd)
	depends on $(ld-option,--compress-debug-sections=zstd)
	help
	  Compress the debug information using zstd.  This may provide better
	  compression than zlib, for about the same time costs, but requires newer
	  toolchain support.  Requires GCC 13.0+ or Clang 16.0+, binutils 2.40+, and
	  zstd.

endchoice # "Compressed Debug information"

config DEBUG_INFO_SPLIT
	bool "Produce split debuginfo in .dwo files"
	depends on $(cc-option,-gsplit-dwarf)
+5 −1
Original line number Diff line number Diff line
@@ -27,10 +27,14 @@ else
DEBUG_RUSTFLAGS	+= -Cdebuginfo=2
endif

ifdef CONFIG_DEBUG_INFO_COMPRESSED
ifdef CONFIG_DEBUG_INFO_COMPRESSED_ZLIB
DEBUG_CFLAGS	+= -gz=zlib
KBUILD_AFLAGS	+= -gz=zlib
KBUILD_LDFLAGS	+= --compress-debug-sections=zlib
else ifdef CONFIG_DEBUG_INFO_COMPRESSED_ZSTD
DEBUG_CFLAGS	+= -gz=zstd
KBUILD_AFLAGS	+= -gz=zstd
KBUILD_LDFLAGS	+= --compress-debug-sections=zstd
endif

KBUILD_CFLAGS	+= $(DEBUG_CFLAGS)