aboutsummaryrefslogtreecommitdiff
path: root/ld/ldbuildid.c
diff options
context:
space:
mode:
Diffstat (limited to 'ld/ldbuildid.c')
-rw-r--r--ld/ldbuildid.c44
1 files changed, 34 insertions, 10 deletions
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. */