diff --git a/ld/ldbuildid.c b/ld/ldbuildid.c index 7d4b9c3..32b7179 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 +#include +#endif #define streq(a,b) strcmp ((a), (b)) == 0 #define strneq(a,b,n) strncmp ((a), (b), (n)) == 0 @@ -32,10 +36,7 @@ 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))) + || (streq (style, "uuid")) || (strneq (style, "0x", 2))) return TRUE; return FALSE; @@ -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__ */ + UUID uuid; + typedef RPC_STATUS (RPC_ENTRY *UuidCreateFn)(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. */