Index: lld/trunk/ELF/Config.h =================================================================== --- lld/trunk/ELF/Config.h +++ lld/trunk/ELF/Config.h @@ -30,7 +30,7 @@ ELF64BEKind }; -enum class BuildIdKind { None, Fnv1, Md5, Sha1, Hexstring }; +enum class BuildIdKind { None, Fnv1, Md5, Sha1, Hexstring, Uuid }; enum class UnresolvedPolicy { NoUndef, Error, Warn, Ignore }; Index: lld/trunk/ELF/Driver.cpp =================================================================== --- lld/trunk/ELF/Driver.cpp +++ lld/trunk/ELF/Driver.cpp @@ -450,6 +450,8 @@ Config->BuildId = BuildIdKind::Md5; } else if (S == "sha1") { Config->BuildId = BuildIdKind::Sha1; + } else if (S == "uuid") { + Config->BuildId = BuildIdKind::Uuid; } else if (S == "none") { Config->BuildId = BuildIdKind::None; } else if (S.startswith("0x")) { Index: lld/trunk/ELF/OutputSections.h =================================================================== --- lld/trunk/ELF/OutputSections.h +++ lld/trunk/ELF/OutputSections.h @@ -727,6 +727,12 @@ void writeBuildId(ArrayRef> Bufs) override; }; +template class BuildIdUuid final : public BuildIdSection { +public: + BuildIdUuid() : BuildIdSection(16) {} + void writeBuildId(ArrayRef> Bufs) override; +}; + template class BuildIdHexstring final : public BuildIdSection { public: Index: lld/trunk/ELF/OutputSections.cpp =================================================================== --- lld/trunk/ELF/OutputSections.cpp +++ lld/trunk/ELF/OutputSections.cpp @@ -19,7 +19,7 @@ #include "llvm/Support/MD5.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/SHA1.h" -#include +#include "llvm/Support/RandomNumberGenerator.h" using namespace llvm; using namespace llvm::dwarf; @@ -1681,6 +1681,12 @@ } template +void BuildIdUuid::writeBuildId(ArrayRef> Bufs) { + if (getRandomBytes(this->HashBuf, 16)) + error("entropy source failure"); +} + +template BuildIdHexstring::BuildIdHexstring() : BuildIdSection(Config->BuildIdVector.size()) {} @@ -1994,6 +2000,11 @@ template class BuildIdSha1; template class BuildIdSha1; +template class BuildIdUuid; +template class BuildIdUuid; +template class BuildIdUuid; +template class BuildIdUuid; + template class BuildIdHexstring; template class BuildIdHexstring; template class BuildIdHexstring; Index: lld/trunk/ELF/Writer.cpp =================================================================== --- lld/trunk/ELF/Writer.cpp +++ lld/trunk/ELF/Writer.cpp @@ -156,6 +156,8 @@ BuildId.reset(new BuildIdMd5); else if (Config->BuildId == BuildIdKind::Sha1) BuildId.reset(new BuildIdSha1); + else if (Config->BuildId == BuildIdKind::Uuid) + BuildId.reset(new BuildIdUuid); else if (Config->BuildId == BuildIdKind::Hexstring) BuildId.reset(new BuildIdHexstring); Index: lld/trunk/test/ELF/build-id.s =================================================================== --- lld/trunk/test/ELF/build-id.s +++ lld/trunk/test/ELF/build-id.s @@ -7,6 +7,8 @@ # RUN: llvm-objdump -s %t2 | FileCheck -check-prefix=MD5 %s # RUN: ld.lld --build-id=sha1 %t -o %t2 # RUN: llvm-objdump -s %t2 | FileCheck -check-prefix=SHA1 %s +# RUN: ld.lld --build-id=uuid %t -o %t2 +# RUN: llvm-objdump -s %t2 | FileCheck -check-prefix=UUID %s # RUN: ld.lld --build-id=0x12345678 %t -o %t2 # RUN: llvm-objdump -s %t2 | FileCheck -check-prefix=HEX %s # RUN: ld.lld %t -o %t2 @@ -31,6 +33,9 @@ # SHA1: Contents of section .note.gnu.build-id: # SHA1-NEXT: 04000000 14000000 03000000 474e5500 ............GNU. +# UUID: Contents of section .note.gnu.build-id: +# UUID-NEXT: 04000000 10000000 03000000 474e5500 ............GNU. + # HEX: Contents of section .note.gnu.build-id: # HEX-NEXT: 04000000 04000000 03000000 474e5500 ............GNU. # HEX-NEXT: 12345678