Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -1999,11 +1999,12 @@ if (Config->ZWxneeded) AddHdr(PT_OPENBSD_WXNEEDED, PF_X); - // Create one PT_NOTE per a group of contiguous .note sections. + // Create one PT_NOTE per a group of contiguous SHT_NOTE sections with the + // same alignment. PhdrEntry *Note = nullptr; for (OutputSection *Sec : OutputSections) { if (Sec->Type == SHT_NOTE && (Sec->Flags & SHF_ALLOC)) { - if (!Note || Sec->LMAExpr) + if (!Note || Sec->LMAExpr || Note->LastSec->Alignment != Sec->Alignment) Note = AddHdr(PT_NOTE, PF_R); Note->add(Sec); } else { Index: test/ELF/build-id.s =================================================================== --- test/ELF/build-id.s +++ test/ELF/build-id.s @@ -65,15 +65,15 @@ # DEFAULT: Contents of section .note.test: # DEFAULT: Contents of section .note.gnu.build-id: # DEFAULT-NEXT: 04000000 08000000 03000000 474e5500 ............GNU. -# DEFAULT-NEXT: 894c04e8 fbf5556b +# DEFAULT-NEXT: 95849665 2621c734 # MD5: Contents of section .note.gnu.build-id: # MD5-NEXT: 04000000 10000000 03000000 474e5500 ............GNU. -# MD5-NEXT: 6a51bbd7 9e8ee3f9 2e02d213 711cfec9 +# MD5-NEXT: 1882c01f 71698eed 229b3994 eb554c80 # SHA1: Contents of section .note.gnu.build-id: # SHA1-NEXT: 04000000 14000000 03000000 474e5500 ............GNU. -# SHA1-NEXT: 9a8618b1 d6fd0e5c eda73dd8 76de5596 +# SHA1-NEXT: 96820adf d90d5470 0a0c32ff a88c4017 # UUID: Contents of section .note.gnu.build-id: # UUID-NEXT: 04000000 10000000 03000000 474e5500 ............GNU. Index: test/ELF/note-alignment.s =================================================================== --- test/ELF/note-alignment.s +++ test/ELF/note-alignment.s @@ -0,0 +1,36 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o +# RUN: ld.lld %t.o -o %t +# RUN: llvm-readelf -l %t | FileCheck %s + +# Check that we don't mix 4-byte and 8-byte aligned notes in one PT_LOAD. +# The possible 4-byte padding before the 8-byte align note may make consumers +# fail to parse it. + +# CHECK: NOTE {{0x[0-9a-f]+}} {{0x[0-9a-f]+}} {{0x[0-9a-f]+}} 0x000004 0x000004 R 0x4 +# CHECK: NOTE {{0x[0-9a-f]+}} {{0x[0-9a-f]+}} {{0x[0-9a-f]+}} 0x000010 0x000010 R 0x8 +# CHECK: NOTE {{0x[0-9a-f]+}} {{0x[0-9a-f]+}} {{0x[0-9a-f]+}} 0x000008 0x000008 R 0x4 + +# CHECK: 03 .note.a +# CHECK-NEXT: 04 .note.b .note.c +# CHECK-NEXT: 05 .note.d .note.e + +.section .note.a, "a", @note +.align 4 +.long 0 + +.section .note.b, "a", @note +.align 8 +.quad 0 + +.section .note.c, "a", @note +.align 8 +.quad 0 + +.section .note.d, "a", @note +.align 4 +.long 0 + +.section .note.e, "a", @note +.align 4 +.long 0