[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