diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -298,8 +298,8 @@ // sets is empty, or some input files didn't have .note.gnu.property sections), // we don't create this section. GnuPropertySection::GnuPropertySection() - : SyntheticSection(llvm::ELF::SHF_ALLOC, llvm::ELF::SHT_NOTE, 4, - ".note.gnu.property") {} + : SyntheticSection(llvm::ELF::SHF_ALLOC, llvm::ELF::SHT_NOTE, + config->wordsize, ".note.gnu.property") {} void GnuPropertySection::writeTo(uint8_t *buf) { uint32_t featureAndType = config->emachine == EM_AARCH64 diff --git a/lld/test/ELF/gnu-property-align-32.s b/lld/test/ELF/gnu-property-align-32.s new file mode 100644 --- /dev/null +++ b/lld/test/ELF/gnu-property-align-32.s @@ -0,0 +1,40 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=i686-linux-gnu %s -o %t.o +# RUN: ld.lld %t.o -o %t +# RUN: llvm-readobj --sections -n %t | FileCheck %s + +## Check that .note.gnu.property has alignment 4 and is readable by llvm-readobj + +# CHECK: Name: .note.gnu.property +# CHECK-NEXT: Type: SHT_NOTE (0x7) +# CHECK-NEXT: Flags [ (0x2) +# CHECK-NEXT: SHF_ALLOC (0x2) +# CHECK-NEXT: ] +# CHECK-NEXT: Address: 0x4000F4 +# CHECK-NEXT: Offset: 0xF4 +# CHECK-NEXT: Size: 28 +# CHECK-NEXT: Link: 0 +# CHECK-NEXT: Info: 0 +# CHECK-NEXT: AddressAlignment: 4 + +# CHECK: Note { +# CHECK-NEXT: Owner: GNU +# CHECK-NEXT: Data size: 0xC +# CHECK-NEXT: Type: NT_GNU_PROPERTY_TYPE_0 (property note) +# CHECK-NEXT: Property [ +# CHECK-NEXT: x86 feature: IBT + +.section ".note.gnu.property", "a" +.p2align 2 +.long 4 +.long 0xc +.long 0x5 +.asciz "GNU" +.p2align 2 +.long 0xc0000002 # GNU_PROPERTY_X86_FEATURE_1_AND +.long 4 +.long 1 # GNU_PROPERTY_X86_FEATURE_1_IBT + +.text +.globl _start + ret diff --git a/lld/test/ELF/pt-gnu-property.s b/lld/test/ELF/gnu-property-align.s copy from lld/test/ELF/pt-gnu-property.s copy to lld/test/ELF/gnu-property-align.s --- a/lld/test/ELF/pt-gnu-property.s +++ b/lld/test/ELF/gnu-property-align.s @@ -1,10 +1,9 @@ # REQUIRES: x86 # RUN: llvm-mc -filetype=obj -triple=x86_64-linux-gnu %s -o %t.o # RUN: ld.lld %t.o -o %t -# RUN: llvm-readobj --sections --program-headers %t | FileCheck %s +# RUN: llvm-readobj --sections -n %t | FileCheck %s -## Test that we generate the PT_GNU_PROPERTY segment type that describes the -## .note.gnu.property if it is present. +## Check that .note.gnu.property has alignment 8 and is readable by llvm-readobj # CHECK: Name: .note.gnu.property # CHECK-NEXT: Type: SHT_NOTE (0x7) @@ -16,18 +15,15 @@ # CHECK-NEXT: Size: 32 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 -# CHECK-NEXT: AddressAlignment: 4 +# CHECK-NEXT: AddressAlignment: 8 + +# CHECK: Note { +# CHECK-NEXT: Owner: GNU +# CHECK-NEXT: Data size: 0x10 +# CHECK-NEXT: Type: NT_GNU_PROPERTY_TYPE_0 (property note) +# CHECK-NEXT: Property [ +# CHECK-NEXT: x86 feature: IBT -# CHECK: Type: PT_GNU_PROPERTY (0x6474E553) -# CHECK-NEXT: Offset: 0x190 -# CHECK-NEXT: VirtualAddress: 0x200190 -# CHECK-NEXT: PhysicalAddress: 0x200190 -# CHECK-NEXT: FileSize: 32 -# CHECK-NEXT: MemSize: 32 -# CHECK-NEXT: Flags [ (0x4) -# CHECK-NEXT: PF_R (0x4) -# CHECK-NEXT: ] -# CHECK-NEXT: Alignment: 4 .section ".note.gnu.property", "a" .long 4 @@ -40,6 +36,7 @@ .long 1 # GNU_PROPERTY_X86_FEATURE_1_IBT .long 0 -.text -.globl _start - ret + .text + .globl _start + .type _start, %function +_start: ret diff --git a/lld/test/ELF/pt-gnu-property.s b/lld/test/ELF/pt-gnu-property.s --- a/lld/test/ELF/pt-gnu-property.s +++ b/lld/test/ELF/pt-gnu-property.s @@ -16,7 +16,7 @@ # CHECK-NEXT: Size: 32 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 -# CHECK-NEXT: AddressAlignment: 4 +# CHECK-NEXT: AddressAlignment: 8 # CHECK: Type: PT_GNU_PROPERTY (0x6474E553) # CHECK-NEXT: Offset: 0x190 @@ -27,7 +27,7 @@ # CHECK-NEXT: Flags [ (0x4) # CHECK-NEXT: PF_R (0x4) # CHECK-NEXT: ] -# CHECK-NEXT: Alignment: 4 +# CHECK-NEXT: Alignment: 8 .section ".note.gnu.property", "a" .long 4