Hello Guix! A while back Dave Love (IIRC) suggested stripping binaries with ‘--strip-all’ instead of ‘--strip-debug’. I found traces of a previous unfruitful experiment in that area as shown in this commit:
commit 7da473b75721e06237b106c6d186f2729117b1ee Author: Ludovic Courtès <[email protected]> Date: Mon Dec 29 21:44:48 2014 +0100 gnu: Revert use of '--strip-all'. This reverts commits f05bdc9412135f34a1c417edc203c35cd005d0d5 and 856ae5e6c71a1283a414d33e638051f95d3cce35. This broke all sorts of things. See <http://hydra.gnu.org/eval/102058>, for example. Unfortunately, the Hydra URL above is no longer available and I have no idea what broke exactly. The patch below reverts the revert. I’ve built Coreutils, Git, and Node on top of ‘core-updates’ with it. Here are the sizes compared to master: --8<---------------cut here---------------start------------->8--- $ ./pre-inst-env guix size git | tail -1 total: 354.6 MiB $ guix size git | tail -1 total: 364.5 MiB $ ./pre-inst-env guix build -e '(@@ (gnu packages commencement) coreutils-final)' /gnu/store/6mvaqb321wsxgb6v1rddczpd0n4b2x6g-coreutils-8.29-debug /gnu/store/n7911c84mipr2qjp6vjqj1mbih5xysrk-coreutils-8.29 $ guix size /gnu/store/n7911c84mipr2qjp6vjqj1mbih5xysrk-coreutils-8.29 | tail -1 total: 77.7 MiB $ guix build -e '(@@ (gnu packages commencement) coreutils-final)' /gnu/store/l890vkp8mj07r9faglddwkpf7w33w71y-coreutils-8.28-debug /gnu/store/6i33ik7haav0hd5a797l3llkq04ghx6g-coreutils-8.28 $ guix size /gnu/store/6i33ik7haav0hd5a797l3llkq04ghx6g-coreutils-8.28 | tail -1 total: 78.9 MiB $ ./pre-inst-env guix size node | tail -1 total: 194.6 MiB $ guix size node | tail -1 total: 201.9 MiB --8<---------------cut here---------------end--------------->8--- So we’re talking about a 1.5–3.6% improvement on the whole closures, which is quite disappointing. If we look at Coreutils and Git alone (not the closure), we gain 7.3% and 8.9% respectively (for reference, Coreutils in Debian is at 14.7 MiB per <https://packages.debian.org/sid/coreutils>): --8<---------------cut here---------------start------------->8--- $ guix size /gnu/store/n7911c84mipr2qjp6vjqj1mbih5xysrk-coreutils-8.29 | grep coreutils /gnu/store/n7911c84mipr2qjp6vjqj1mbih5xysrk-coreutils-8.29 77.7 13.9 17.9% $ guix size /gnu/store/6i33ik7haav0hd5a797l3llkq04ghx6g-coreutils-8.28 | grep coreutils /gnu/store/6i33ik7haav0hd5a797l3llkq04ghx6g-coreutils-8.28 78.9 15.0 19.0% $ ./pre-inst-env guix size git | grep git-2.16 /gnu/store/f4bwbv3clbyz5snjfbq7wzrxlvj0rwwh-git-2.16.2 354.6 31.4 8.9% $ guix size git | grep git-2.16 /gnu/store/jwbc0rnn7qa4064bghqs7q8r0bm7v32p-git-2.16.2 364.5 34.5 9.5% --8<---------------cut here---------------end--------------->8--- We get 9.8% for Node (it’s C++, so it has bigger symbol tables I guess): --8<---------------cut here---------------start------------->8--- $ ./pre-inst-env guix size node | grep node /gnu/store/iwdhzvdqjfqfd0m62f6z8a6sxqzb24cr-node-9.4.0 194.6 44.0 22.6% $ guix size node | grep node /gnu/store/rk8is4gw40w9dbzj6q3313z7ly34mj62-node-9.4.0 201.9 48.8 24.2% --8<---------------cut here---------------end--------------->8--- The main downside is unexpected breakage as the 2014 commit above suggests (would “--strip-debug --strip-unneeded” be safer?). Thoughts? Ludo’.
>From bc7fcb3dccd1a30f6294a082293389b2de0e6f53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <[email protected]> Date: Sat, 27 Dec 2014 19:20:18 +0100 Subject: [PATCH] build-system/gnu: Strip with '--strip-all' instead of '--strip-debug'. This saves 19% on the 'bin' directory of Coreutils, and certainly helpful for things like Git's 'libexec' directory. This reinstates commits f05bdc9412135f34a1c417edc203c35cd005d0d5 and 856ae5e6c71a1283a414d33e638051f95d3cce35. * guix/build-system/gnu.scm (gnu-build): Change default value for #:strip-flags to '("--strip-all"). Add #:archive-strip-flags parameter and pass it down. * guix/build/gnu-build-system.scm (strip): Ditto. Add #:archive-strip-flags parameter. Use it when (ar-file? path). * gnu/packages/linux.scm (linux-libre)[arguments]: Add #:strip-flags. * gnu/packages/commencement.scm (gcc-boot0)[arguments]: Add #:strip-flags. * gnu/packages/base.scm (glibc)[arguments]: Likewise. --- gnu/packages/base.scm | 3 +++ gnu/packages/commencement.scm | 4 ++++ gnu/packages/linux.scm | 7 ++++++- guix/build-system/gnu.scm | 6 ++++-- guix/build/gnu-build-system.scm | 13 +++++++++++-- 5 files changed, 28 insertions(+), 5 deletions(-) diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm index 2a5008059..1e06cfa61 100644 --- a/gnu/packages/base.scm +++ b/gnu/packages/base.scm @@ -627,6 +627,9 @@ store.") ;; XXX: Work around "undefined reference to `__stack_chk_guard'". "libc_cv_ssp=no" "libc_cv_ssp_strong=no") + ;; Using '--strip-all' on crt*.o breaks them. + #:strip-flags '("--strip-debug") + #:tests? #f ; XXX #:phases (modify-phases %standard-phases (add-before diff --git a/gnu/packages/commencement.scm b/gnu/packages/commencement.scm index 3636b54b0..6a233f448 100644 --- a/gnu/packages/commencement.scm +++ b/gnu/packages/commencement.scm @@ -225,6 +225,10 @@ (ice-9 regex) (srfi srfi-1) (srfi srfi-26)) + + ;; Using '--strip-all' leads to a link failure while building libc. + #:strip-flags '("--strip-debug") + ,@(substitute-keyword-arguments (package-arguments gcc) ((#:configure-flags flags) `(append (list ,(string-append "--target=" (boot-triplet)) diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index a752fcf1b..0a238ee32 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <[email protected]> +;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <[email protected]> ;;; Copyright © 2013, 2014, 2015, 2016 Andreas Enge <[email protected]> ;;; Copyright © 2012 Nikita Karetnikov <[email protected]> ;;; Copyright © 2014, 2015, 2016, 2017, 2018 Mark H Weaver <[email protected]> @@ -368,6 +368,11 @@ for ARCH and optionally VARIANT, or #f if there is no such configuration." (string-append "INSTALL_MOD_PATH=" out) "INSTALL_MOD_STRIP=1" "modules_install"))))) + + ;; Use '--strip-debug', not '--strip-all', because the latter leads to + ;; unloadable modules (due to the lack of a symbol table.) + #:strip-flags ''("--strip-debug" "--enable-deterministic-archives") + #:tests? #f)) (home-page "https://www.gnu.org/software/linux-libre/") (synopsis "100% free redistribution of a cleaned Linux kernel") diff --git a/guix/build-system/gnu.scm b/guix/build-system/gnu.scm index c9140074b..bc02e498d 100644 --- a/guix/build-system/gnu.scm +++ b/guix/build-system/gnu.scm @@ -290,8 +290,9 @@ standard packages used as implicit inputs of the GNU build system." (parallel-tests? #t) (patch-shebangs? #t) (strip-binaries? #t) - (strip-flags ''("--strip-debug" + (strip-flags ''("--strip-all" "--enable-deterministic-archives")) + (archive-strip-flags ''("--strip-debug")) (strip-directories ''("lib" "lib64" "libexec" "bin" "sbin")) (validate-runpath? #t) @@ -365,6 +366,7 @@ packages that must not be referenced." #:validate-runpath? ,validate-runpath? #:license-file-regexp ,license-file-regexp #:strip-flags ,strip-flags + #:archive-strip-flags ,archive-strip-flags #:strip-directories ,strip-directories))) (define guile-for-build @@ -439,7 +441,7 @@ is one of `host' or `target'." (parallel-build? #t) (parallel-tests? #t) (patch-shebangs? #t) (strip-binaries? #t) - (strip-flags ''("--strip-debug" + (strip-flags ''("--strip-all" "--enable-deterministic-archives")) (strip-directories ''("lib" "lib64" "libexec" "bin" "sbin")) diff --git a/guix/build/gnu-build-system.scm b/guix/build/gnu-build-system.scm index 7b43361f9..59c5dfa0e 100644 --- a/guix/build/gnu-build-system.scm +++ b/guix/build/gnu-build-system.scm @@ -345,8 +345,14 @@ makefiles." (objcopy-command (if target (string-append target "-objcopy") "objcopy")) - (strip-flags '("--strip-debug" + (strip-flags '("--strip-all" "--enable-deterministic-archives")) + + ;; Using '--strip-all' on .a file would remove the archive + ;; index, leading to "Archive has no index" errors when + ;; linking against them. + (archive-strip-flags '("--strip-debug")) + (strip-directories '("lib" "lib64" "libexec" "bin" "sbin")) #:allow-other-keys) @@ -405,7 +411,10 @@ makefiles." (begin (make-file-writable file) #t) (zero? (apply system* strip-command - (append strip-flags (list file)))) + (append (if (ar-file? file) + archive-strip-flags + strip-flags) + (list file)))) (or (not debug-output) (add-debug-link file)))) (find-files dir -- 2.16.2
