This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Add support for creating uuid based build-id's in a MinGW32 environment.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=d0d4152fa5c87532bf05007def680b5a536e1827

commit d0d4152fa5c87532bf05007def680b5a536e1827
Author: Igor Kudrin <ikudrin@accesssoftek.com>
Date:   Tue Jul 26 17:01:06 2016 +0100

    Add support for creating uuid based build-id's in a MinGW32 environment.
    
    ld	* ldbuildid.c: Changes for MinGW32:
    	Include windows.h and rpcdce.h.
    	(validate_build_id_style): Allow "uuid" style.
    	(generate_build_id): Fill in id_bits using UuidCreate().

Diff:
---
 ld/ChangeLog   |  7 +++++++
 ld/ldbuildid.c | 44 ++++++++++++++++++++++++++++++++++----------
 2 files changed, 41 insertions(+), 10 deletions(-)

diff --git a/ld/ChangeLog b/ld/ChangeLog
index 13c037f..e0e9d32 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,10 @@
+2016-07-26  Igor Kudrin  <ikudrin@accesssoftek.com>
+
+	* ldbuildid.c: Changes for MinGW32:
+	Include windows.h and rpcdce.h.
+	(validate_build_id_style): Allow "uuid" style.
+	(generate_build_id): Fill in id_bits using UuidCreate().
+
 2016-07-25  Alan Modra  <amodra@gmail.com>
 
 	* testsuite/ld-elf/sec64k.exp: Run test for arc, msp430, or1k
diff --git a/ld/ldbuildid.c b/ld/ldbuildid.c
index 7d4b9c3..d2dccc5 100644
--- a/ld/ldbuildid.c
+++ b/ld/ldbuildid.c
@@ -24,6 +24,10 @@
 #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
@@ -31,14 +35,11 @@
 bfd_boolean
 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")) || (strneq (style, "0x", 2)))
+    return TRUE;
 
- return FALSE;
+  return FALSE;
 }
 
 bfd_size_type
@@ -118,9 +119,9 @@ generate_build_id (bfd *abfd,
 	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);
 
@@ -130,8 +131,30 @@ generate_build_id (bfd *abfd,
       close (fd);
       if (n < size)
 	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) 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 < sizeof (UUID) ? size : sizeof (UUID));
+#endif /* __MINGW32__ */
     }
-#endif
   else if (strneq (style, "0x", 2))
     {
       /* ID is in string form (hex).  Convert to bits.  */
@@ -149,7 +172,8 @@ 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.  */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]