Message ID | 20200526170321.137238-1-ndesaulniers@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v4] Makefile: support compressed debug info | expand |
On Tue, May 26, 2020 at 10:03 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 > > Thanks to: > Nick Clifton helped us to provide the minimal binutils version. > Sedat Dilet found an increase in size of debug .deb package. > > Cc: Nick Clifton <nickc@redhat.com> > Cc: Sedat Dilek <sedat.dilek@gmail.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> > --- > Changes V3 -> V4: > * Add thanks line to commit message as per Masahiro. > * Swap Sugguested-by to Cc for two lines in commit message, as per > Masahiro. > > 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 ++++++ > arch/arm64/kernel/vdso32/Makefile | 2 +- Sorry, I was wondering why Will and TGLX got cc'ed. My tree was dirty when I amended ... was carrying another patch to send, please disregard v4, and sorry for the noise. > lib/Kconfig.debug | 17 +++++++++++++++++ > 3 files changed, 24 insertions(+), 1 deletion(-) > > 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/arch/arm64/kernel/vdso32/Makefile b/arch/arm64/kernel/vdso32/Makefile > index 3964738ebbde..5fd7792d03fc 100644 > --- a/arch/arm64/kernel/vdso32/Makefile > +++ b/arch/arm64/kernel/vdso32/Makefile > @@ -135,7 +135,7 @@ c-obj-vdso-gettimeofday := vgettimeofday.o > asm-obj-vdso := sigreturn.o > > ifneq ($(c-gettimeofday-y),) > -VDSO_CFLAGS_gettimeofday_o += -include $(c-gettimeofday-y) > +VDSO_CFLAGS_gettimeofday_o += -include $(c-gettimeofday-y) -marm > endif > > VDSO_CFLAGS_REMOVE_vgettimeofday.o = $(CC_FLAGS_FTRACE) -Os > 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 >
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/arch/arm64/kernel/vdso32/Makefile b/arch/arm64/kernel/vdso32/Makefile index 3964738ebbde..5fd7792d03fc 100644 --- a/arch/arm64/kernel/vdso32/Makefile +++ b/arch/arm64/kernel/vdso32/Makefile @@ -135,7 +135,7 @@ c-obj-vdso-gettimeofday := vgettimeofday.o asm-obj-vdso := sigreturn.o ifneq ($(c-gettimeofday-y),) -VDSO_CFLAGS_gettimeofday_o += -include $(c-gettimeofday-y) +VDSO_CFLAGS_gettimeofday_o += -include $(c-gettimeofday-y) -marm endif VDSO_CFLAGS_REMOVE_vgettimeofday.o = $(CC_FLAGS_FTRACE) -Os 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