defolos / rpms / emacs

Forked from rpms/emacs 4 years ago
Clone
01fa43f
From 31607778ef262e5c25a65eb479f9531c5803f4a6 Mon Sep 17 00:00:00 2001
e79d2e5
From: Glenn Morris <rgm@gnu.org>
e79d2e5
Date: Mon, 11 Oct 2021 14:03:26 +0200
01fa43f
Subject: [PATCH] Make the installed pmdp file use a fingerprint
e79d2e5
e79d2e5
* Makefile.in (EMACS_PDMP): Use --fingerprint.
e79d2e5
e79d2e5
* doc/emacs/cmdargs.texi (Action Arguments): Document --fingerprint.
e79d2e5
e79d2e5
* src/emacs.c (load_pdump): Load the fingerprinted version of the
e79d2e5
pdmp file (bug#42790).
e79d2e5
(main): Support --fingerprint.
e79d2e5
e79d2e5
* src/pdumper.c (dump_fingerprint): Make non-static.
e79d2e5
e79d2e5
* src/pdumper.h: Declare dump_fingerprint.
e79d2e5
---
e79d2e5
 Makefile.in            |  3 ++-
e79d2e5
 doc/emacs/cmdargs.texi |  5 +++++
e79d2e5
 src/emacs.c            | 31 +++++++++++++++++++++++++++++--
e79d2e5
 src/pdumper.c          |  2 +-
e79d2e5
 src/pdumper.h          |  3 +++
e79d2e5
 5 files changed, 40 insertions(+), 4 deletions(-)
e79d2e5
e79d2e5
diff --git a/Makefile.in b/Makefile.in
01fa43f
index c902b46ced..f8b8058d96 100644
e79d2e5
--- a/Makefile.in
e79d2e5
+++ b/Makefile.in
01fa43f
@@ -313,6 +313,7 @@ TRANSFORM =
e79d2e5
 EMACS_NAME = `echo emacs | sed '$(TRANSFORM)'`
e79d2e5
 EMACS = ${EMACS_NAME}${EXEEXT}
e79d2e5
 EMACSFULL = `echo emacs-${version} | sed '$(TRANSFORM)'`${EXEEXT}
e79d2e5
+EMACS_PDMP = `./src/emacs${EXEEXT} --fingerprint 2>&1 | sed 's/.* //'`.pdmp
e79d2e5
 
e79d2e5
 # Subdirectories to make recursively.
e79d2e5
 SUBDIR = $(NTDIR) lib lib-src src lisp
01fa43f
@@ -521,7 +522,7 @@ install-arch-dep:
e79d2e5
 ifeq (${ns_self_contained},no)
e79d2e5
 	${INSTALL_PROGRAM} $(INSTALL_STRIP) src/emacs${EXEEXT} "$(DESTDIR)${bindir}/$(EMACSFULL)"
e79d2e5
 ifeq (${DUMPING},pdumper)
e79d2e5
-	${INSTALL_DATA} src/emacs.pdmp "$(DESTDIR)${libexecdir}/emacs/${version}/${configuration}"/emacs.pdmp
e79d2e5
+	${INSTALL_DATA} src/emacs.pdmp "$(DESTDIR)${libexecdir}/emacs/${version}/${configuration}"/emacs-${EMACS_PDMP}
e79d2e5
 endif
e79d2e5
 	-chmod 755 "$(DESTDIR)${bindir}/$(EMACSFULL)"
e79d2e5
 ifndef NO_BIN_LINK
e79d2e5
diff --git a/doc/emacs/cmdargs.texi b/doc/emacs/cmdargs.texi
01fa43f
index ffab2b2213..b3f84098e7 100644
e79d2e5
--- a/doc/emacs/cmdargs.texi
e79d2e5
+++ b/doc/emacs/cmdargs.texi
01fa43f
@@ -185,6 +185,11 @@ Action Arguments
e79d2e5
 @item --version
e79d2e5
 @opindex --version
e79d2e5
 Print Emacs version, then exit successfully.
e79d2e5
+
e79d2e5
+@item --fingerprint
e79d2e5
+@opindex --fingerprint
e79d2e5
+Print the Emacs ``fingerprint'', which is used to uniquely identify
e79d2e5
+the compiled version of Emacs.
e79d2e5
 @end table
e79d2e5
 
e79d2e5
 @node Initial Options
e79d2e5
diff --git a/src/emacs.c b/src/emacs.c
01fa43f
index 0a90b0913b..1907065a95 100644
e79d2e5
--- a/src/emacs.c
e79d2e5
+++ b/src/emacs.c
01fa43f
@@ -133,6 +133,7 @@ #define MAIN_PROGRAM
e79d2e5
 #endif
e79d2e5
 
e79d2e5
 #include "pdumper.h"
e79d2e5
+#include "fingerprint.h"
e79d2e5
 #include "epaths.h"
e79d2e5
 
e79d2e5
 static const char emacs_version[] = PACKAGE_VERSION;
01fa43f
@@ -255,6 +256,7 @@ #define MAIN_PROGRAM
e79d2e5
 #ifdef HAVE_PDUMPER
e79d2e5
     "\
e79d2e5
 --dump-file FILE            read dumped state from FILE\n\
e79d2e5
+--fingerprint               output fingerprint and exit\n\
e79d2e5
 ",
e79d2e5
 #endif
e79d2e5
 #if SECCOMP_USABLE
e79d2e5
@@ -830,6 +832,8 @@ load_pdump (int argc, char **argv)
e79d2e5
   const char *const suffix = ".pdmp";
e79d2e5
   int result;
e79d2e5
   char *emacs_executable = argv[0];
e79d2e5
+  ptrdiff_t hexbuf_size;
e79d2e5
+  char *hexbuf;
e79d2e5
   const char *strip_suffix =
e79d2e5
 #if defined DOS_NT || defined CYGWIN
e79d2e5
     ".exe"
e79d2e5
@@ -927,9 +931,15 @@ load_pdump (int argc, char **argv)
e79d2e5
   /* Look for "emacs.pdmp" in PATH_EXEC.  We hardcode "emacs" in
e79d2e5
      "emacs.pdmp" so that the Emacs binary still works if the user
e79d2e5
      copies and renames it.  */
e79d2e5
+  hexbuf_size = 2 * sizeof fingerprint;
e79d2e5
+  hexbuf = xmalloc (hexbuf_size + 1);
e79d2e5
+  hexbuf_digest (hexbuf, (char *)fingerprint, sizeof fingerprint);
e79d2e5
+  hexbuf[hexbuf_size] = '\0';
e79d2e5
   needed = (strlen (path_exec)
e79d2e5
 	    + 1
e79d2e5
 	    + strlen (argv0_base)
e79d2e5
+	    + 1
e79d2e5
+	    + strlen (hexbuf)
e79d2e5
 	    + strlen (suffix)
e79d2e5
 	    + 1);
e79d2e5
   if (bufsize < needed)
e79d2e5
@@ -937,8 +947,8 @@ load_pdump (int argc, char **argv)
e79d2e5
       xfree (dump_file);
e79d2e5
       dump_file = xpalloc (NULL, &bufsize, needed - bufsize, -1, 1);
e79d2e5
     }
