From d0d4152fa5c87532bf05007def680b5a536e1827 Mon Sep 17 00:00:00 2001 From: Igor Kudrin Date: Tue, 26 Jul 2016 17:01:06 +0100 Subject: [PATCH] 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(). --- ld/ChangeLog | 7 +++++++ ld/ldbuildid.c | 44 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 13c037f8e7f..e0e9d32cb51 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2016-07-26 Igor Kudrin + + * 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 * testsuite/ld-elf/sec64k.exp: Run test for arc, msp430, or1k diff --git a/ld/ldbuildid.c b/ld/ldbuildid.c index 7d4b9c327ac..d2dccc5c30b 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 @@ -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. */ -- 2.30.2