[PATCH] D67032: [ELF] Align SHT_LLVM_PART_EHDR to a maximum page size boundary
Fangrui Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 30 22:12:56 PDT 2019
MaskRay created this revision.
MaskRay added reviewers: hans, pcc, rnk, ruiu, thakis.
Herald added subscribers: llvm-commits, arichardson, emaste.
Herald added a reviewer: espindola.
Herald added a reviewer: alexshap.
Herald added a project: LLVM.
MaskRay updated this revision to Diff 218204.
MaskRay added a comment.
Delete a stray line from the test
This is a speculative fix for https://bugs.chromium.org/p/chromium/issues/detail?id=998712
SHT_LLVM_PART_EHDR marks the start of a partition. The partition
sections will be extracted to a separate file. ELF header not at the
start will be weird, and we cannot benefit from overlapping p_offset
ranges with the previous segment anyway, so align to the next maximum
page size boundary.
It seems we lack some llvm-objcopy --extract-main-partition and
--extract-partition sanity checks. It may place EHDR at the start
even if p_offset if non zero. Anyway, the lld change is justified for
the reasons above.
Repository:
rLLD LLVM Linker
https://reviews.llvm.org/D67032
Files:
ELF/Writer.cpp
test/ELF/partitions.s
Index: test/ELF/partitions.s
===================================================================
--- test/ELF/partitions.s
+++ test/ELF/partitions.s
@@ -1,13 +1,20 @@
-// REQUIRES: x86
+// REQUIRES: aarch64, x86
// RUN: llvm-mc %s -o %t.o -filetype=obj --triple=x86_64-unknown-linux
+// RUN: ld.lld %t.o -o %t --export-dynamic --gc-sections -z max-page-size=65536
+// RUN: llvm-readelf -S -s %t | FileCheck %s
+
+// RUN: llvm-mc %s -o %t.o -filetype=obj --triple=aarch64
// RUN: ld.lld %t.o -o %t --export-dynamic --gc-sections
// RUN: llvm-readelf -S -s %t | FileCheck %s
// This is basically lld/docs/partitions.dot in object file form.
// Test that the sections are correctly allocated to partitions.
+// part1 and part2 should be aligned to a maximum page size boundary.
// CHECK: [[MAIN:[0-9]+]]] .text
+// CHECK: part1 LOOS+0xFFF4C06 {{[0-9a-f]+}}0000 {{[0-9a-f]+}}0000
// CHECK: [[P1:[0-9]+]]] .text
+// CHECK: part2 LOOS+0xFFF4C06 {{[0-9a-f]+}}0000 {{[0-9a-f]+}}0000
// CHECK: [[P2:[0-9]+]]] .text
// CHECK: Symbol table '.symtab'
@@ -30,21 +37,21 @@
.section .text._start,"ax", at progbits
.globl _start
_start:
-call f3
+.quad f3
.section .text.f1,"ax", at progbits
.globl f1
f1:
-call f3
-call f4
-call f5
+.quad f3
+.quad f4
+.quad f5
.section .text.f2,"ax", at progbits
.globl f2
f2:
-call f3
-call f5
-call f6
+.quad f3
+.quad f5
+.quad f6
.section .text.f3,"ax", at progbits
f3:
Index: ELF/Writer.cpp
===================================================================
--- ELF/Writer.cpp
+++ ELF/Writer.cpp
@@ -2223,13 +2223,21 @@
// the next maximum page size boundary on transitions between executable
// and non-executable segments.
//
+ // SHT_LLVM_PART_EHDR marks the start of a partition. The partition
+ // sections will be extracted to a separate file. ELF header not at the
+ // start will be weird, and we cannot benefit from overlapping p_offset
+ // ranges with the previous segment anyway, so align to the next maximum
+ // page size boundary.
+ //
// TODO Enable this technique on all targets.
bool enable = config->emachine != EM_HEXAGON &&
config->emachine != EM_MIPS &&
config->emachine != EM_X86_64;
- if (!enable || (config->zSeparateCode && prev &&
- (prev->p_flags & PF_X) != (p->p_flags & PF_X)))
+ if (!enable ||
+ (config->zSeparateCode && prev &&
+ (prev->p_flags & PF_X) != (p->p_flags & PF_X)) ||
+ cmd->type == SHT_LLVM_PART_EHDR)
cmd->addrExpr = [] {
return alignTo(script->getDot(), config->maxPageSize);
};
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D67032.218204.patch
Type: text/x-patch
Size: 2670 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190831/91bc8d2a/attachment.bin>
More information about the llvm-commits
mailing list