[PATCH] D79286: [ELF] Move SHF_LINK_ORDER till OutputSection addresses are known
Peter Smith via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sat May 2 05:16:10 PDT 2020
psmith updated this revision to Diff 261632.
psmith added a comment.
Add context to diff
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D79286/new/
https://reviews.llvm.org/D79286
Files:
lld/ELF/Writer.cpp
lld/test/ELF/linkorder-script.s
Index: lld/test/ELF/linkorder-script.s
===================================================================
--- /dev/null
+++ lld/test/ELF/linkorder-script.s
@@ -0,0 +1,32 @@
+// REQUIRES: x86
+// RUN: llvm-mc --triple=x86_64 -filetype=obj %s -o %t.o
+// RUN: echo "SECTIONS { \
+// RUN: . = 0x80000000; \
+// RUN: .linkorder : { *(.linkorder.*) } \
+// RUN: .text : { *(.text) } \
+// RUN: .text.1 0x80000200 : AT(0x1000) { *(.text.1) } \
+// RUN: .text.2 0x80000100 : AT(0x2000) { *(.text.2) } \
+// RUN: } " > %t.script
+// RUN: ld.lld --script %t.script %t.o -o %t
+// RUN: llvm-readobj -x .linkorder %t | FileCheck %s
+
+/// When a linker script does not have monotonically increasing addresses
+/// the SHF_LINK_ORDER sections should still be in monotonically increasing
+/// order.
+
+// CHECK: Hex dump of section '.linkorder':
+// CHECK-NEXT: 0x80000000 02000000 00000000 01000000 00000000
+
+.section .text.1, "ax", %progbits
+.global _start
+_start:
+.quad 0
+
+.section .text.2, "ax", %progbits
+.quad 0
+
+.section .linkorder.1, "ao", %progbits, .text.1
+.quad 1
+
+.section .linkorder.2, "ao", %progbits, .text.2
+.quad 2
Index: lld/ELF/Writer.cpp
===================================================================
--- lld/ELF/Writer.cpp
+++ lld/ELF/Writer.cpp
@@ -1596,7 +1596,7 @@
OutputSection *bOut = lb->getParent();
if (aOut != bOut)
- return aOut->sectionIndex < bOut->sectionIndex;
+ return aOut->addr < bOut->addr;
return la->outSecOff < lb->outSecOff;
}
@@ -1666,11 +1666,13 @@
AArch64Err843419Patcher a64p;
ARMErr657417Patcher a32p;
script->assignAddresses();
- // .ARM.exidx does not require precise addresses, but it does require the
- // relative addresses of OutputSections because linker scripts can assign
- // Virtual Addresses to OutputSections that are not monotonically increasing.
+ // .ARM.exidx and SHF_LINK_ORDER do not require precise addresses, but they
+ // do require the relative addresses of OutputSections because linker scripts
+ // can assign Virtual Addresses to OutputSections that are not monotonically
+ // increasing.
for (Partition &part : partitions)
finalizeSynthetic(part.armExidx);
+ resolveShfLinkOrder();
// Converts call x at GDPLT to call __tls_get_addr
if (config->emachine == EM_HEXAGON)
@@ -2104,12 +2106,6 @@
if (!script->hasSectionsCommand && !config->relocatable)
fixSectionAlignments();
- // SHFLinkOrder processing must be processed after relative section placements are
- // known but before addresses are allocated.
- resolveShfLinkOrder();
- if (errorCount())
- return;
-
// This is used to:
// 1) Create "thunks":
// Jump instructions in many ISAs have small displacements, and therefore
@@ -2132,8 +2128,11 @@
// sometimes using forward symbol declarations. We want to set the correct
// values. They also might change after adding the thunks.
finalizeAddressDependentContent();
+ if (errorCount())
+ return;
- // finalizeAddressDependentContent may have added local symbols to the static symbol table.
+ // finalizeAddressDependentContent may have added local symbols to the static
+ // symbol table.
finalizeSynthetic(in.symTab);
finalizeSynthetic(in.ppc64LongBranchTarget);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D79286.261632.patch
Type: text/x-patch
Size: 3304 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200502/fe0d48dc/attachment.bin>
More information about the llvm-commits
mailing list