[llvm] [ObjectYAML][ELF] Report incorrect offset to generate notes (PR #118741)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 4 21:35:26 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-objectyaml
Author: Igor Kudrin (igorkudrin)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/118741.diff
2 Files Affected:
- (modified) llvm/lib/ObjectYAML/ELFEmitter.cpp (+8-1)
- (modified) llvm/test/tools/yaml2obj/ELF/note-section.yaml (+55)
``````````diff
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: []
``````````
</details>
https://github.com/llvm/llvm-project/pull/118741
More information about the llvm-commits
mailing list