diff options
-rw-r--r-- | lld/ELF/Config.h | 2 | ||||
-rw-r--r-- | lld/ELF/Driver.cpp | 2 | ||||
-rw-r--r-- | lld/ELF/OutputSections.cpp | 13 | ||||
-rw-r--r-- | lld/ELF/OutputSections.h | 6 | ||||
-rw-r--r-- | lld/ELF/Writer.cpp | 2 | ||||
-rw-r--r-- | lld/test/ELF/build-id.s | 5 |
6 files changed, 28 insertions, 2 deletions
diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index b2c107ce485..1144b2fa159 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -30,7 +30,7 @@ enum ELFKind { 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 }; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 451b2e49eab..89d5bb51163 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -450,6 +450,8 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { 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")) { diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index 2631ccc5760..6fdaf2d24ce 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -19,7 +19,7 @@ #include "llvm/Support/MD5.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/SHA1.h" -#include <map> +#include "llvm/Support/RandomNumberGenerator.h" using namespace llvm; using namespace llvm::dwarf; @@ -1681,6 +1681,12 @@ void BuildIdSha1<ELFT>::writeBuildId(ArrayRef<ArrayRef<uint8_t>> Bufs) { } template <class ELFT> +void BuildIdUuid<ELFT>::writeBuildId(ArrayRef<ArrayRef<uint8_t>> Bufs) { + if (getRandomBytes(this->HashBuf, 16)) + error("entropy source failure"); +} + +template <class ELFT> BuildIdHexstring<ELFT>::BuildIdHexstring() : BuildIdSection<ELFT>(Config->BuildIdVector.size()) {} @@ -1994,6 +2000,11 @@ template class BuildIdSha1<ELF32BE>; template class BuildIdSha1<ELF64LE>; template class BuildIdSha1<ELF64BE>; +template class BuildIdUuid<ELF32LE>; +template class BuildIdUuid<ELF32BE>; +template class BuildIdUuid<ELF64LE>; +template class BuildIdUuid<ELF64BE>; + template class BuildIdHexstring<ELF32LE>; template class BuildIdHexstring<ELF32BE>; template class BuildIdHexstring<ELF64LE>; diff --git a/lld/ELF/OutputSections.h b/lld/ELF/OutputSections.h index 9af207b9182..213a5211717 100644 --- a/lld/ELF/OutputSections.h +++ b/lld/ELF/OutputSections.h @@ -727,6 +727,12 @@ public: void writeBuildId(ArrayRef<ArrayRef<uint8_t>> Bufs) override; }; +template <class ELFT> class BuildIdUuid final : public BuildIdSection<ELFT> { +public: + BuildIdUuid() : BuildIdSection<ELFT>(16) {} + void writeBuildId(ArrayRef<ArrayRef<uint8_t>> Bufs) override; +}; + template <class ELFT> class BuildIdHexstring final : public BuildIdSection<ELFT> { public: diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 4469944792b..ba0e6dd6423 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -156,6 +156,8 @@ template <class ELFT> void elf::writeResult() { BuildId.reset(new BuildIdMd5<ELFT>); else if (Config->BuildId == BuildIdKind::Sha1) BuildId.reset(new BuildIdSha1<ELFT>); + else if (Config->BuildId == BuildIdKind::Uuid) + BuildId.reset(new BuildIdUuid<ELFT>); else if (Config->BuildId == BuildIdKind::Hexstring) BuildId.reset(new BuildIdHexstring<ELFT>); diff --git a/lld/test/ELF/build-id.s b/lld/test/ELF/build-id.s index f1eac42812b..6f832d53667 100644 --- a/lld/test/ELF/build-id.s +++ b/lld/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 @@ _start: # 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 |