Don't include PHDRs if linker script doesn't want them
This script below shouldn't include file and program headers
to PT_LOAD segment, because it doesn't have PHDRS and FILEHDR
attributes:
PHDRS { all PT_LOAD; }
SECTIONS { /* list of sections here */ }
Differential revision: https://reviews.llvm.org/D25774
llvm-svn: 284709
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index b1462e0..ba8bb4c 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/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);