[llvm] [llvm-objcopy] Add possibility to verify .note section format (PR #90458)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 18 13:34:22 PDT 2024
================
@@ -623,6 +623,58 @@ handleUserSection(const NewSectionInfo &NewSection,
return F(NewSection.SectionName, Data);
}
+static Error verifyNoteSection(StringRef Name, endianness Endianness,
+ ArrayRef<uint8_t> Data) {
+ // An ELF note has the following structure:
+ // Name Size: 4 bytes (integer)
+ // Desc Size: 4 bytes (integer)
+ // Type : 4 bytes
+ // Name : variable size, padded to a 4 byte boundary
+ // Desc : variable size, padded to a 4 byte boundary
+
+ if (Data.empty())
+ return Error::success();
+
+ if (Data.size() < 12) {
+ std::string msg;
+ raw_string_ostream(msg)
+ << Name << " data must be either empty or at least 12 bytes long";
+ return createStringError(errc::invalid_argument, msg);
+ }
+ if (Data.size() % 4 != 0) {
+ std::string msg;
+ raw_string_ostream(msg)
+ << Name << " data size must be a multiple of 4 bytes";
+ return createStringError(errc::invalid_argument, msg);
+ }
+ ArrayRef<uint8_t> NameSize = Data.slice(0, 4);
+ ArrayRef<uint8_t> DescSize = Data.slice(4, 4);
+
+ uint32_t NameSizeValue = *reinterpret_cast<const uint32_t *>(NameSize.data());
+ uint32_t DescSizeValue = *reinterpret_cast<const uint32_t *>(DescSize.data());
+
+ if (Endianness != endianness::native) {
+ NameSizeValue = byteswap(NameSizeValue);
+ DescSizeValue = byteswap(DescSizeValue);
+ }
+ uint64_t ExpectedDataSize =
+ /*NameSize=*/4 + /*DescSize=*/4 + /*Type=*/4 +
+ /*Name=*/(NameSizeValue + 3) / 4 * 4 +
+ /*Desc=*/(DescSizeValue + 3) / 4 * 4;
----------------
serge-sans-paille wrote:
I made the alignment computation explicit through an helper function, does that look ok to you?
https://github.com/llvm/llvm-project/pull/90458
More information about the llvm-commits
mailing list