X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=ld%2Fldbuildid.c;h=7448dcb7d0818172c068832bfe99da71b52f55d3;hb=7e19db932c4e7b2a3878b7d24610eeb1b39b34e5;hp=7d4b9c327acd5f5a1d60b90058f0c500d7d47ee0;hpb=0aa7f5862e5619194b3956d5bd45b93970635bde;p=binutils-gdb.git diff --git a/ld/ldbuildid.c b/ld/ldbuildid.c index 7d4b9c327ac..7448dcb7d08 100644 --- a/ld/ldbuildid.c +++ b/ld/ldbuildid.c @@ -1,5 +1,5 @@ /* ldbuildid.c - Build Id support routines - Copyright (C) 2013-2016 Free Software Foundation, Inc. + Copyright (C) 2013-2022 Free Software Foundation, Inc. This file is part of the GNU Binutils. @@ -24,21 +24,21 @@ #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 -bfd_boolean +bool 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")) || (startswith (style, "0x"))) + return true; - return FALSE; + return false; } bfd_size_type @@ -50,7 +50,7 @@ compute_build_id_size (const char *style) if (streq (style, "sha1")) return 160 / 8; - if (strneq (style, "0x", 2)) + if (startswith (style, "0x")) { bfd_size_type size = 0; /* ID is in string form (hex). Count the bytes. */ @@ -93,7 +93,7 @@ read_hex (const char xdigit) return 0; } -bfd_boolean +bool generate_build_id (bfd *abfd, const char *style, checksum_fn checksum_contents, @@ -106,7 +106,7 @@ generate_build_id (bfd *abfd, md5_init_ctx (&ctx); if (!(*checksum_contents) (abfd, (sum_fn) &md5_process_bytes, &ctx)) - return FALSE; + return false; md5_finish_ctx (&ctx, id_bits); } else if (streq (style, "sha1")) @@ -115,24 +115,47 @@ generate_build_id (bfd *abfd, sha1_init_ctx (&ctx); if (!(*checksum_contents) (abfd, (sum_fn) &sha1_process_bytes, &ctx)) - return FALSE; + 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); if (fd < 0) - return FALSE; + return false; n = read (fd, id_bits, size); close (fd); if (n < size) - return FALSE; + 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) (void (WINAPI *)(void)) 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_t) size < sizeof (UUID) ? (size_t) size : sizeof (UUID)); +#endif /* __MINGW32__ */ } -#endif - else if (strneq (style, "0x", 2)) + else if (startswith (style, "0x")) { /* ID is in string form (hex). Convert to bits. */ const char *id = style + 2; @@ -149,10 +172,11 @@ 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. */ - return TRUE; + return true; }