diff options
-rw-r--r-- | lld/ELF/LinkerScript.cpp | 23 | ||||
-rw-r--r-- | lld/ELF/LinkerScript.h | 4 | ||||
-rw-r--r-- | lld/ELF/Writer.cpp | 3 |
3 files changed, 13 insertions, 17 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index 6d237ea526c..9b542c21f8a 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -783,10 +783,14 @@ void LinkerScript::processNonSectionCommands() { } } -static void -allocateHeaders(std::vector<PhdrEntry> &Phdrs, - ArrayRef<OutputSectionCommand *> OutputSectionCommands, - uint64_t Min) { +void LinkerScript::allocateHeaders(std::vector<PhdrEntry> &Phdrs) { + uint64_t Min = std::numeric_limits<uint64_t>::max(); + for (OutputSectionCommand *Cmd : OutputSectionCommands) { + OutputSection *Sec = Cmd->Sec; + if (Sec->Flags & SHF_ALLOC) + Min = std::min<uint64_t>(Min, Sec->Addr); + } + auto FirstPTLoad = llvm::find_if( Phdrs, [](const PhdrEntry &E) { return E.p_type == PT_LOAD; }); if (FirstPTLoad == Phdrs.end()) @@ -826,7 +830,7 @@ allocateHeaders(std::vector<PhdrEntry> &Phdrs, Phdrs.erase(PhdrI); } -void LinkerScript::assignAddresses(std::vector<PhdrEntry> &Phdrs) { +void LinkerScript::assignAddresses() { // Assign addresses as instructed by linker script SECTIONS sub-commands. Dot = 0; ErrorOnMissingSection = true; @@ -846,15 +850,6 @@ void LinkerScript::assignAddresses(std::vector<PhdrEntry> &Phdrs) { auto *Cmd = cast<OutputSectionCommand>(Base); assignOffsets(Cmd); } - - uint64_t MinVA = std::numeric_limits<uint64_t>::max(); - for (OutputSectionCommand *Cmd : OutputSectionCommands) { - OutputSection *Sec = Cmd->Sec; - if (Sec->Flags & SHF_ALLOC) - MinVA = std::min<uint64_t>(MinVA, Sec->Addr); - } - - allocateHeaders(Phdrs, OutputSectionCommands, MinVA); } // Creates program headers as instructed by PHDRS linker script command. diff --git a/lld/ELF/LinkerScript.h b/lld/ELF/LinkerScript.h index f8a34a1e97d..f489e928f4d 100644 --- a/lld/ELF/LinkerScript.h +++ b/lld/ELF/LinkerScript.h @@ -281,8 +281,8 @@ public: void assignOffsets(OutputSectionCommand *Cmd); void createOrphanCommands(); void processNonSectionCommands(); - void assignAddresses(std::vector<PhdrEntry> &Phdrs); - + void assignAddresses(); + void allocateHeaders(std::vector<PhdrEntry> &Phdrs); void addSymbol(SymbolAssignment *Cmd); void processCommands(OutputSectionFactory &Factory); diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index bc5f7676b99..60aaa8e7f92 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -217,7 +217,8 @@ template <class ELFT> void Writer<ELFT>::run() { OutputSectionCommands.begin(), OutputSectionCommands.end(), [](OutputSectionCommand *Cmd) { Cmd->maybeCompress<ELFT>(); }); - Script->assignAddresses(Phdrs); + Script->assignAddresses(); + Script->allocateHeaders(Phdrs); // Remove empty PT_LOAD to avoid causing the dynamic linker to try to mmap a // 0 sized region. This has to be done late since only after assignAddresses |