[lld] r323625 - Put the header in the first PT_LOAD even if that PT_LOAD has a LMAExpr.

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 30 01:22:40 PST 2018


Merged to 6.0 along with dependents in r323733 (PR36136).

On Mon, Jan 29, 2018 at 4:44 AM, Rafael Espindola via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: rafael
> Date: Sun Jan 28 19:44:44 2018
> New Revision: 323625
>
> URL: http://llvm.org/viewvc/llvm-project?rev=323625&view=rev
> Log:
> Put the header in the first PT_LOAD even if that PT_LOAD has a LMAExpr.
>
> This should fix PR36017.
>
> The root problem is that we were creating a PT_LOAD just for the
> header. That was technically valid, but inconvenient: we should not be
> making the ELF discontinuous.
>
> The solution is to allow a section with LMAExpr to be added to a
> PT_LOAD if that PT_LOAD doesn't already have a LMAExpr.
>
> Added:
>     lld/trunk/test/ELF/linkerscript/merge-header-load.s
> Modified:
>     lld/trunk/ELF/Writer.cpp
>     lld/trunk/ELF/Writer.h
>
> Modified: lld/trunk/ELF/Writer.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.
> cpp?rev=323625&r1=323624&r2=323625&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/Writer.cpp (original)
> +++ lld/trunk/ELF/Writer.cpp Sun Jan 28 19:44:44 2018
> @@ -822,6 +822,8 @@ void PhdrEntry::add(OutputSection *Sec)
>    p_align = std::max(p_align, Sec->Alignment);
>    if (p_type == PT_LOAD)
>      Sec->PtLoad = this;
> +  if (Sec->LMAExpr)
> +    ASectionHasLMA = true;
>  }
>
>  // The beginning and the ending of .rel[a].plt section are marked
> @@ -1626,8 +1628,9 @@ template <class ELFT> std::vector<PhdrEn
>      // different flags or is loaded at a discontiguous address using AT
> linker
>      // script command.
>      uint64_t NewFlags = computeFlags(Sec->getPhdrFlags());
> -    if (Sec->LMAExpr || Sec->MemRegion != Load->FirstSec->MemRegion ||
> -        Flags != NewFlags) {
> +    if ((Sec->LMAExpr && Load->ASectionHasLMA) ||
> +        Sec->MemRegion != Load->FirstSec->MemRegion || Flags != NewFlags)
> {
> +
>        Load = AddHdr(PT_LOAD, NewFlags);
>        Flags = NewFlags;
>      }
>
> Modified: lld/trunk/ELF/Writer.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.
> h?rev=323625&r1=323624&r2=323625&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/Writer.h (original)
> +++ lld/trunk/ELF/Writer.h Sun Jan 28 19:44:44 2018
> @@ -44,6 +44,12 @@ struct PhdrEntry {
>    OutputSection *FirstSec = nullptr;
>    OutputSection *LastSec = nullptr;
>    bool HasLMA = false;
> +
> +  // True if one of the sections in this program header has a LMA
> specified via
> +  // linker script: AT(addr). We never allow 2 or more sections with LMA
> in the
> +  // same program header.
> +  bool ASectionHasLMA = false;
> +
>    uint64_t LMAOffset = 0;
>  };
>
>
> Added: lld/trunk/test/ELF/linkerscript/merge-header-load.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/
> linkerscript/merge-header-load.s?rev=323625&view=auto
> ============================================================
> ==================
> --- lld/trunk/test/ELF/linkerscript/merge-header-load.s (added)
> +++ lld/trunk/test/ELF/linkerscript/merge-header-load.s Sun Jan 28
> 19:44:44 2018
> @@ -0,0 +1,21 @@
> +# REQUIRES: x86
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
> +# RUN: echo "SECTIONS {                  \
> +# RUN:  . = 0xffffffff80000200;          \
> +# RUN:  .text : AT (0x4200) { *(.text) } \
> +# RUN: }" > %t.script
> +# RUN: ld.lld %t.o --script %t.script -o %t
> +# RUN: llvm-readelf -program-headers %t | FileCheck %s
> +
> +# Test that we put the header in the first PT_LOAD. We used to create a
> PT_LOAD
> +# just for it and it would have a different virtual to physical address
> delta.
> +
> +# CHECK: Program Headers:
> +# CHECK:      Type  Offset   VirtAddr           PhysAddr
> +# CHECK-NEXT: PHDR  0x000040 0xffffffff80000040 0x0000000000004040
> +# CHECK-NEXT: LOAD  0x000000 0xffffffff80000000 0x0000000000004000
> +# CHECK-NOT:  LOAD
> +
> +.global _start
> +_start:
> +nop
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180130/6427701b/attachment.html>


More information about the llvm-commits mailing list