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
20 changes: 18 additions & 2 deletions llvm/lib/ObjectYAML/ELFEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1799,6 +1799,21 @@ 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));
return;
}

uint64_t Offset = CBA.tell();
for (const ELFYAML::NoteEntry &NE : *Section.Notes) {
// Write name size.
Expand All @@ -1820,14 +1835,15 @@ 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);
}

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

CBA.padToAlignment(Align);
}

SHeader.sh_size = CBA.tell() - Offset;
Expand Down
129 changes: 129 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,132 @@ 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 --notes - | \
# 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 00000000 03000000 |................|
# TEST17-NEXT: 0020: 02000000 03040500 04000000 00000000 |................|
# TEST17-NEXT: 0030: 03000000 474E5500 |....GNU.|
# 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: 00000000 03000000 02000000 00000000 |................|
# TEST17-NEXT: 0030: 03040500 00000000 04000000 00000000 |................|
# TEST17-NEXT: 0040: 03000000 474E5500 |....GNU.|
# TEST17-NEXT: )
# TEST17: NoteSections [
# TEST17-NEXT: NoteSection {
# TEST17-NEXT: Name: .note.foo4
# TEST17-NEXT: Offset:
# TEST17-NEXT: Size:
# TEST17-NEXT: Notes [
# TEST17-NEXT: {
# TEST17-NEXT: Owner: ABCD
# TEST17-NEXT: Data size: 0x2
# TEST17-NEXT: Type: NT_VERSION (version)
# TEST17-NEXT: Description data (
# TEST17-NEXT: 0000: 0102 |..|
# TEST17-NEXT: )
# TEST17-NEXT: }
# TEST17-NEXT: {
# TEST17-NEXT: Owner:
# TEST17-NEXT: Data size: 0x3
# TEST17-NEXT: Type: NT_ARCH (architecture)
# TEST17-NEXT: Description data (
# TEST17-NEXT: 0000: 030405 |...|
# TEST17-NEXT: )
# TEST17-NEXT: }
# TEST17-NEXT: {
# TEST17-NEXT: Owner: GNU
# TEST17-NEXT: Data size: 0x0
# TEST17-NEXT: Type: NT_GNU_BUILD_ID (unique build ID bitstring)
# TEST17-NEXT: Build ID:
# TEST17-NEXT: }
# TEST17-NEXT: ]
# TEST17-NEXT: }
# TEST17-NEXT: NoteSection {
# TEST17-NEXT: Name: .note.foo8
# TEST17-NEXT: Offset:
# TEST17-NEXT: Size:
# TEST17-NEXT: Notes [
# TEST17-NEXT: {
# TEST17-NEXT: Owner: ABCD
# TEST17-NEXT: Data size: 0x2
# TEST17-NEXT: Type: NT_VERSION (version)
# TEST17-NEXT: Description data (
# TEST17-NEXT: 0000: 0102 |..|
# TEST17-NEXT: )
# TEST17-NEXT: }
# TEST17-NEXT: {
# TEST17-NEXT: Owner:
# TEST17-NEXT: Data size: 0x3
# TEST17-NEXT: Type: NT_ARCH (architecture)
# TEST17-NEXT: Description data (
# TEST17-NEXT: 0000: 030405 |...|
# TEST17-NEXT: )
# TEST17-NEXT: }
# TEST17-NEXT: {
# TEST17-NEXT: Owner: GNU
# TEST17-NEXT: Data size: 0x0
# TEST17-NEXT: Type: NT_GNU_BUILD_ID (unique build ID bitstring)
# TEST17-NEXT: Build ID:
# TEST17-NEXT: }
# TEST17-NEXT: ]
# TEST17-NEXT: }
# TEST17-NEXT: ]

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