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

Peter Smith via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 3 06:13:22 PST 2019


peter.smith created this revision.
peter.smith added reviewers: MaskRay, ruiu, grimar.
Herald added subscribers: kristof.beyls, arichardson, emaste.
Herald added a reviewer: espindola.
Herald added a project: LLVM.

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.

There was a long discussion on the right alignment of the .note.gnu.property section on the binutils mailing list. The basic argument was that generic ELF requires 8-byte alignment for SHT_NOTES sections, however this hadn't been respected by other GNU notes sections. The implementation in GNU ld uses 8 and as there is no binary legacy of using 4 in LLD (BTI is only just being picked up and used) I'd like to keep LLD in line with GNU ld.

Depends on D70961 <https://reviews.llvm.org/D70961> as it updates a test added there.


https://reviews.llvm.org/D70962

Files:
  lld/ELF/SyntheticSections.cpp
  lld/test/ELF/aarch64-gnu-property-align.s
  lld/test/ELF/aarch64-pt-gnu-property.s


Index: lld/test/ELF/aarch64-pt-gnu-property.s
===================================================================
--- lld/test/ELF/aarch64-pt-gnu-property.s
+++ lld/test/ELF/aarch64-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
Index: lld/test/ELF/aarch64-gnu-property-align.s
===================================================================
--- /dev/null
+++ lld/test/ELF/aarch64-gnu-property-align.s
@@ -0,0 +1,42 @@
+# REQUIRES: aarch64
+# RUN: llvm-mc -filetype=obj -triple=aarch64-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:         aarch64 feature: BTI, PAC
+
+
+.section ".note.gnu.property", "a"
+.balign 8
+.long 4
+.long 0x10
+.long 0x5
+.asciz "GNU"
+.long 0xc0000000 // GNU_PROPERTY_AARCH64_FEATURE_1_AND
+.long 4
+.long 3          // GNU_PROPERTY_AARCH64_FEATURE_1_BTI and PAC
+.long 0
+
+ .text
+ .globl _start
+ .type _start, %function
+_start: ret
Index: lld/ELF/SyntheticSections.cpp
===================================================================
--- lld/ELF/SyntheticSections.cpp
+++ 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->is64 ? 8 : 4, ".note.gnu.property") {}
 
 void GnuPropertySection::writeTo(uint8_t *buf) {
   uint32_t featureAndType = config->emachine == EM_AARCH64


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D70962.231893.patch
Type: text/x-patch
Size: 2748 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191203/75ad4505/attachment.bin>


More information about the llvm-commits mailing list