e79d2e5
-  sprintf (dump_file, "%s%c%s%s",
e79d2e5
-           path_exec, DIRECTORY_SEP, argv0_base, suffix);
e79d2e5
+  sprintf (dump_file, "%s%c%s-%s%s",
e79d2e5
+           path_exec, DIRECTORY_SEP, argv0_base, hexbuf, suffix);
e79d2e5
 #if !defined (NS_SELF_CONTAINED)
01fa43f
   if (!(emacs_executable && *emacs_executable))
01fa43f
     {
01fa43f
@@ -1424,6 +1434,23 @@ main (int argc, char **argv)
e79d2e5
       exit (0);
e79d2e5
     }
e79d2e5
 
e79d2e5
+#ifdef HAVE_PDUMPER
e79d2e5
+  if (argmatch (argv, argc, "-fingerprint", "--fingerprint", 4,
e79d2e5
+		NULL, &skip_args))
e79d2e5
+    {
e79d2e5
+      if (initialized)
e79d2e5
+        {
e79d2e5
+          dump_fingerprint ("fingerprint", (unsigned char *)fingerprint);
e79d2e5
+          exit (0);
e79d2e5
+        }
e79d2e5
+      else
e79d2e5
+        {
e79d2e5
+          fputs ("Not initialized\n", stderr);
e79d2e5
+          exit (1);
e79d2e5
+        }
e79d2e5
+    }
e79d2e5
+#endif
e79d2e5
+
e79d2e5
   emacs_wd = emacs_get_current_dir_name ();
e79d2e5
 #ifdef HAVE_PDUMPER
e79d2e5
   if (dumped_with_pdumper_p ())
e79d2e5
diff --git a/src/pdumper.c b/src/pdumper.c
01fa43f
index b0167299d7..56a5e2ec6d 100644
e79d2e5
--- a/src/pdumper.c
e79d2e5
+++ b/src/pdumper.c
e79d2e5
@@ -312,7 +312,7 @@ dump_reloc_set_offset (struct dump_reloc *reloc, dump_off offset)
e79d2e5
     error ("dump relocation out of range");
e79d2e5
 }
e79d2e5
 
e79d2e5
-static void
e79d2e5
+void
e79d2e5
 dump_fingerprint (char const *label,
e79d2e5
 		  unsigned char const xfingerprint[sizeof fingerprint])
e79d2e5
 {
e79d2e5
diff --git a/src/pdumper.h b/src/pdumper.h
01fa43f
index 8383283894..002e1d88ce 100644
e79d2e5
--- a/src/pdumper.h
e79d2e5
+++ b/src/pdumper.h
01fa43f
@@ -50,6 +50,9 @@ #define PDUMPER_IGNORE(thing) ((void) &(thing))
e79d2e5
 #define PDUMPER_REMEMBER_SCALAR(thing)                  \
e79d2e5
   pdumper_remember_scalar (&(thing), sizeof (thing))
e79d2e5
 
e79d2e5
+extern void dump_fingerprint (const char *label,
e79d2e5
+                              const unsigned char *xfingerprint);
e79d2e5
+
e79d2e5
 extern void pdumper_remember_scalar_impl (void *data, ptrdiff_t nbytes);
e79d2e5
 
e79d2e5
 INLINE void
e79d2e5
-- 
01fa43f
2.37.3
e79d2e5