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().
This commit is contained in:
Igor Kudrin 2016-07-26 17:01:06 +01:00 committed by Nick Clifton
parent 8769bc4bab
commit d0d4152fa5
2 changed files with 41 additions and 10 deletions

View File

@ -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

View File

@ -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. */