Message ID | 20200521220041.87368-1-ndesaulniers@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v3] Makefile: support compressed debug info | expand |
On Fri, May 22, 2020 at 12:00 AM Nick Desaulniers <ndesaulniers@google.com> wrote: > > 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 > > Suggested-by: David Blaikie <blaikie@google.com> > Suggested-by: Nick Clifton <nickc@redhat.com> > Suggested-by: Sedat Dilek <sedat.dilek@gmail.com> > Reviewed-by: Fangrui Song <maskray@google.com> > Tested-by: Sedat Dilek <sedat.dilek@gmail.com> Re-tested V3 on top of Linux v5.7-rc6+ with Clang/LLD v10.0.1-rc1. - Sedat - > Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> > --- > Changes V2 -> V3: > * Fix blaikie@'s email addr. > * Fix Fangrui's Reviewed-by tag as per Masahiro. > * Fix help text as per Masahiro. > * Fix -Wa$(comma)foo as per Masahiro. > > Changes V1 -> V2: > * rebase on linux-next. > * Add assembler flags as per Fangrui. > * Add note about KDEB_COMPRESS+scripts/package/builddeb > as per Sedat and Masahiro. > * Add note about bintutils version requirements as per Nick C. > * Add note about measured increased build time and max RSS. > Makefile | 6 ++++++ > lib/Kconfig.debug | 17 +++++++++++++++++ > 2 files changed, 23 insertions(+) > > diff --git a/Makefile b/Makefile > index 71687bfe1cd9..be8835296754 100644 > --- a/Makefile > +++ b/Makefile > @@ -822,6 +822,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 > > diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug > index b8f023e054b9..7fc82dcf814b 100644 > --- a/lib/Kconfig.debug > +++ b/lib/Kconfig.debug > @@ -225,6 +225,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 > -- > 2.27.0.rc0.183.gde8f92d652-goog >
On Fri, May 22, 2020 at 7:00 AM 'Nick Desaulniers' via Clang Built Linux <clang-built-linux@googlegroups.com> wrote: > > 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 > > Suggested-by: David Blaikie <blaikie@google.com> > Suggested-by: Nick Clifton <nickc@redhat.com> > Suggested-by: Sedat Dilek <sedat.dilek@gmail.com> > Reviewed-by: Fangrui Song <maskray@google.com> > Tested-by: Sedat Dilek <sedat.dilek@gmail.com> > Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> Suggested-by seems strange to me, but I decided to not be worried too much. Applied to linux-kbuild. Thanks.
On Tue, May 26, 2020 at 3:28 AM Masahiro Yamada <masahiroy@kernel.org> wrote: > > > Suggested-by: David Blaikie <blaikie@google.com> > > Suggested-by: Nick Clifton <nickc@redhat.com> > > Suggested-by: Sedat Dilek <sedat.dilek@gmail.com> > > Reviewed-by: Fangrui Song <maskray@google.com> > > Tested-by: Sedat Dilek <sedat.dilek@gmail.com> > > Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> > > > > Suggested-by seems strange to me, but > I decided to not be worried too much. Ah, sorry, Monday was a holiday. I unplugged for the long weekend. https://en.wikipedia.org/wiki/Memorial_Day I like the suggestion to simply say "thanks to ..." in the commit message and will use that next time. I was ok to send a v4 with it. > > Applied to linux-kbuild. Appreciated. I will have a dwarf-5 patch set, too. I'm not thrilled with how I wired up Kconfig; maybe posting it for feedback is better than me worrying about it too much. Hopefully will send this week, assuming there's not too many bugs that require my immediate attention (there never is...).
On Wed, May 27, 2020 at 12:53 AM 'Nick Desaulniers' via Clang Built Linux <clang-built-linux@googlegroups.com> wrote: > > On Tue, May 26, 2020 at 3:28 AM Masahiro Yamada <masahiroy@kernel.org> wrote: > > > > > Suggested-by: David Blaikie <blaikie@google.com> > > > Suggested-by: Nick Clifton <nickc@redhat.com> > > > Suggested-by: Sedat Dilek <sedat.dilek@gmail.com> > > > Reviewed-by: Fangrui Song <maskray@google.com> > > > Tested-by: Sedat Dilek <sedat.dilek@gmail.com> > > > Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> > > > > > > > > Suggested-by seems strange to me, but > > I decided to not be worried too much. > > Ah, sorry, Monday was a holiday. I unplugged for the long weekend. > https://en.wikipedia.org/wiki/Memorial_Day > > I like the suggestion to simply say "thanks to ..." in the commit > message and will use that next time. I was ok to send a v4 with it. If you send v4, I will replace. Thanks.
diff --git a/Makefile b/Makefile index 71687bfe1cd9..be8835296754 100644 --- a/Makefile +++ b/Makefile @@ -822,6 +822,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 diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index b8f023e054b9..7fc82dcf814b 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -225,6 +225,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