diff options
| -rw-r--r-- | lld/ELF/LinkerScript.cpp | 13 | ||||
| -rw-r--r-- | lld/ELF/OutputSections.cpp | 2 |
2 files changed, 11 insertions, 4 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index 2fa2ff433a0..15acaf01984 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -101,8 +101,12 @@ static void assignSymbol(SymbolAssignment *Cmd, typename ELFT::uint Dot = 0) { if (auto *Body = dyn_cast<DefinedSynthetic>(Cmd->Sym)) { Body->Section = Cmd->Expression.Section(); - if (Body->Section) - Body->Value = Cmd->Expression(Dot) - Body->Section->Addr; + if (Body->Section) { + uint64_t VA = 0; + if (Body->Section->Flags & SHF_ALLOC) + VA = Body->Section->Addr; + Body->Value = Cmd->Expression(Dot) - VA; + } return; } @@ -802,9 +806,12 @@ void LinkerScript<ELFT>::assignAddresses(std::vector<PhdrEntry> &Phdrs) { } uintX_t MinVA = std::numeric_limits<uintX_t>::max(); - for (OutputSectionBase *Sec : *OutputSections) + for (OutputSectionBase *Sec : *OutputSections) { if (Sec->Flags & SHF_ALLOC) MinVA = std::min<uint64_t>(MinVA, Sec->Addr); + else + Sec->Addr = 0; + } allocateHeaders<ELFT>(Phdrs, *OutputSections, MinVA); } diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index 6a8ab55b2d5..6de30447913 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -57,7 +57,7 @@ void OutputSectionBase::writeHeaderTo(typename ELFT::Shdr *Shdr) { Shdr->sh_flags = Flags; Shdr->sh_info = Info; Shdr->sh_link = Link; - Shdr->sh_addr = (Flags & SHF_ALLOC) ? Addr : 0; + Shdr->sh_addr = Addr; Shdr->sh_size = Size; Shdr->sh_name = ShName; } |

