[PATCH] D25774: [ELF] Linkerscript: don't add program headers to segment when we have PHDRS directive but don't have FILEHDR and PHDRS attributes for segment
Eugene Leviant via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 20 02:48:38 PDT 2016
This revision was automatically updated to reflect the committed changes.
Closed by commit rL284709: Don't include PHDRs if linker script doesn't want them (authored by evgeny777).
Changed prior to commit:
https://reviews.llvm.org/D25774?vs=75156&id=75274#toc
Repository:
rL LLVM
https://reviews.llvm.org/D25774
Files:
lld/trunk/ELF/LinkerScript.cpp
lld/trunk/test/ELF/linkerscript/phdrs.s
Index: lld/trunk/ELF/LinkerScript.cpp
===================================================================
--- lld/trunk/ELF/LinkerScript.cpp
+++ lld/trunk/ELF/LinkerScript.cpp
@@ -652,7 +652,16 @@
std::find_if(Phdrs.begin(), Phdrs.end(), [](const PhdrEntry<ELFT> &E) {
return E.H.p_type == PT_LOAD;
});
+
if (HeaderSize <= MinVA && FirstPTLoad != Phdrs.end()) {
+ // If linker script specifies program headers and first PT_LOAD doesn't
+ // have both PHDRS and FILEHDR attributes then do nothing
+ if (!Opt.PhdrsCommands.empty()) {
+ size_t SegNum = std::distance(Phdrs.begin(), FirstPTLoad);
+ if (!Opt.PhdrsCommands[SegNum].HasPhdrs ||
+ !Opt.PhdrsCommands[SegNum].HasFilehdr)
+ return;
+ }
// ELF and Program headers need to be right before the first section in
// memory. Set their addresses accordingly.
MinVA = alignDown(MinVA - HeaderSize, Target->PageSize);
Index: lld/trunk/test/ELF/linkerscript/phdrs.s
===================================================================
--- lld/trunk/test/ELF/linkerscript/phdrs.s
+++ lld/trunk/test/ELF/linkerscript/phdrs.s
@@ -9,6 +9,17 @@
# RUN: ld.lld -o %t1 --script %t.script %t
# RUN: llvm-readobj -program-headers %t1 | FileCheck %s
+## Check that program headers are not written, unless we explicitly tell
+## lld to do this.
+# RUN: echo "PHDRS {all PT_LOAD;} \
+# RUN: SECTIONS { \
+# RUN: . = 0x10000200; \
+# RUN: /DISCARD/ : {*(.text*)} \
+# RUN: .foo : {*(.foo.*)} :all \
+# RUN: }" > %t.script
+# RUN: ld.lld -o %t1 --script %t.script %t
+# RUN: llvm-readobj -program-headers %t1 | FileCheck --check-prefix=NOPHDR %s
+
## Check the AT(expr)
# RUN: echo "PHDRS {all PT_LOAD FILEHDR PHDRS AT(0x500 + 0x500) ;} \
# RUN: SECTIONS { \
@@ -42,6 +53,22 @@
# CHECK-NEXT: PF_X (0x1)
# CHECK-NEXT: ]
+# NOPHDR: ProgramHeaders [
+# NOPHDR-NEXT: ProgramHeader {
+# NOPHDR-NEXT: Type: PT_LOAD (0x1)
+# NOPHDR-NEXT: Offset: 0x200
+# NOPHDR-NEXT: VirtualAddress: 0x10000200
+# NOPHDR-NEXT: PhysicalAddress: 0x10000200
+# NOPHDR-NEXT: FileSize: 8
+# NOPHDR-NEXT: MemSize: 8
+# NOPHDR-NEXT: Flags [ (0x6)
+# NOPHDR-NEXT: PF_R (0x4)
+# NOPHDR-NEXT: PF_W (0x2)
+# NOPHDR-NEXT: ]
+# NOPHDR-NEXT: Alignment: 4096
+# NOPHDR-NEXT: }
+# NOPHDR-NEXT: ]
+
# AT: ProgramHeaders [
# AT-NEXT: ProgramHeader {
# AT-NEXT: Type: PT_LOAD (0x1)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D25774.75274.patch
Type: text/x-patch
Size: 2479 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161020/01711dae/attachment.bin>
More information about the llvm-commits
mailing list