]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
build: reduce size of multi-call binary by reusing cksum logic master
authorPádraig Brady <P@draigBrady.com>
Sat, 6 Dec 2025 13:47:11 +0000 (13:47 +0000)
committerPádraig Brady <P@draigBrady.com>
Sat, 13 Dec 2025 17:18:47 +0000 (17:18 +0000)
Map md5sum and sha{1,224,256,385,512} to use cksum logic,
which selects appropriate behavior at runtime, rather than
separate binaries for each closely related utility.

$ size src/coreutils  # before
   text    data     bss     dec     hex filename
1349509    6812  619312 1975633  1e2551 src/coreutils
$ size src/coreutils  # after
   text    data     bss     dec     hex filename
1306933    6748  619152 1932833  1d7e21 src/coreutils

* build-aux/gen-single-binary.sh: Map sha*sum to use cksum.c
* src/cksum.c: Adjust to behave more like sha*sum,
when the algorithm to something other than "crc".
* src/cksum.h: Expose the cksum_algorithm global and enum.
* src/coreutils-md5sum.c: Set cksum_algorithm and call cksum logic.
* src/coreutils-sha1sum.c: Likewise.
* src/coreutils-sha224sum.c Likewise.
* src/coreutils-sha256sum.c Likewise.
* src/coreutils-sha384sum.c Likewise.
* src/coreutils-sha512sum.c Likewise.
* NEWS: Mention the improvement.

NEWS
build-aux/gen-single-binary.sh
src/cksum.c
src/cksum.h [new file with mode: 0644]
src/coreutils-md5sum.c [new file with mode: 0644]
src/coreutils-sha1sum.c [new file with mode: 0644]
src/coreutils-sha224sum.c [new file with mode: 0644]
src/coreutils-sha256sum.c [new file with mode: 0644]
src/coreutils-sha384sum.c [new file with mode: 0644]
src/coreutils-sha512sum.c [new file with mode: 0644]
src/local.mk

diff --git a/NEWS b/NEWS
index b283b6908b0908623d09f85b199d1e6a73093b07..4f78f9ea8b522f3d1dfd7a3e31150944f009781c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -46,6 +46,10 @@ GNU coreutils NEWS                                    -*- outline -*-
 
 ** Improvements
 
+  The multi-call binary built with configure --enable-single-binary
+  is reduced in size by 3.2% through the more efficient reuse of the cksum
+  utility by the md5sum and sha*sum utilities.
+
   csplit, ls, and sort, now handle a more complete set of terminating signals.
 
   'pinky' will now exit immediately upon receiving a write error, which is
index 7d15b9bfc2dc5e5bc9b5cff10e0206964347faa3..a89a6bc839c260f4027b9747dc7e686752660ed9 100755 (executable)
@@ -72,6 +72,12 @@ override_single dir ls
 override_single vdir ls
 override_single arch uname
 override_single chgrp chown
+override_single md5sum cksum
+override_single sha1sum cksum
+override_single sha224sum cksum
+override_single sha256sum cksum
+override_single sha384sum cksum
+override_single sha512sum cksum
 
 for cmd in $ALL_PROGRAMS; do
   echo "# Command $cmd"
index ac3e3f10ef8e2cfc7bc4d8ff4fd08e695e719e4f..2b1f7fc1b9042ef55309f9bff7131f73ca1cb7d7 100644 (file)
@@ -37,6 +37,7 @@
 # include "sum.h"
 #endif
 #if HASH_ALGO_CKSUM
+# include "cksum.h"
 # include "cksum_crc.h"
 # include "base64.h"
 #endif
@@ -332,24 +333,6 @@ sm3_sum_stream (FILE *stream, void *resstream, MAYBE_UNUSED uintmax_t *length)
   return sm3_stream (stream, resstream);
 }
 
