]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
Makefile: support compressed debug info
authorNick Desaulniers <ndesaulniers@google.com>
Tue, 26 May 2020 17:18:29 +0000 (10:18 -0700)
committerMasahiro Yamada <masahiroy@kernel.org>
Thu, 28 May 2020 18:08:49 +0000 (03:08 +0900)
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: David Blaikie <blaikie@google.com>
Reviewed-by: Fangrui Song <maskray@google.com>
Tested-by: Sedat Dilek <sedat.dilek@gmail.com>
Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Makefile
lib/Kconfig.debug

index 48a2dfaf3bf3ba617c9c6a36295b342b0a71fc32..2df903429d3173ba79df64ffedebe2f9c44d0f22 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -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
 
index 21d9c5f6e7ec7552be6f46fa352a29394465e3cc..d7da101bccc81fb0eb7545ecac6a490da3c27e93 100644 (file)
@@ -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