]> git.eshelyaron.com Git - emacs.git/commitdiff
Port new fingerprinting scheme to clang + LTO
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 4 May 2019 20:15:29 +0000 (13:15 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 4 May 2019 20:16:15 +0000 (13:16 -0700)
* lib-src/make-fingerprint.c (main): Don't consider multiple
instances of the fingerprint to be an error, as this can
happen with clang and -flto.  Instead, replace all instances
of the fingerprint.  There is a tiny chance that this will
silently corrupt the Emacs executable.

This patch suggests that we should go back to fingerprinting
the inputs to the linker instead of its output, as the new
fingerprinting scheme is unnecessarily complicated and this
complexity reduces reliability. The old scheme (i.e., before
commit 2019-05-14T23:31:24Z!eggert@cs.ucla.edu) was simpler
and more portable and good enough, and it's looking like it
would be less trouble in practice than the new scheme.

lib-src/make-fingerprint.c

index 79bd007a5f9682487afb82876a36b88365656148..5779e0d2746ee830c1e1c5b626461b51c3a13970 100644 (file)
@@ -140,29 +140,25 @@ main (int argc, char **argv)
     }
   else
     {
-      char *finger = memmem (buf, chunksz, fingerprint, sizeof fingerprint);
-      if (!finger)
-       {
-         fprintf (stderr, "%s: %s: missing fingerprint\n", prog, file);
-         return EXIT_FAILURE;
-       }
-      else if (memmem (finger + 1, buf + chunksz - (finger + 1),
-                      fingerprint, sizeof fingerprint))
-       {
-         fprintf (stderr, "%s: %s: two occurrences of fingerprint\n",
-                  prog, file);
-         return EXIT_FAILURE;
-       }
+      bool fingered = false;
 
-      if (fseeko (f, finger - buf, SEEK_SET) != 0)
+      for (char *finger = buf;
+          (finger = memmem (finger, buf + chunksz - finger,
+                            fingerprint, sizeof fingerprint));
+          finger++)
        {
-         perror (file);
-         return EXIT_FAILURE;
+         if (! (fseeko (f, finger - buf, SEEK_SET) == 0
+                && fwrite (digest, 1, sizeof digest, f) == sizeof digest))
+           {
+             perror (file);
+             return EXIT_FAILURE;
+           }
+         fingered = true;
        }
 
-      if (fwrite (digest, 1, sizeof digest, f) != sizeof digest)
+      if (!fingered)
        {
-         perror (file);
+         fprintf (stderr, "%s: %s: missing fingerprint\n", prog, file);
          return EXIT_FAILURE;
        }
     }