[lld] 784f575 - [LLD][ELF][AArch64] .note.gnu.property sections should have alignment 8

Peter Smith via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 5 02:16:50 PST 2019


Author: Peter Smith
Date: 2019-12-05T10:11:31Z
New Revision: 784f57584fc3b582944d6786738738390e2b5f71

URL: https://github.com/llvm/llvm-project/commit/784f57584fc3b582944d6786738738390e2b5f71
DIFF: https://github.com/llvm/llvm-project/commit/784f57584fc3b582944d6786738738390e2b5f71.diff

LOG: [LLD][ELF][AArch64] .note.gnu.property sections should have alignment 8

The .note.gnu.property SHT_NOTE sections on AArch64 (a 64-bit target)
should have alignment 8 to more closely match the binutils implementation
where alignment is 4-bytes on 32-bit machines and 8-bytes on 64-bit
machines.

Previously LLD was using 4 for both 32-bit and 64-bit machines.

Differential Revision: https://reviews.llvm.org/D70962

Added: 
    lld/test/ELF/gnu-property-align-32.s
    lld/test/ELF/gnu-property-align.s

Modified: 
    lld/ELF/SyntheticSections.cpp
    lld/test/ELF/pt-gnu-property.s

Removed: 
    


################################################################################
diff  --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index 40cc92faf7bb..5bf7949dab53 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -298,8 +298,8 @@ static size_t getHashSize() {
 // 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
index 000000000000..8022a49d34c6
--- /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/gnu-property-align.s b/lld/test/ELF/gnu-property-align.s
new file mode 100644
index 000000000000..b109c09039a2
--- /dev/null
+++ b/lld/test/ELF/gnu-property-align.s
@@ -0,0 +1,42 @@
+# 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 -n %t | FileCheck %s
+
+## 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)
+# CHECK-NEXT: Flags [ (0x2)
+# CHECK-NEXT:   SHF_ALLOC (0x2)
+# CHECK-NEXT: ]
+# CHECK-NEXT: Address: 0x200190
+# CHECK-NEXT: Offset: 0x190
+# CHECK-NEXT: Size: 32
+# CHECK-NEXT: Link: 0
+# CHECK-NEXT: Info: 0
+# 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
+
+
+.section ".note.gnu.property", "a"
+.long 4
+.long 0x10
+.long 0x5
+.asciz "GNU"
+
+.long 0xc0000002 # GNU_PROPERTY_X86_FEATURE_1_AND
+.long 4
+.long 1          # GNU_PROPERTY_X86_FEATURE_1_IBT
+.long 0
+
+ .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
index 2f7a148123b5..5758967b0e0b 100644
--- 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


        


More information about the llvm-commits mailing list