diff options
author | Igor Kudrin <ikudrin@accesssoftek.com> | 2016-07-26 17:01:06 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2016-07-26 17:01:06 +0100 |
commit | d0d4152fa5c87532bf05007def680b5a536e1827 (patch) | |
tree | 2b19a476abead245d38fed036b6c40e95ebd6af7 /ld/ldbuildid.c | |
parent | 8769bc4bab847cefc2bb5682a0a0dad579528ac8 (diff) | |
download | binutils-d0d4152fa5c87532bf05007def680b5a536e1827.zip binutils-d0d4152fa5c87532bf05007def680b5a536e1827.tar.gz binutils-d0d4152fa5c87532bf05007def680b5a536e1827.tar.bz2 |
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().
Diffstat (limited to 'ld/ldbuildid.c')
-rw-r--r-- | ld/ldbuildid.c | 44 |
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. */ |