[llvm] [ObjectYAML][ELF] Report incorrect offset to generate notes (PR #118741)
Igor Kudrin via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 4 21:35:03 PST 2024
https://github.com/igorkudrin created https://github.com/llvm/llvm-project/pull/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.
>From 729b634f6fa812e2055b63887f1273a5ac6376c3 Mon Sep 17 00:00:00 2001
From: Igor Kudrin <ikudrin at accesssoftek.com>
Date: Wed, 4 Dec 2024 18:58:06 -0800
Subject: [PATCH] [ObjectYAML][ELF] Report incorrect offset to generate notes
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.
---
llvm/lib/ObjectYAML/ELFEmitter.cpp | 9 ++-
.../test/tools/yaml2obj/ELF/note-section.yaml | 55 +++++++++++++++++++
2 files changed, 63 insertions(+), 1 deletion(-)
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..e48c323f594da6 100644
--- a/llvm/test/tools/yaml2obj/ELF/note-section.yaml
+++ b/llvm/test/tools/yaml2obj/ELF/note-section.yaml
@@ -514,3 +514,58 @@ 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: 0x{{.*}}, should be aligned to 4
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+Sections:
+ - Name: .dummy
+ Type: SHT_PROGBITS
+ Size: 1
+ - Name: .note
+ Type: SHT_NOTE
+ 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:
+# 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: .dummy
+ Type: SHT_PROGBITS
+ Size: 1
+ - Name: .note
+ Type: SHT_NOTE
+ AddressAlign: 5
+ Notes: []
More information about the llvm-commits
mailing list