diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -43,7 +43,7 @@ enum class BsymbolicKind { None, NonWeakFunctions, Functions, All }; // For --build-id. -enum class BuildIdKind { None, Fast, Md5, Sha1, Hexstring, Uuid }; +enum class BuildIdKind { None, Fast, Md5, Sha1, Sha256, Hexstring, Uuid }; // For --discard-{all,locals,none}. enum class DiscardPolicy { Default, All, Locals, None }; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -783,6 +783,8 @@ return {BuildIdKind::Md5, {}}; if (s == "sha1" || s == "tree") return {BuildIdKind::Sha1, {}}; + if (s == "sha256") + return {BuildIdKind::Sha256, {}}; if (s == "uuid") return {BuildIdKind::Uuid, {}}; if (s.startswith("0x")) diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -280,6 +280,8 @@ return 16; case BuildIdKind::Sha1: return 20; + case BuildIdKind::Sha256: + return 32; case BuildIdKind::Hexstring: return config->buildIdVector.size(); default: diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -28,6 +28,7 @@ #include "llvm/Support/Parallel.h" #include "llvm/Support/RandomNumberGenerator.h" #include "llvm/Support/SHA1.h" +#include "llvm/Support/SHA256.h" #include "llvm/Support/TimeProfiler.h" #include "llvm/Support/xxhash.h" #include @@ -3036,6 +3037,11 @@ memcpy(dest, SHA1::hash(arr).data(), hashSize); }); break; + case BuildIdKind::Sha256: + computeHash(buildId, buf, [&](uint8_t *dest, ArrayRef arr) { + memcpy(dest, SHA256::hash(arr).data(), hashSize); + }); + break; case BuildIdKind::Uuid: if (auto ec = llvm::getRandomBytes(buildId.data(), hashSize)) error("entropy source failure: " + ec.message());