[llvm] ba37309 - [ObjectYAML][ELF] Report incorrect offset to generate notes (#118741)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 23 13:21:38 PST 2024
Author: Igor Kudrin
Date: 2024-12-23T13:21:35-08:00
New Revision: ba373096e8ac83a7136fc44bc4e71a7bc53417a6
URL: https://github.com/llvm/llvm-project/commit/ba373096e8ac83a7136fc44bc4e71a7bc53417a6
DIFF: https://github.com/llvm/llvm-project/commit/ba373096e8ac83a7136fc44bc4e71a7bc53417a6.diff
LOG: [ObjectYAML][ELF] Report incorrect offset to generate notes (#118741)
All notes in the note section must be correctly aligned, including the
first. The tool should refuse to generate notes if the section offset is
incorrect in this respect.
Added:
Modified:
llvm/lib/ObjectYAML/ELFEmitter.cpp
llvm/test/tools/yaml2obj/ELF/note-section.yaml
Removed:
################################################################################
diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp
index 5daf6c32ec936a..cc41bbe6bbde24 100644
--- a/llvm/lib/ObjectYAML/ELFEmitter.cpp
+++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp
@@ -1796,7 +1796,7 @@ template <class ELFT>
void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
const ELFYAML::NoteSection &Section,
ContiguousBlobAccumulator &CBA) {
- if (!Section.Notes)
+ if (!Section.Notes || Section.Notes->empty())
return;
unsigned Align;
@@ -1814,6 +1814,13 @@ void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
return;
}
+ if (CBA.getOffset() != alignTo(CBA.getOffset(), Align)) {
+ reportError(Section.Name + ": invalid offset of a note section: 0x" +
+ Twine::utohexstr(CBA.getOffset()) + ", should be aligned to " +
+ Twine(Align));
+ return;
+ }
+
uint64_t Offset = CBA.tell();
for (const ELFYAML::NoteEntry &NE : *Section.Notes) {
// Write name size.
diff --git a/llvm/test/tools/yaml2obj/ELF/note-section.yaml b/llvm/test/tools/yaml2obj/ELF/note-section.yaml
index 10fd36fefeabfd..944e158f4ffa93 100644
--- a/llvm/test/tools/yaml2obj/ELF/note-section.yaml
+++ b/llvm/test/tools/yaml2obj/ELF/note-section.yaml
@@ -514,3 +514,54 @@ Sections:
Desc: 030405
- Name: GNU
Type: NT_GNU_BUILD_ID
+
+## Check that an incorrect offset for generating notes is reported.
+
+# RUN: not yaml2obj --docnum=19 %s 2>&1 | FileCheck %s --check-prefix=ERR_OFFSET
+# ERR_OFFSET: error: .note: invalid offset of a note section: 0x501, should be aligned to 4
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+Sections:
+ - Name: .note
+ Type: SHT_NOTE
+ Offset: 0x501
+ Notes:
+ - Type: 0x1
+
+## Do not issue an error if the notes array is empty.
+
+# RUN: yaml2obj --docnum=20 %s -o - | \
+# RUN: llvm-readobj --sections --section-data - | \
+# RUN: FileCheck %s --check-prefix=TEST20
+
+# TEST20: Section {
+# TEST20: Name: .note
+# TEST20-NEXT: Type: SHT_NOTE
+# TEST20-NEXT: Flags [ (0x0)
+# TEST20-NEXT: ]
+# TEST20-NEXT: Address:
+# TEST20-NEXT: Offset: 0x501
+# TEST20-NEXT: Size: 0
+# TEST20-NEXT: Link:
+# TEST20-NEXT: Info:
+# TEST20-NEXT: AddressAlignment: 5
+# TEST20-NEXT: EntrySize:
+# TEST20-NEXT: SectionData (
+# TEST20-NEXT: )
+# TEST20-NEXT: }
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+Sections:
+ - Name: .note
+ Type: SHT_NOTE
+ Offset: 0x501
+ AddressAlign: 5
+ Notes: []
More information about the llvm-commits
mailing list