]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - ld/ldbuildid.c
x86: Remove the secondary encoding for ctest.
[thirdparty/binutils-gdb.git] / ld / ldbuildid.c
index 1214789671a238180ecbaeaa1e9f61d0b526026c..5ba9e503c7c3af4a06f04f8e50affd0a5ba4a473 100644 (file)
@@ -1,5 +1,5 @@
 /* ldbuildid.c - Build Id support routines
-   Copyright 2013, 2014 Free Software Foundation, Inc.
+   Copyright (C) 2013-2024 Free Software Foundation, Inc.
 
    This file is part of the GNU Binutils.
 
 #include "md5.h"
 #include "sha1.h"
 #include "ldbuildid.h"
+#ifdef __MINGW32__
+#include <windows.h>
+#include <rpcdce.h>
+#endif
 
 #define streq(a,b)     strcmp ((a), (b)) == 0
-#define strneq(a,b,n)  strncmp ((a), (b), (n)) == 0
 
-bfd_boolean
+bool
 validate_build_id_style (const char *style)
 {
- if ((streq (style, "md5")) || (streq (style, "sha1"))
-#ifndef __MINGW32__
-     || (streq (style, "uuid"))
-#endif
-     || (strneq (style, "0x", 2)))
-   return TRUE;
+  if ((streq (style, "md5")) || (streq (style, "sha1"))
+      || (streq (style, "uuid")) || (startswith (style, "0x")))
+    return true;
 
return FALSE;
 return false;
 }
 
 bfd_size_type
 compute_build_id_size (const char *style)
 {
   if (streq (style, "md5") || streq (style, "uuid"))
-    return  128 / 8;
+    return 128 / 8;
 
   if (streq (style, "sha1"))
-    return  160 / 8;
+    return 160 / 8;
 
-  if (strneq (style, "0x", 2))
+  if (startswith (style, "0x"))
     {
       bfd_size_type size = 0;
       /* ID is in string form (hex).  Count the bytes.  */
@@ -93,12 +93,12 @@ read_hex (const char xdigit)
   return 0;
 }
 
-bfd_boolean
+bool
 generate_build_id (bfd *abfd,
                   const char *style,
                   checksum_fn checksum_contents,
                   unsigned char *id_bits,
-                  int size)
+                  int size ATTRIBUTE_UNUSED)
 {
   if (streq (style, "md5"))
     {
@@ -106,7 +106,7 @@ generate_build_id (bfd *abfd,
 
       md5_init_ctx (&ctx);
       if (!(*checksum_contents) (abfd, (sum_fn) &md5_process_bytes, &ctx))
-       return FALSE;
+       return false;
       md5_finish_ctx (&ctx, id_bits);
     }
   else if (streq (style, "sha1"))
@@ -114,25 +114,49 @@ generate_build_id (bfd *abfd,
       struct sha1_ctx ctx;
 
       sha1_init_ctx (&ctx);
-      if (!(*checksum_contents) (abfd, (sum_fn) &sha1_process_bytes, &ctx))
-       return FALSE;
+      if (!(*checksum_contents) (abfd, (sum_fn) sha1_choose_process_bytes (),
+                                &ctx))
+       return false;
       sha1_finish_ctx (&ctx, id_bits);
     }
-#ifndef __MINGW32__
   else if (streq (style, "uuid"))
     {
+#ifndef __MINGW32__
       int n;
       int fd = open ("/dev/urandom", O_RDONLY);
 
       if (fd < 0)
-       return FALSE;
+       return false;
       n = read (fd, id_bits, size);
       close (fd);
       if (n < size)
-       return FALSE;
+       return false;
+#else /* __MINGW32__ */
+      typedef RPC_STATUS (RPC_ENTRY * UuidCreateFn) (UUID *);
+      UUID          uuid;
+      UuidCreateFn  uuid_create = 0;
+      HMODULE       rpc_library = LoadLibrary ("rpcrt4.dll");
+
+      if (!rpc_library)
+       return false;
+      uuid_create = (UuidCreateFn) (void (WINAPI *)(void)) GetProcAddress (rpc_library, "UuidCreate");
+      if (!uuid_create)
+       {
+         FreeLibrary (rpc_library);
+         return false;
+       }
+
+      if (uuid_create (&uuid) != RPC_S_OK)
+       {
+         FreeLibrary (rpc_library);
+         return false;
+       }
+      FreeLibrary (rpc_library);
+      memcpy (id_bits, &uuid,
+             (size_t) size < sizeof (UUID) ? (size_t) size : sizeof (UUID));
+#endif /* __MINGW32__ */
     }
-#endif
-  else if (strneq (style, "0x", 2))
+  else if (startswith (style, "0x"))
     {
       /* ID is in string form (hex).  Convert to bits.  */
       const char *id = style + 2;
@@ -149,10 +173,11 @@ generate_build_id (bfd *abfd,
            ++id;
          else
            abort ();           /* Should have been validated earlier.  */
-       } while (*id != '\0');
+       }
+      while (*id != '\0');
     }
   else
     abort ();                  /* Should have been validated earlier.  */
 
-  return TRUE;
+  return true;
 }