diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp index 5daf6c32ec936..cc41bbe6bbde2 100644 --- a/llvm/lib/ObjectYAML/ELFEmitter.cpp +++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp @@ -1796,7 +1796,7 @@ template void ELFState::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::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 10fd36fefeabf..944e158f4ffa9 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: []