Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 16 additions & 2 deletions llvm/lib/ObjectYAML/ELFEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1799,6 +1799,20 @@ void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
if (!Section.Notes)
return;

unsigned Align;
switch (SHeader.sh_addralign) {
case 0:
case 4:
Align = 4;
break;
case 8:
Align = 8;
break;
default:
reportError(Section.Name + ": invalid alignment for a note section: 0x" +
Twine::utohexstr(SHeader.sh_addralign));
}

uint64_t Offset = CBA.tell();
for (const ELFYAML::NoteEntry &NE : *Section.Notes) {
// Write name size.
Expand All @@ -1820,13 +1834,13 @@ void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
if (!NE.Name.empty()) {
CBA.write(NE.Name.data(), NE.Name.size());
CBA.write('\0');
CBA.padToAlignment(4);
CBA.padToAlignment(Align);
}

// Write description and padding.
if (NE.Desc.binary_size() != 0) {
CBA.writeAsBinary(NE.Desc);
CBA.padToAlignment(4);
CBA.padToAlignment(Align);
}
}

Expand Down
71 changes: 71 additions & 0 deletions llvm/test/tools/yaml2obj/ELF/note-section.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -333,3 +333,74 @@ Sections:
- Name: ABC
Desc: '123456'
Type: NT_VERSION

## Check that an incorrect alignment is reported

# RUN: not yaml2obj --docnum=16 %s 2>&1 | FileCheck %s --check-prefix=ERR_ALIGN1
# ERR_ALIGN1: error: .note.foo: invalid alignment for a note section: 0x1

--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Sections:
- Name: .note.foo
Type: SHT_NOTE
AddressAlign: 1
Notes:
- Type: 0x1

## Check that note entries and their `Desc` fields are aligned according to the
## specified section alignment

# RUN: yaml2obj --docnum=17 %s -o - | \
# RUN: llvm-readobj --sections --section-data - | \
# RUN: FileCheck %s --check-prefix=TEST17

# TEST17: Name: .note.foo4
# TEST17: SectionData (
# TEST17-NEXT: 0000: 05000000 02000000 01000000 41424344 |............ABCD|
# TEST17-NEXT: 0010: 00000000 01020000 03000000 03000000 |................|
# TEST17-NEXT: 0020: 02000000 41420000 03040500 03000000 |....AB..........|
# TEST17-NEXT: 0030: 00000000 03000000 41420000 |........AB..|
# TEST17-NEXT: )
# TEST17: Name: .note.foo8
# TEST17: SectionData (
# TEST17-NEXT: 0000: 05000000 02000000 01000000 41424344 |............ABCD|
# TEST17-NEXT: 0010: 00000000 00000000 01020000 00000000 |................|
# TEST17-NEXT: 0020: 03000000 03000000 02000000 41420000 |............AB..|
# TEST17-NEXT: 0030: 03040500 00000000 03000000 00000000 |................|
# TEST17-NEXT: 0040: 03000000 41420000 |....AB..|
# TEST17-NEXT: )

--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Sections:
- Name: .note.foo4
Type: SHT_NOTE
AddressAlign: 4
Notes:
- Name: ABCD
Desc: 0102
Type: NT_VERSION
- Name: AB
Desc: 030405
Type: NT_ARCH
- Name: AB
Type: NT_GNU_BUILD_ID
- Name: .note.foo8
Type: SHT_NOTE
AddressAlign: 8
Notes:
- Name: ABCD
Desc: 0102
Type: NT_VERSION
- Name: AB
Desc: 030405
Type: NT_ARCH
- Name: AB
Type: NT_GNU_BUILD_ID