-enum Algorithm
-{
-  bsd,
-  sysv,
-  crc,
-  crc32b,
-  md5,
-  sha1,
-  sha224,
-  sha256,
-  sha384,
-  sha512,
-  sha2,
-  sha3,
-  blake2b,
-  sm3,
-};
-
 static char const *const algorithm_args[] =
 {
   "bsd", "sysv", "crc", "crc32b", "md5", "sha1",
@@ -380,7 +363,9 @@ static int const algorithm_bits[] =
 static_assert (countof (algorithm_bits) == countof (algorithm_args));
 
 static bool algorithm_specified = false;
-static enum Algorithm cksum_algorithm = crc;
+static bool legacy_mode = false;
+enum Algorithm cksum_algorithm = crc;
+
 static sumfn cksumfns[]=
 {
   bsd_sum_stream,
@@ -434,6 +419,27 @@ enum
   BASE64_OPTION,
 };
 
+#if HASH_ALGO_CKSUM
+static struct option const legacy_long_options[] =
+{
+  { "check", no_argument, nullptr, 'c' },
+  { "ignore-missing", no_argument, nullptr, IGNORE_MISSING_OPTION },
+  { "quiet", no_argument, nullptr, QUIET_OPTION },
+  { "status", no_argument, nullptr, STATUS_OPTION },
+  { "warn", no_argument, nullptr, 'w' },
+  { "strict", no_argument, nullptr, STRICT_OPTION },
+  { "tag", no_argument, nullptr, TAG_OPTION },
+  { "zero", no_argument, nullptr, 'z' },
+
+  { "binary", no_argument, nullptr, 'b' }, /* Deprecated.  */
+  { "text", no_argument, nullptr, 't' }, /* Deprecated.  */
+
+  { GETOPT_HELP_OPTION_DECL },
+  { GETOPT_VERSION_OPTION_DECL },
+  { nullptr, 0, nullptr, 0 }
+};
+#endif
+
 static struct option const long_options[] =
 {
 #if HASH_ALGO_BLAKE2 || HASH_ALGO_CKSUM
@@ -480,6 +486,11 @@ usage (int status)
 Usage: %s [OPTION]... [FILE]...\n\
 "), program_name);
 #if HASH_ALGO_CKSUM
+    if (legacy_mode)
+      printf (_("\
+Print or check %s checksums.\n\
+"), DIGEST_TYPE_STRING);
+    else
       fputs (_("\
 Print or verify checksums.\n\
 By default use the 32 bit CRC algorithm.\n\
@@ -504,17 +515,22 @@ Print or check %s (%d-bit) checksums.\n\
         emit_mandatory_arg_note ();
 #endif
 #if HASH_ALGO_CKSUM
+     if (! legacy_mode)
         fputs (_("\
   -a, --algorithm=TYPE  select the digest type to use.  See DIGEST below\
 \n\
 "), stdout);
+     if (! legacy_mode)
         fputs (_("\
       --base64          emit base64-encoded digests, not hexadecimal\
 \n\
 "), stdout);
 #endif
 #if !HASH_ALGO_SUM
-# if !HASH_ALGO_CKSUM
+# if HASH_ALGO_CKSUM
+     if (legacy_mode)
+       {
+# endif
       if (O_BINARY)
         fputs (_("\
   -b, --binary          read in binary mode (default unless reading tty stdin)\
@@ -524,11 +540,16 @@ Print or check %s (%d-bit) checksums.\n\
         fputs (_("\
   -b, --binary          read in binary mode\n\
 "), stdout);
+# if HASH_ALGO_CKSUM
+       }
 # endif
         fputs (_("\
   -c, --check           read checksums from the FILEs and check them\n\
 "), stdout);
 # if HASH_ALGO_BLAKE2 || HASH_ALGO_CKSUM
+#  if HASH_ALGO_CKSUM
+     if (! legacy_mode)
+#  endif
         fputs (_("\
   -l, --length=BITS     digest length in bits; must not exceed the max size\n\
                           and must be a multiple of 8 for blake2b;\n\
@@ -536,13 +557,20 @@ Print or check %s (%d-bit) checksums.\n\
 "), stdout);
 # endif
 # if HASH_ALGO_CKSUM
+    if (! legacy_mode)
         fputs (_("\
       --raw             emit a raw binary digest, not hexadecimal\
 \n\
 "), stdout);
+    if (legacy_mode)
+      fputs (_("\
+      --tag             create a BSD-style checksum\n\
+"), stdout);
+    else
       fputs (_("\
       --tag             create a BSD-style checksum (the default)\n\
 "), stdout);
+    if (! legacy_mode)
       fputs (_("\
       --untagged        create a reversed style checksum, without digest type\n\
 "), stdout);
@@ -551,7 +579,10 @@ Print or check %s (%d-bit) checksums.\n\
       --tag             create a BSD-style checksum\n\
 "), stdout);
 # endif
-# if !HASH_ALGO_CKSUM
+# if HASH_ALGO_CKSUM
+    if (legacy_mode)
+      {
+# endif
       if (O_BINARY)
         fputs (_("\
   -t, --text            read in text mode (default if reading tty stdin)\n\
@@ -560,6 +591,8 @@ Print or check %s (%d-bit) checksums.\n\
         fputs (_("\
   -t, --text            read in text mode (default)\n\
 "), stdout);
+# if HASH_ALGO_CKSUM
+      }
 # endif
       fputs (_("\
   -z, --zero            end each output line with NUL, not newline,\n\
@@ -577,6 +610,7 @@ The following five options are useful only when verifying checksums:\n\
 "), stdout);
 #endif
 #if HASH_ALGO_CKSUM
+    if (! legacy_mode)
       fputs (_("\
       --debug           indicate which implementation used\n\
 "), stdout);
@@ -584,6 +618,7 @@ The following five options are useful only when verifying checksums:\n\
       fputs (HELP_OPTION_DESCRIPTION, stdout);
       fputs (VERSION_OPTION_DESCRIPTION, stdout);
 #if HASH_ALGO_CKSUM
+    if (! legacy_mode)
       fputs (_("\
 \n\
 DIGEST determines the digest algorithm and default output format:\n\
@@ -1491,6 +1526,17 @@ main (int argc, char **argv)
   bool ok = true;
   int binary = -1;
   int prefix_tag = -1;
+  struct option const *long_opts = long_options;
+
+#if HASH_ALGO_CKSUM
+  if (cksum_algorithm != crc)
+    {
+      legacy_mode = true;
+      prefix_tag = 0;
+      algorithm_specified = true;
+      long_opts = legacy_long_options;
+    }
+#endif
 
   /* Setting values of global variables.  */
   initialize_main (&argc, &argv);
@@ -1508,7 +1554,7 @@ main (int argc, char **argv)
 #if HASH_ALGO_SUM
   char const *short_opts = "rs";
 #elif HASH_ALGO_CKSUM
-  char const *short_opts = "a:l:bctwz";
+  char const *short_opts = legacy_mode ? "bctwz" : "a:l:bctwz";
   char const *digest_length_str = "";
 #elif HASH_ALGO_BLAKE2
   char const *short_opts = "l:bctwz";
@@ -1517,7 +1563,7 @@ main (int argc, char **argv)
   char const *short_opts = "bctwz";
 #endif
 
-  while ((opt = getopt_long (argc, argv, short_opts, long_options, nullptr))
+  while ((opt = getopt_long (argc, argv, short_opts, long_opts, nullptr))
          != -1)
     switch (opt)
       {
diff --git a/src/cksum.h b/src/cksum.h
new file mode 100644 (file)
index 0000000..588911e
--- /dev/null
@@ -0,0 +1,19 @@
+enum Algorithm
+{
+  bsd,
+  sysv,
+  crc,
+  crc32b,
+  md5,
+  sha1,
+  sha224,
+  sha256,
+  sha384,
+  sha512,
+  sha2,
+  sha3,
+  blake2b,
+  sm3,
+};
+
+extern enum Algorithm cksum_algorithm;
diff --git a/src/coreutils-md5sum.c b/src/coreutils-md5sum.c
new file mode 100644 (file)
index 0000000..20ac7ee
--- /dev/null
@@ -0,0 +1,31 @@
+/* md5sum -- wrapper to cksum with the right algorithm.
+   Copyright (C) 2025 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+#include "system.h"
+#include "cksum.h"
+
+/* Ensure that the main for cksum is declared even if the tool is not built
+   in this single-binary. */
+int single_binary_main_cksum (int argc, char **argv);
+int single_binary_main_md5sum (int argc, char **argv);
+
+int
+single_binary_main_md5sum (int argc, char **argv)
+{
+  cksum_algorithm = md5;
+  return single_binary_main_cksum (argc, argv);
+}
diff --git a/src/coreutils-sha1sum.c b/src/coreutils-sha1sum.c
new file mode 100644 (file)
index 0000000..f659665
--- /dev/null
@@ -0,0 +1,31 @@
+/* sha1sum -- wrapper to cksum with the right algorithm.
+   Copyright (C) 2025 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+#include "system.h"
+#include "cksum.h"
+
+/* Ensure that the main for cksum is declared even if the tool is not built
+   in this single-binary. */
+int single_binary_main_cksum (int argc, char **argv);
+int single_binary_main_sha1sum (int argc, char **argv);
+
+int
+single_binary_main_sha1sum (int argc, char **argv)
+{
+  cksum_algorithm = sha1;
+  return single_binary_main_cksum (argc, argv);
+}
diff --git a/src/coreutils-sha224sum.c b/src/coreutils-sha224sum.c
new file mode 100644 (file)
index 0000000..51c4c39
--- /dev/null
@@ -0,0 +1,31 @@
+/* sha224sum -- wrapper to cksum with the right algorithm.
+   Copyright (C) 2025 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+#include "system.h"
+#include "cksum.h"
+
+/* Ensure that the main for cksum is declared even if the tool is not built
+   in this single-binary. */
+int single_binary_main_cksum (int argc, char **argv);
+int single_binary_main_sha224sum (int argc, char **argv);
+
+int
+single_binary_main_sha224sum (int argc, char **argv)
+{
+  cksum_algorithm = sha224;
+  return single_binary_main_cksum (argc, argv);
+}
diff --git a/src/coreutils-sha256sum.c b/src/coreutils-sha256sum.c
new file mode 100644 (file)
index 0000000..bdd497f
--- /dev/null
@@ -0,0 +1,31 @@
+/* sha256sum -- wrapper to cksum with the right algorithm.
+   Copyright (C) 2025 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+#include "system.h"
+#include "cksum.h"
+
+/* Ensure that the main for cksum is declared even if the tool is not built
+   in this single-binary. */
+int single_binary_main_cksum (int argc, char **argv);
+int single_binary_main_sha256sum (int argc, char **argv);
+
+int
+single_binary_main_sha256sum (int argc, char **argv)
+{
+  cksum_algorithm = sha256;
+  return single_binary_main_cksum (argc, argv);
+}
diff --git a/src/coreutils-sha384sum.c b/src/coreutils-sha384sum.c
new file mode 100644 (file)
index 0000000..0037ba3
--- /dev/null
@@ -0,0 +1,31 @@
+/* sha384sum -- wrapper to cksum with the right algorithm.
+   Copyright (C) 2025 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+#include "system.h"
+#include "cksum.h"
+
+/* Ensure that the main for cksum is declared even if the tool is not built
+   in this single-binary. */
+int single_binary_main_cksum (int argc, char **argv);
+int single_binary_main_sha384sum (int argc, char **argv);
+
+int
+single_binary_main_sha384sum (int argc, char **argv)
+{
+  cksum_algorithm = sha384;
+  return single_binary_main_cksum (argc, argv);
+}
diff --git a/src/coreutils-sha512sum.c b/src/coreutils-sha512sum.c
new file mode 100644 (file)
index 0000000..e7be0f3
--- /dev/null
@@ -0,0 +1,31 @@
+/* sha512sum -- wrapper to cksum with the right algorithm.
+   Copyright (C) 2025 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+#include "system.h"
+#include "cksum.h"
+
+/* Ensure that the main for cksum is declared even if the tool is not built
+   in this single-binary. */
+int single_binary_main_cksum (int argc, char **argv);
+int single_binary_main_sha512sum (int argc, char **argv);
+
+int
+single_binary_main_sha512sum (int argc, char **argv)
+{
+  cksum_algorithm = sha512;
+  return single_binary_main_cksum (argc, argv);
+}
index 88b9f0e6c24cec818a756940946ee318be5f0c79..cba0216ee51c3c13ad98bf614a1c765684d16a5a 100644 (file)
@@ -39,6 +39,7 @@ noinst_PROGRAMS =             \
   src/getlimits
 
 noinst_HEADERS =               \
+  src/cksum.h                  \
   src/chown.h                  \
   src/chown-core.h             \
   src/copy.h                   \